यूएसबी डिवाइस तक पहुंच की अनुमति देने से पहले एंड्रॉइड को अनुमति के लिए कैसे रोकें


19

मेरे पास एक निहित नो-नेम एंड्रॉइड टैबलेट है जो ICS 4.0.3 पर चल रहा है, जो USB होस्ट मोड इंटरफेस के माध्यम से एक यूएसबी डिवाइस को नियंत्रित करता है। Android.hardware.usb.host.xml फ़ाइल / सिस्टम / आदि / अनुमतियों में मौजूद है और सब कुछ अद्भुत तरीके से काम करता है। के सिवाय...

जब मैं रिबूट के बाद पहली बार ऐप चलाता हूं और फिर यूएसबी डिवाइस में प्लग करता हूं तो मुझे एक पॉपअप विंडो मिलती है, जिसमें कहा जाता है कि "ऐप एपीपीएनएएमई को यूएसबी डिवाइस एक्सेस करने की अनुमति दें? [] इस यूएसबी डिवाइस के लिए डिफ़ॉल्ट रूप से उपयोग करें। रद्द करें OK"। डिवाइस का उपयोग शुरू करने से पहले मुझे ओके पर टैप करना होगा।

मुझे उपयोगकर्ता की पुष्टि बंद करने की आवश्यकता है ताकि ऐप सीधे डिवाइस का उपयोग कर सके। मैं यह कैसे करु? मैंने स्क्रीन पर बटन टैप करने वाले उपयोगकर्ता को अनुकरण करने के लिए कीपर जनरेटर का उपयोग करने के बारे में कुछ सुझाव दिए हैं, लेकिन मैं इस तरह के दृष्टिकोण से बचना चाहता हूं और चीजों को सेट करना चाहता हूं ताकि पुष्टि अनुरोध बस न हो।

मैं शायद मेरे लिए एक कस्टम कर्नेल बनाने के लिए आपूर्तिकर्ता को प्राप्त नहीं कर सकता, लेकिन मुझे उनसे फर्मवेयर हस्ताक्षर की कुंजी प्राप्त करने में सक्षम होना चाहिए ताकि मैं अपने ऐप को एक सिस्टम ऐप के रूप में साइन कर सकूं, अगर यह मदद करेगा।

एक संबद्ध समस्या: "इस USB डिवाइस के लिए डिफ़ॉल्ट रूप से उपयोग करें" बॉक्स को टिक करने से मदद नहीं मिलती है - अगर मैं डिवाइस को अनप्लग और रिप्लाई करता हूं तो मुझे फिर से पुष्टिकरण संकेत मिलता है। मैंने इस स्थिति में देखा है कि डिवाइस नंबर / देव / बस / usb / 001 में / हर बार जब मैं अनप्लग करता हूं और रिप्लेस करता हूं (001, 002, 003 आदि) जो शायद इस विशेष समस्या की व्याख्या करता है।


यदि आप एप्लिकेशन को सिस्टम / एप्लिकेशन में तैनात करते हैं तो क्या होगा? आप सिस्टम हस्ताक्षर के साथ और उसके बिना यह कोशिश कर सकते हैं। मैं इसे एक टिप्पणी के रूप में लिखता हूं क्योंकि (ए) मैंने इसकी कोशिश नहीं की है, और (बी) मुझे नहीं पता कि यह तैनाती मॉडल आपके लिए उपलब्ध है।
रोब प्रिधम

जवाबों:


10

यह सवाल और जवाब मूल रूप से
/programming//a/15151075/588476 का एक डुप्लिकेट है,
उदाहरण के कार्यक्रम के लिए उपरोक्त लिंक देखें और अधिक गहन चर्चा में।

जहाँ तक मुझे पता है, USB अनुमति बॉक्स पॉपअप प्राप्त करने के दो तरीके हैं:

  1. UsbManager.requestPermission (...) का उपयोग करके अपने आवेदन से स्पष्ट रूप से अनुमति का अनुरोध करें
  2. अपने गौण पर एक इरादे-फ़िल्टर को पंजीकृत करें और डिवाइस संलग्न होने पर सिस्टम से अनुमति मांगें

1 के मामले में मैंने पाया है कि अनुमति को याद रखने के लिए पॉपअप पर चेकबॉक्स का कोई प्रभाव नहीं है।

मेरे लिए, मैंने अपने सॉफ़्टवेयर से अनुमतियों से संबंधित सभी कोड हटा दिए और बस अपने इरादे में आशय-फ़िल्टर डाल दिया। जब USB डिवाइस प्लग-इन किया जाता है, अगर उसे पहले से अनुमति नहीं दी गई है तो USB अनुमति बॉक्स पॉपअप हो जाएगा। यदि उपयोगकर्ता याद बॉक्स को चेक किए बिना ओके पर क्लिक करता है, तो अगली बार डिवाइस कनेक्ट होने पर बॉक्स फिर से पॉपअप हो जाएगा। हालांकि अगर उपयोगकर्ता बॉक्स को चेक करता है और ओके दबाता है तो बॉक्स को फिर से कभी भी प्रदर्शित नहीं करना चाहिए (जब तक कि सॉफ्टवेयर अनइंस्टॉल नहीं किया जाता है और फिर से इंस्टॉल किया जाता है)।

मुझे यकीन नहीं है कि आपके डिवाइस से संबंधित एक बग कहीं है / देव / बस / usb / 001 और फिर 002 इत्यादि के रूप में दिखा रहा है - मुझे बताएं कि क्या आप आशय-फ़िल्टर का उपयोग कर रहे हैं, जैसे कि इसके बिना चेकबॉक्स याद होगा कुछ मत करो।

मुझे ऐसे किसी तरीके का पता नहीं है जिससे आप पूरी तरह से अनुमति पॉपअप से बच सकें। मुझे संदेह है कि आपके द्वारा कहे गए एंड्रॉइड कोड में खुदाई किए बिना ऐसा करने का कोई तरीका नहीं है।


1
क्या आपको यकीन है? मैं अभी भी अनुमति अनुरोध देख रहा हूं जब डिवाइस अनप्लग और फिर से कनेक्ट किया गया हो। यह व्यवहार developer.android.com/guide/topics/connectivity/usb/host.html में प्रलेखन के अनुरूप है । "एक आशय फ़िल्टर का उपयोग करना" अनुभाग कहता है "यदि उपयोगकर्ता स्वीकार करते हैं, तो आपके एप्लिकेशन को स्वचालित रूप से डिवाइस तक पहुंचने की अनुमति है जब तक कि डिवाइस डिस्कनेक्ट नहीं किया गया है"
kbro

मैं केवल नेक्सस 7, गैलेक्सी एस 3 और गैलेक्सी नोट के लिए ही वाउच कर सकता हूं, उन उपकरणों पर मुझे केवल एक बार अनुमति लेनी होगी (एंड्रॉइड डिवाइस होस्ट मोड में चल रहा है) - बशर्ते मैं निर्णय को याद रखने के लिए चेकबॉक्स को सक्षम करूं। आप Android का कौन सा उपकरण / संस्करण उपयोग कर रहे हैं, मुझे लगता है कि यह एक कस्टम / ओईएम डिवाइस है?
वेन उरोदा

यह WonderMedia WM8850- मध्य SOM पर आधारित एक OEM 7-इंच की टैबलेट है, जो एंड्रॉइड 4.0.3 के अपने स्वाद को चला रहा है।
मारब

आशय-फ़िल्टर वर्तमान बूट सत्र के लिए ही काम कर रहे हैं। हां मैं अपने फोन में एक USB डिवाइस प्लग करता हूं और यह स्वचालित रूप से अनुमति देता है
user924

7

अपनी टिप्पणी के आगे, मैंने अंतर्निहित एंड्रॉइड कोड पर एक नज़र डाली।

मेरे पास एक संभावित उत्तर है, लेकिन कम से कम चार प्रमुख चेतावनी और बाधाओं के साथ:

  1. मैंने इसे आज़माया नहीं है, क्योंकि मेरे पास कोई उपयुक्त USB डिवाइस नहीं है।
  2. आपको एक नई अनुमति चाहिए
  3. अनुमति के लिए आवश्यक है कि आप एक सिस्टम ऐप हैं
  4. कोड को सार्वजनिक API में नहीं कुछ तक पहुंच की आवश्यकता होती है

इस के बारे में भूल जाओ अगर आम बाजार के बाद क्षुधा की तैनाती!

पहली शर्त यह है कि आपके पास MANAGE_USBअनुमति है। यह यहाँ वर्णित है

हालाँकि, इसके लिए आवश्यक शर्तें हैं कि आप सिस्टम कुंजी के साथ हस्ताक्षर करते हैं, और आप अपने ऐप को / सिस्टम / ऐप में इंस्टॉल करते हैं।

वैसे भी, यदि आप इसके साथ ठीक हैं, तो यहाँ कुछ कोड है:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice पहले से डिवाइस है।

uidआपका अपना ऐप UID है और आप इसे देख सकते हैं। ऐसा करने का एक उदाहरण यहां पहला उत्तर है

सब अच्छा? नहीं ServiceManagerहै android.os.ServiceManagerऔर इस तरह एक सार्वजनिक एपीआई नहीं है। इस उदाहरण में, IUsbManagerसेवा पर अपने हाथों को प्राप्त करने का आपका तरीका है (अन्य मार्ग भी हो सकते हैं)। अब, चारों ओर हो रही है कि मेरा उत्तर के दायरे से बाहर है, पुराने दिनों में आप प्रतिबिंब का उपयोग कर सकते थे, लेकिन मुझे नहीं पता कि क्या आप अभी भी कर सकते हैं।

उन सभी shananigans के बाद, ऐसा लगता है कि आपको किसी भी अधिक अनुमति के लिए अनुरोध करने की आवश्यकता नहीं है, और यदि आप करते हैं, तो यह बिना किसी संवाद के तुरंत वापस आ जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.