यूएसबी ऐक्सेसरी की खास जानकारी

यूएसबी ऐक्सेसरी मोड से उपयोगकर्ता कनेक्ट कर सकते हैं यूएसबी होस्ट हार्डवेयर, जिसे खास तौर पर Android पर चलने वाले डिवाइसों के लिए डिज़ाइन किया गया है. ऐक्सेसरी को इन बातों का पालन करना चाहिए: Android ऐक्सेसरी प्रोटोकॉल के सभी चरणों को पूरा करना ज़रूरी है. इससे Android पर चलने वाले ऐसे डिवाइसों को अनुमति मिलती है जो यूएसबी होस्ट के तौर पर काम नहीं कर सकते, ताकि वे अब भी यूएसबी से इंटरैक्ट कर सकें हार्डवेयर. जब Android पर काम करने वाला कोई डिवाइस, यूएसबी ऐक्सेसरी मोड में होता है, तो अटैच की गई Android यूएसबी को ऐक्सेसरी, होस्ट के तौर पर काम करती है और यूएसबी बस को पावर सप्लाई करती है. साथ ही, यह कनेक्ट किए गए डिवाइसों की गिनती करती है. Android 3.1 (एपीआई लेवल 12) पर, यूएसबी ऐक्सेसरी मोड काम करता है. साथ ही, इस सुविधा को इस पर भी बैकपोर्ट किया जाता है Android 2.3.4 (एपीआई लेवल 10), ताकि ज़्यादा से ज़्यादा डिवाइसों पर सहायता मिल सके.

सही यूएसबी ऐक्सेसरी एपीआई चुनें

हालांकि, Android 3.1 में यूएसबी ऐक्सेसरी वाले एपीआई को प्लैटफ़ॉर्म में लाया गया था, लेकिन ये भी Google API ऐड-ऑन लाइब्रेरी का इस्तेमाल करके Android 2.3.4 में उपलब्ध है. क्योंकि ये एपीआई इसे बाहरी लाइब्रेरी का इस्तेमाल करके बैकपोर्ट किया जाता है. यूएसबी को चलाने के लिए, दो पैकेज इंपोर्ट किए जा सकते हैं ऐक्सेसरी मोड चालू करें. आप Android पर चलने वाले जिन डिवाइसों पर काम करना चाहते हैं उनके हिसाब से, आपको किसी एक का इस्तेमाल करें:

  • com.android.future.usb: Android 2.3.4 में, यूएसबी ऐक्सेसरी मोड के साथ काम करने के लिए, Google API ऐड-ऑन लाइब्रेरी में बैकपोर्ट किए गए यूएसबी ऐक्सेसरी एपीआई शामिल हैं और वे इसमें मौजूद हैं नेमस्पेस. Android 3.1 इस नेमस्पेस में क्लास को इंपोर्ट करने और कॉल करने की सुविधा भी देता है का इस्तेमाल ऐड-ऑन लाइब्रेरी पर लिखे गए ऐप्लिकेशन के लिए किया जा सकता है. यह ऐड-ऑन लाइब्रेरी एक थिन रैपर है यह सुविधा, android.hardware.usb ऐक्सेसरी एपीआई पर काम करती है. साथ ही, इसमें यूएसबी होस्ट मोड काम नहीं करता. अगर आपने अगर आपको यूएसबी ऐक्सेसरी मोड के साथ काम करने वाले ज़्यादा से ज़्यादा डिवाइसों को इस्तेमाल करना है, तो ऐड-ऑन का इस्तेमाल करें लाइब्रेरी पर जाकर यह पैकेज इंपोर्ट करें. यह ध्यान देना महत्वपूर्ण है कि सभी Android 2.3.4 डिवाइस यूएसबी ऐक्सेसरी वाली सुविधा के साथ काम करने के लिए ज़रूरी है. डिवाइस बनाने वाली हर कंपनी तय करती है कि यह सुविधा इस सुविधा के साथ काम करेगी या नहीं. इसलिए, आपको इसके बारे में अपने मेनिफ़ेस्ट में बताना होगा फ़ाइल से लिए जाते हैं.
  • android.hardware.usb: इस नेमस्पेस में यूएसबी के साथ काम करने वाली क्लास शामिल हैं Android 3.1 में एक्सेसरी मोड. यह पैकेज फ़्रेमवर्क API के हिस्से के तौर पर शामिल है, इसलिए Android 3.1, ऐड-ऑन लाइब्रेरी के बिना यूएसबी ऐक्सेसरी मोड पर काम करता है. इस पैकेज का इस्तेमाल करें अगर आपको सिर्फ़ Android 3.1 या उसके बाद के वर्शन वाले ऐसे डिवाइस चाहिए जिनमें यूएसबी के लिए हार्डवेयर की सुविधा है ऐक्सेसरी मोड चुनें, जिसका एलान अपनी मेनिफ़ेस्ट फ़ाइल में किया जा सकता है.

Google API ऐड-ऑन लाइब्रेरी इंस्टॉल करें

अगर आपको यह ऐड-ऑन इंस्टॉल करना है, तो Google API Android API 10 को इंस्टॉल करें पैकेज को SDK टूल मैनेजर के साथ कनेक्ट किया गया है. Google API इंस्टॉल करना ऐड-ऑन पर क्लिक करें.

एपीआई की खास जानकारी

ऐड-ऑन लाइब्रेरी, फ़्रेमवर्क एपीआई के लिए रैपर है. इसलिए, जो क्लास यूएसबी ऐक्सेसरी की सुविधा भी मिलती-जुलती है. ऐड-ऑन लाइब्रेरी का इस्तेमाल करने के बावजूद, android.hardware.usb के लिए रेफ़रंस दस्तावेज़ का इस्तेमाल किया जा सकता है.

ध्यान दें: हालांकि, प्लैटफ़ॉर्म का बहुत कम इस्तेमाल अंतर है, जिसके बारे में आपको पता होना चाहिए.

इस टेबल में उन क्लास के बारे में बताया गया है जिनमें यूएसबी ऐक्सेसरी एपीआई काम करते हैं:

कक्षा ब्यौरा
UsbManager कनेक्ट की गई यूएसबी ऐक्सेसरी की गिनती करने और उनके साथ इंटरैक्ट करने की सुविधा देता है.
UsbAccessory यह यूएसबी ऐक्सेसरी को दिखाता है. साथ ही, इसमें यूएसबी ऐक्सेसरी की पहचान करने वाले टूल को ऐक्सेस करने के तरीके शामिल होते हैं जानकारी.

ऐड-ऑन लाइब्रेरी और प्लैटफ़ॉर्म एपीआई के इस्तेमाल में अंतर

Google API ऐड-ऑन लाइब्रेरी और प्लैटफ़ॉर्म का इस्तेमाल करने के बीच, इस्तेमाल में दो अंतर हैं एपीआई.

अगर ऐड-ऑन लाइब्रेरी का इस्तेमाल किया जा रहा है, तो आपको UsbManager ऑब्जेक्ट इस तरीके से हासिल करना होगा:

Kotlin

val manager = UsbManager.getInstance(this)

Java

UsbManager manager = UsbManager.getInstance(this);

अगर ऐड-ऑन लाइब्रेरी का इस्तेमाल नहीं किया जा रहा है, तो आपको इस तरीके से UsbManager ऑब्जेक्ट हासिल करना होगा:

Kotlin

val manager = getSystemService(Context.USB_SERVICE) as UsbManager

Java

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

इंटेंट फ़िल्टर की मदद से, कनेक्ट की गई ऐक्सेसरी को फ़िल्टर करने पर, UsbAccessory ऑब्जेक्ट उस इंटेंट में शामिल होता है जिसे आपके का इस्तेमाल करें. अगर ऐड-ऑन लाइब्रेरी का इस्तेमाल किया जा रहा है, तो आपको UsbAccessory ऑब्जेक्ट इस तरीके से हासिल करना होगा:

Kotlin

val accessory = UsbManager.getAccessory(intent)

Java

UsbAccessory accessory = UsbManager.getAccessory(intent);

अगर ऐड-ऑन लाइब्रेरी का इस्तेमाल नहीं किया जा रहा है, तो आपको इस तरीके से UsbAccessory ऑब्जेक्ट हासिल करना होगा:

Kotlin

val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory

Java

UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

Android मेनिफ़ेस्ट की ज़रूरी शर्तें

नीचे दी गई सूची में यह बताया गया है कि आपको अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, पहले क्या जोड़ना होगा यूएसबी ऐक्सेसरी एपीआई के साथ काम करती है. मेनिफ़ेस्ट और संसाधन फ़ाइल उदाहरण में, इन आइटम का एलान करने का तरीका बताया गया है:

  • क्योंकि Android पर चलने वाले सभी डिवाइस, यूएसबी ऐक्सेसरी एपीआई के साथ काम करने की गारंटी नहीं देते, कोई <uses-feature> एलिमेंट शामिल करें, जो बताता है कि आपका ऐप्लिकेशन android.hardware.usb.accessory सुविधा.
  • अगर आप ऐड-ऑन लाइब्रेरी, बताए गए <uses-library> एलिमेंट को जोड़ें लाइब्रेरी के लिए com.android.future.usb.accessory.
  • अगर ऐड-ऑन लाइब्रेरी का इस्तेमाल किया जा रहा है, तो ऐप्लिकेशन के SDK टूल को एपीआई लेवल 10 पर सेट करें या 12, अगर आप android.hardware.usb पैकेज इस्तेमाल कर रहे हैं.
  • अगर आपको अपने ऐप्लिकेशन को अटैच की गई यूएसबी ऐक्सेसरी की सूचना चाहिए, तो इसके लिए <intent-filter> और <meta-data> एलिमेंट का जोड़ा आपकी मुख्य गतिविधि में android.hardware.usb.action.USB_ACCESSORY_ATTACHED इंटेंट. <meta-data> एलिमेंट, ऐसी बाहरी एक्सएमएल रिसॉर्स फ़ाइल पर ले जाता है जो उस ऐक्सेसरी की पहचान करने की जानकारी देता हो जिसकी आपको पहचान करनी है.

    एक्सएमएल रिसॉर्स फ़ाइल में, <usb-accessory> ऐसी ऐक्सेसरी जिन्हें आपको फ़िल्टर करना है. हर <usb-accessory> में ये एट्रिब्यूट दिखते हैं:

    • manufacturer
    • model
    • version

    version पर फ़िल्टर करने का सुझाव नहीं दिया जाता है. ऐक्सेसरी हो सकता है कि डिवाइस हमेशा वर्शन स्ट्रिंग (जान-बूझकर या अनजाने में) तय न करे. जब आपका ऐप्लिकेशन ऐक्सेसरी या डिवाइस के हिसाब से फ़िल्टर करने के लिए, वर्शन एट्रिब्यूट के बारे में बताता है वर्शन स्ट्रिंग तय नहीं करता है. इस वजह से NullPointerException Android के पुराने वर्शन पर काम करता है. यह समस्या Android 12 में ठीक कर दी गई है.

    संसाधन फ़ाइल को res/xml/ डायरेक्ट्री में सेव करें. संसाधन फ़ाइल का नाम (.xml एक्सटेंशन के बिना) वही होना चाहिए जो आपने <meta-data> एलिमेंट. एक्सएमएल संसाधन फ़ाइल का फ़ॉर्मैट इसमें भी दिखाया गया है नीचे दिया गया उदाहरण यहां दिया गया है.

मेनिफ़ेस्ट और रिसॉर्स फ़ाइल के उदाहरण

नीचे दिए गए उदाहरण में, मेनिफ़ेस्ट का एक सैंपल और उससे जुड़ी रिसॉर्स फ़ाइल दिखाई गई है:

<manifest ...>
    <uses-feature android:name="android.hardware.usb.accessory" />
    
    <uses-sdk android:minSdkVersion="<version>" />
    ...
    <application>
      <uses-library android:name="com.android.future.usb.accessory" />
        <activity ...>
            ...
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
            </intent-filter>

            <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                android:resource="@xml/accessory_filter" />
        </activity>
    </application>
</manifest>

इस स्थिति में, निम्न संसाधन फ़ाइल को res/xml/accessory_filter.xml और इससे पता चलता है कि ऐसी कोई भी ऐक्सेसरी जिसमें उनसे जुड़े मॉडल, मैन्युफ़ैक्चरर, और वर्शन को फ़िल्टर किया जाना चाहिए. ऐक्सेसरी इन्हें भेजती है Android-पावर्ड डिवाइस को एट्रिब्यूट करता है:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
</resources>

ऐक्सेसरी के साथ काम करें

जब उपयोगकर्ता यूएसबी ऐक्सेसरी को Android पर चलने वाले डिवाइस से कनेक्ट करते हैं, तो Android सिस्टम ये काम कर सकता है: तय करें कि आपके ऐप्लिकेशन की कनेक्ट की गई ऐक्सेसरी में रुचि है या नहीं. अगर ऐसा है, तो ऐक्सेसरी से संपर्क करने के लिए कहें. ऐसा करने के लिए, आपके ऐप्लिकेशन को:

  1. ऐक्सेसरी के लिए फ़िल्टर करने वाले इंटेंट फ़िल्टर का इस्तेमाल करके, कनेक्ट की गई ऐक्सेसरी खोजें अटैच किए गए इवेंट या कनेक्ट की गई ऐक्सेसरी की गिनती करके, सही ऐक्सेसरी ढूंढी जा सकती है.
  2. अगर आपने ऐक्सेसरी से संपर्क नहीं किया है, तो उपयोगकर्ता से अनुमति मांगें मिल गए हैं.
  3. सही इंटरफ़ेस पर डेटा को पढ़कर और लिखकर ऐक्सेसरी से बातचीत करें एंडपॉइंट के बारे में भी बताएंगे.

किसी ऐक्सेसरी के बारे में जानें

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

इंटेंट फ़िल्टर का इस्तेमाल करें

आपका ऐप्स किसी विशिष्ट USB ऐक्सेसरी को खोज सके, इसके लिए आप एक इंटेंट फ़िल्टर सेट कर सकते हैं android.hardware.usb.action.USB_ACCESSORY_ATTACHED इंटेंट को फ़िल्टर करने के लिए. साथ में इस इंटेंट फ़िल्टर के साथ, आपको एक ऐसी संसाधन फ़ाइल तय करनी होगी जो यूएसबी की प्रॉपर्टी के बारे में बताती हो ऐक्सेसरी, जैसे कि मैन्युफ़ैक्चरर, मॉडल, और वर्शन.

यहां दिए गए उदाहरण में, इंटेंट फ़िल्टर का एलान करने का तरीका बताया गया है:

<activity ...>
    ...
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
    </intent-filter>

    <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
        android:resource="@xml/accessory_filter" />
</activity>

नीचे दिए गए उदाहरण में, उस संसाधन फ़ाइल का एलान करने का तरीका बताया गया है जो आपकी इन यूएसबी ऐक्सेसरी में आपकी दिलचस्पी है:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
</resources>

अपनी गतिविधि में, आपके पास उस UsbAccessory को पाने का विकल्प होता है जिससे पता चलता है कि इस तरह के इंटेंट से अटैच की गई ऐक्सेसरी (ऐड-ऑन लाइब्रेरी के साथ):

Kotlin

val accessory = UsbManager.getAccessory(intent)

Java

UsbAccessory accessory = UsbManager.getAccessory(intent);

या इस तरह (प्लैटफ़ॉर्म एपीआई के साथ):

Kotlin

val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory

Java

UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

ऐक्सेसरी की गिनती करें

आप अपने ऐप्लिकेशन से उन ऐक्सेसरी की सूची बना सकते हैं जिन्होंने आपके ऐप्स चल रहा है.

getAccessoryList() तरीके का इस्तेमाल करें कनेक्ट की गई सभी USB ऐक्सेसरी का कलेक्शन पाने के लिए:

Kotlin

val manager = getSystemService(Context.USB_SERVICE) as UsbManager
val accessoryList: Array<out UsbAccessory> = manager.accessoryList

Java

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory[] accessoryList = manager.getAccessoryList();

ध्यान दें: कनेक्ट की गई सिर्फ़ एक ऐक्सेसरी का इस्तेमाल किया जा सकता है एक समय.

किसी ऐक्सेसरी से संपर्क करने के लिए अनुमति लेना

USB ऐक्सेसरी से बातचीत करने से पहले, आपके ऐप्लिकेशन को उपयोगकर्ता.

ध्यान दें: यदि आपका ऐप्लिकेशन किसी इंटेंट फ़िल्टर की मदद से, कनेक्ट की गई ऐक्सेसरी का पता लगाया जा सकता है. यह अपने-आप जुड़ जाता है अनुमति दें, अगर उपयोगकर्ता आपके ऐप्लिकेशन को इंटेंट मैनेज करने की अनुमति देता है. अगर ऐसा नहीं है, तो आपको अनुमति होनी चाहिए.

कुछ मामलों में, साफ़ तौर पर अनुमति लेना ज़रूरी हो सकता है. उदाहरण के लिए, जब आपका ऐप्लिकेशन उन ऐक्सेसरी की गिनती करता है जो पहले से कनेक्ट हैं और फिर जिनके साथ कम्यूनिकेट करना चाहते हैं एक. किसी ऐक्सेसरी से कनेक्ट करने से पहले, आपको उसे ऐक्सेस करने की अनुमति लेनी होगी. अगर ऐसा नहीं है, तो आपको रनटाइम गड़बड़ी का मैसेज मिलेगा. ऐसा तब होगा, जब उपयोगकर्ता ने ऐक्सेसरी.

साफ़ तौर पर अनुमति पाने के लिए, सबसे पहले एक ब्रॉडकास्ट रिसीवर बनाएं. यह व्यक्ति इसे सुनता है यह इंटेंट, requestPermission() को कॉल करने पर ब्रॉडकास्ट होता है. requestPermission() को किए जाने वाले कॉल ऐक्सेसरी से कनेक्ट करने की अनुमति माँगने वाला उपयोगकर्ता. नीचे दिया गया सैंपल कोड, ब्रॉडकास्ट रिसीवर बनाएं:

Kotlin

private const val ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"

private val usbReceiver = object : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (ACTION_USB_PERMISSION == intent.action) {
            synchronized(this) {
                val accessory: UsbAccessory? = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY)

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    accessory?.apply {
                        // call method to set up accessory communication
                    }
                } else {
                    Log.d(TAG, "permission denied for accessory $accessory")
                }
            }
        }
    }
}

Java

private static final String ACTION_USB_PERMISSION =
    "com.android.example.USB_PERMISSION";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(accessory != null){
                        // call method to set up accessory communication
                    }
                }
                else {
                    Log.d(TAG, "permission denied for accessory " + accessory);
                }
            }
        }
    }
};

ब्रॉडकास्ट रिसीवर को रजिस्टर करने के लिए, इसे अपने onCreate() वाले तरीके में गतिविधि:

Kotlin

private const val ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"
...
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
...
permissionIntent = PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), 0)
val filter = IntentFilter(ACTION_USB_PERMISSION)
registerReceiver(usbReceiver, filter)

Java

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION =
    "com.android.example.USB_PERMISSION";
...
permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);

उपयोगकर्ताओं से ऐक्सेसरी से कनेक्ट करने की अनुमति मांगने वाला डायलॉग बॉक्स दिखाने के लिए, requestPermission() तरीका:

Kotlin

lateinit var accessory: UsbAccessory
...
usbManager.requestPermission(accessory, permissionIntent)

Java

UsbAccessory accessory;
...
usbManager.requestPermission(accessory, permissionIntent);

जब उपयोगकर्ता डायलॉग का जवाब देते हैं, तो आपके ब्रॉडकास्ट रिसीवर को वह इंटेंट मिलता है जिसमें EXTRA_PERMISSION_GRANTED अतिरिक्त, जो एक बूलियन है इसका इस्तेमाल करें. डिफ़ॉल्ट वैल्यू से कनेक्ट करने से पहले, सही वैल्यू पाने के लिए इस अतिरिक्त वैल्यू की जांच करें ऐक्सेसरी.

ऐक्सेसरी से बातचीत करना

ऐक्सेसरी से बातचीत करने के लिए, UsbManager का इस्तेमाल करें एक फ़ाइल डिस्क्रिप्टर पाएं, जिसमें डेटा को पढ़ने और उसमें बदलाव करने के लिए, इनपुट और आउटपुट स्ट्रीम सेट अप किए जा सकते हैं डिस्क्रिप्टर का इस्तेमाल करें. स्ट्रीम, ऐक्सेसरी के इनपुट और आउटपुट बल्क एंडपॉइंट को दिखाती हैं. आपको सेट करना चाहिए डिवाइस और ऐक्सेसरी के बीच किसी अन्य थ्रेड में कम्यूनिकेशन को अप-टू-डेट रखें, ताकि आपको मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड. यहां दिए गए उदाहरण में, किसी ऐक्सेसरी से कम्यूनिकेट करने के लिए, उसे खोलने का तरीका बताया गया है:

Kotlin

private lateinit var accessory: UsbAccessory
private var fileDescriptor: ParcelFileDescriptor? = null
private var inputStream: FileInputStream? = null
private var outputStream: FileOutputStream? = null
...

private fun openAccessory() {
    Log.d(TAG, "openAccessory: $mAccessory")
    fileDescriptor = usbManager.openAccessory(accessory)
    fileDescriptor?.fileDescriptor?.also { fd ->
        inputStream = FileInputStream(fd)
        outputStream = FileOutputStream(fd)
        val thread = Thread(null, this, "AccessoryThread")
        thread.start()
    }
}

Java

UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...

private void openAccessory() {
    Log.d(TAG, "openAccessory: " + accessory);
    fileDescriptor = usbManager.openAccessory(accessory);
    if (fileDescriptor != null) {
        FileDescriptor fd = fileDescriptor.getFileDescriptor();
        inputStream = new FileInputStream(fd);
        outputStream = new FileOutputStream(fd);
        Thread thread = new Thread(null, this, "AccessoryThread");
        thread.start();
    }
}

थ्रेड के run() तरीके में, ऐक्सेसरी पर मौजूद टेक्स्ट को पढ़ने और उसमें बदलाव करने के लिए, इनका इस्तेमाल करें FileInputStream या FileOutputStream ऑब्जेक्ट. पढ़ते समय FileInputStream ऑब्जेक्ट वाली ऐक्सेसरी से मिलने वाले डेटा के लिए, पक्का करें कि बफ़र जो यूएसबी पैकेट डेटा को स्टोर करने के लिए काफ़ी है. Android ऐक्सेसरी प्रोटोकॉल, पैकेट बफ़र, 16384 बाइट तक के बफ़र होते हैं, ताकि आप हमेशा अपने बफ़र को इस जैसा होने का एलान कर सकें साइज़, आसानी से इस्तेमाल किया जा सकता है.

ध्यान दें: निचले लेवल पर, यूएसबी के लिए पैकेट 64 बाइट के होते हैं फ़ुल-स्पीड ऐक्सेसरी और यूएसबी हाई-स्पीड ऐक्सेसरी के लिए 512 बाइट. Android ऐक्सेसरी प्रोटोकॉल, आसानी से काम करने के लिए, दोनों स्पीड के पैकेट को एक लॉजिकल पैकेट में बांट देता है.

Android में थ्रेड का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, प्रोसेस और Threads.

ऐक्सेसरी के साथ कम्यूनिकेशन को खत्म करना

जब ऐक्सेसरी से बातचीत पूरी हो जाए या ऐक्सेसरी डिसकनेक्ट हो गई हो, तो उसे बंद करें फ़ाइल डिस्क्रिप्टर जिसे आपने close() को कॉल करके खोला था. डिटैच किए गए इवेंट सुनने के लिए, नीचे दिए गए तरीके से ब्रॉडकास्ट रिसीवर बनाएं:

Kotlin

var usbReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        if (UsbManager.ACTION_USB_ACCESSORY_DETACHED == intent.action) {
            val accessory: UsbAccessory? = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY)
            accessory?.apply {
                // call your method that cleans up and closes communication with the accessory
            }
        }
    }
}

Java

BroadcastReceiver usbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                // call your method that cleans up and closes communication with the accessory
            }
        }
    }
};

मेनिफ़ेस्ट के बजाय ऐप्लिकेशन के अंदर ब्रॉडकास्ट रिसीवर बनाने से आपको ऐप्लिकेशन, उसके चलने के दौरान केवल अलग किए गए इवेंट को हैंडल करता है. इस तरह, डिटैच किए गए इवेंट केवल उस ऐप्लिकेशन पर भेजा जाता है जो वर्तमान में चल रहा है और सभी ऐप्लिकेशन पर प्रसारित नहीं होता है.