ภาพรวมของอุปกรณ์เสริม USB

โหมดอุปกรณ์เสริม USB ช่วยให้ผู้ใช้เชื่อมต่อได้ ฮาร์ดแวร์โฮสต์ USB ออกแบบมาสำหรับอุปกรณ์ที่ใช้ Android โดยเฉพาะ อุปกรณ์เสริมจะต้องเป็นไปตาม กับโปรโตคอลอุปกรณ์เสริม Android ตามที่ระบุไว้ในเอกสารประกอบชุดพัฒนาอุปกรณ์เสริม Android ซึ่งช่วยให้อุปกรณ์ที่ใช้ Android ซึ่งไม่สามารถทำหน้าที่เป็นโฮสต์ USB ยังคงโต้ตอบกับ USB ได้ ฮาร์ดแวร์ เมื่ออุปกรณ์ที่ใช้ Android อยู่ในโหมดอุปกรณ์เสริม USB อุปกรณ์ Android USB ที่เชื่อมต่ออยู่ อุปกรณ์เสริมทำหน้าที่เป็นโฮสต์ จ่ายไฟไปยังบัส USB และแจกแจงอุปกรณ์ที่เชื่อมต่อ Android 3.1 (API ระดับ 12) รองรับโหมดอุปกรณ์เสริม USB และฟีเจอร์นี้ยังมีพอร์ตไปยัง Android 2.3.4 (API ระดับ 10) เพื่อให้การสนับสนุนสำหรับอุปกรณ์ที่หลากหลายมากขึ้น

เลือก API ของอุปกรณ์เสริม USB ที่เหมาะสม

แม้จะมีการแนะนำ API อุปกรณ์เสริม USB บนแพลตฟอร์มใน Android 3.1 แต่ API ดังกล่าวก็ ใช้ได้ใน Android 2.3.4 โดยใช้ไลบรารีส่วนเสริมของ Google APIs เนื่องจาก API เหล่านี้ มี 2 แพ็กเกจที่คุณสามารถนำเข้าเพื่อรองรับ USB โดยใช้ไลบรารีภายนอก โหมดอุปกรณ์เสริม คุณอาจต้องดำเนินการต่อไปนี้ โดยขึ้นอยู่กับอุปกรณ์ที่ใช้ Android ที่คุณต้องการรองรับ ใช้ค่าใดข้อความหนึ่งมากกว่าไอคอนอื่น:

  • com.android.future.usb: เพื่อรองรับโหมดอุปกรณ์เสริม USB ใน Android 2.3.4 ส่วนเสริม Google APIs ไลบรารีรวมถึง API อุปกรณ์เสริม USB ที่พอร์ตแบ็กพอร์ต ซึ่งอยู่ในส่วนนี้ Namespace Android 3.1 ยังรองรับการนำเข้าและการเรียกใช้คลาสภายในเนมสเปซนี้เพื่อ รองรับแอปพลิเคชันที่เขียนด้วยไลบรารีของส่วนเสริม ไลบรารีส่วนเสริมนี้เป็นแบบ Wrapper ที่เล็กลง รอบๆ API อุปกรณ์เสริมของ android.hardware.usb และไม่รองรับโหมดโฮสต์ USB ถ้า หากต้องการรองรับอุปกรณ์หลากหลายประเภทที่สุดที่รองรับโหมดอุปกรณ์เสริม USB ให้ใช้ส่วนเสริม ไลบรารี และนำเข้าแพ็กเกจนี้ โปรดทราบว่าอุปกรณ์ Android 2.3.4 บางส่วนไม่ได้ ที่จำเป็นต่อการรองรับฟีเจอร์อุปกรณ์เสริม USB ผู้ผลิตอุปกรณ์แต่ละรายเป็นผู้ตัดสินใจ รองรับความสามารถนี้หรือไม่ นี่คือสาเหตุที่คุณต้องประกาศความสามารถนี้ในไฟล์ Manifest
  • android.hardware.usb: เนมสเปซนี้มีคลาสที่รองรับ USB โหมดอุปกรณ์เสริมใน Android 3.1 แพ็กเกจนี้รวมอยู่ใน API เฟรมเวิร์กด้วย ดังนั้น Android 3.1 รองรับโหมดอุปกรณ์เสริม USB โดยไม่ต้องใช้ไลบรารีส่วนเสริม ใช้แพ็กเกจนี้ ถ้าคุณดูแลเฉพาะ Android 3.1 หรืออุปกรณ์ที่ใหม่กว่าที่รองรับฮาร์ดแวร์สำหรับ USB โหมดอุปกรณ์เสริมซึ่งสามารถประกาศในไฟล์ Manifest ได้

ติดตั้งไลบรารีส่วนเสริมของ Google APIs

หากต้องการติดตั้งส่วนเสริม คุณจะติดตั้งได้ด้วยการติดตั้ง Google APIs Android API 10 กับ SDK Manager โปรดดูการติดตั้ง Google API ส่วนเสริมสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งไลบรารีของส่วนเสริม

ภาพรวม API

เนื่องจากไลบรารีส่วนเสริมคือ Wrapper สำหรับ API ของเฟรมเวิร์ก คลาสที่รองรับการเรียก ฟีเจอร์ของอุปกรณ์เสริม USB คล้ายกัน คุณใช้เอกสารประกอบอ้างอิงสำหรับ android.hardware.usb ได้แม้ว่าจะใช้ไลบรารีส่วนเสริมอยู่ก็ตาม

หมายเหตุ: อย่างไรก็ตาม ยังมีการใช้งาน ความแตกต่างระหว่างไลบรารีส่วนเสริมและ API ของเฟรมเวิร์กที่คุณควรทราบ

ตารางต่อไปนี้อธิบายคลาสที่รองรับ API อุปกรณ์เสริม USB

ชั้น คำอธิบาย
UsbManager ช่วยให้คุณสามารถแจกแจงและสื่อสารกับอุปกรณ์เสริม USB ที่เชื่อมต่ออยู่
UsbAccessory แสดงอุปกรณ์เสริม USB และมีวิธีการเข้าถึงการระบุ

ความแตกต่างของการใช้งานระหว่างไลบรารีส่วนเสริมและ API ของแพลตฟอร์ม

การใช้ไลบรารีส่วนเสริมของ Google APIs และแพลตฟอร์มมีความแตกต่างในการใช้งานอยู่ 2 ประการ 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);

เมื่อกรองอุปกรณ์เสริมที่เชื่อมต่อด้วยตัวกรอง Intent ออบเจ็กต์ UsbAccessory จะอยู่ใน Intent ที่ส่งไปยัง แอปพลิเคชัน หากใช้ไลบรารีส่วนเสริม คุณต้องรับออบเจ็กต์ 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);

ข้อกำหนดของไฟล์ Manifest สำหรับ Android

รายการต่อไปนี้อธิบายสิ่งที่คุณต้องเพิ่มลงในไฟล์ Manifest ของแอปพลิเคชันก่อน การทำงานกับ API ของอุปกรณ์เสริม USB ไฟล์ Manifest และทรัพยากร ตัวอย่าง แสดงวิธีประกาศรายการเหล่านี้

  • เนื่องจากอุปกรณ์ที่ใช้ Android บางอุปกรณ์ไม่สามารถรับประกัน API ของอุปกรณ์เสริม USB ได้ รวมเอลิเมนต์ <uses-feature> ที่ประกาศว่าแอปพลิเคชันของคุณใช้ ฟีเจอร์ android.hardware.usb.accessory
  • หากคุณกำลังใช้ ไลบรารีส่วนเสริม เพิ่มเอลิเมนต์ <uses-library> ที่ระบุ com.android.future.usb.accessory สำหรับคลัง
  • ตั้งค่า SDK ขั้นต่ำของแอปพลิเคชันเป็น API ระดับ 10 หากคุณใช้ไลบรารีส่วนเสริม หรือ 12 หากคุณใช้แพ็กเกจ android.hardware.usb
  • หากต้องการให้แอปพลิเคชันของคุณได้รับการแจ้งเตือนเกี่ยวกับอุปกรณ์เสริม USB ที่เชื่อมต่ออยู่ ให้ระบุ คู่เอลิเมนต์ <intent-filter> และ <meta-data> สำหรับ Intent android.hardware.usb.action.USB_ACCESSORY_ATTACHED ในกิจกรรมหลัก องค์ประกอบ <meta-data> ชี้ไปที่ไฟล์ทรัพยากร XML ภายนอกที่ ประกาศข้อมูลระบุตัวตนของอุปกรณ์เสริมที่คุณต้องการตรวจหา

    ในไฟล์ทรัพยากร XML ให้ประกาศองค์ประกอบ <usb-accessory> สำหรับ อุปกรณ์เสริมที่ต้องการกรอง <usb-accessory> แต่ละรายการจะมีค่า แอตทริบิวต์ต่อไปนี้

    • manufacturer
    • model
    • version

    ไม่แนะนำให้กรอง version อุปกรณ์เสริม หรืออุปกรณ์อาจไม่ได้ระบุสตริงเวอร์ชันเสมอไป (ไม่ว่าจะตั้งใจหรือไม่ตั้งใจ) เมื่อแอปประกาศแอตทริบิวต์เวอร์ชันเพื่อกรอง และอุปกรณ์เสริมหรืออุปกรณ์ ไม่ได้ระบุสตริงเวอร์ชัน ซึ่งจะทําให้ NullPointerException เปิดอยู่ Android เวอร์ชันก่อนหน้า ปัญหานี้ได้รับการแก้ไขแล้วใน Android 12

    บันทึกไฟล์ทรัพยากรในไดเรกทอรี res/xml/ ชื่อไฟล์ทรัพยากร (ไม่มีนามสกุล .xml) ต้องเป็นชื่อเดียวกับที่คุณระบุไว้ใน องค์ประกอบ <meta-data> รูปแบบสำหรับไฟล์ทรัพยากร XML จะแสดงใน ตัวอย่างด้านล่าง

ตัวอย่างไฟล์ Manifest และไฟล์ทรัพยากร

ตัวอย่างต่อไปนี้แสดงตัวอย่างไฟล์ Manifest และไฟล์ทรัพยากรที่เกี่ยวข้อง

<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>

ทำงานกับอุปกรณ์เสริม

เมื่อผู้ใช้เชื่อมต่ออุปกรณ์เสริม USB กับอุปกรณ์ที่ขับเคลื่อนโดย Android ระบบ Android จะทำสิ่งต่อไปนี้ได้ ระบุว่าแอปพลิเคชันของคุณสนใจอุปกรณ์เสริมที่เชื่อมต่อหรือไม่ หากใช่ คุณสามารถ สื่อสารกับอุปกรณ์เสริมได้ หากต้องการ ในการดำเนินการดังกล่าว แอปพลิเคชันของคุณจะต้อง:

  1. สำรวจอุปกรณ์เสริมที่เชื่อมต่อโดยใช้ตัวกรอง Intent ที่กรองอุปกรณ์เสริม เหตุการณ์ที่แนบหรือนับจำนวนอุปกรณ์เสริมที่เชื่อมต่อ และค้นหาอุปกรณ์เสริมที่เหมาะสม
  2. ขอสิทธิ์จากผู้ใช้ในการสื่อสารกับอุปกรณ์เสริม หากยังไม่ได้ดำเนินการ ที่ได้รับ
  3. สื่อสารกับอุปกรณ์เสริมโดยการอ่านและเขียนข้อมูลบนอินเทอร์เฟซที่เหมาะสม ปลายทาง

สำรวจอุปกรณ์เสริม

แอปพลิเคชันจะค้นพบอุปกรณ์เสริมได้โดยใช้ตัวกรอง Intent เพื่อรับการแจ้งเตือนเมื่อ ผู้ใช้เชื่อมต่ออุปกรณ์เสริมหรือแจกแจงอุปกรณ์เสริมที่มีการเชื่อมต่ออยู่แล้ว การใช้ ตัวกรอง Intent จะมีประโยชน์ในกรณีที่คุณต้องการให้แอปพลิเคชันตรวจหา อุปกรณ์เสริมที่ต้องการ การระบุอุปกรณ์เสริมที่เชื่อมต่อจะมีประโยชน์เมื่อต้องการดูรายการทั้งหมด อุปกรณ์เสริมที่เชื่อมต่ออยู่ หรือหากแอปพลิเคชันของคุณไม่ได้กรองความตั้งใจออก

ใช้ตัวกรอง Intent

คุณสามารถระบุตัวกรอง Intent เพื่อให้แอปพลิเคชันค้นพบอุปกรณ์เสริม USB ที่ต้องการได้ เพื่อกรองหา Intent android.hardware.usb.action.USB_ACCESSORY_ATTACHED ไปพร้อมๆ กัน ด้วยตัวกรอง Intent นี้ คุณจะต้องระบุไฟล์ทรัพยากรที่ระบุคุณสมบัติของ USB อุปกรณ์เสริม เช่น ผู้ผลิต รุ่น และเวอร์ชัน

ตัวอย่างต่อไปนี้แสดงวิธีประกาศตัวกรอง Intent

<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>

ตัวอย่างต่อไปนี้แสดงวิธีประกาศไฟล์ทรัพยากรที่เกี่ยวข้องที่ระบุ อุปกรณ์เสริม USB ที่คุณสนใจ:

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

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

ในกิจกรรม คุณสามารถรับ UsbAccessory ที่แสดงถึง อุปกรณ์เสริมที่แนบมาจาก Intent แบบนี้ (ที่มีไลบรารีส่วนเสริม) มีดังนี้

Kotlin

val accessory = UsbManager.getAccessory(intent)

Java

UsbAccessory accessory = UsbManager.getAccessory(intent);

หรือมีลักษณะดังนี้ (ด้วย API ของแพลตฟอร์ม)

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();

หมายเหตุ: รองรับอุปกรณ์เสริมที่เชื่อมต่อได้เพียง 1 ชิ้นที่ หนึ่งครั้ง

ขออนุญาตสื่อสารกับอุปกรณ์เสริม

ก่อนที่จะสื่อสารกับอุปกรณ์เสริม USB แอปพลิเคชันของคุณต้องได้รับอนุญาตจาก ผู้ใช้

หมายเหตุ: หากแอปพลิเคชันของคุณใช้ ตัวกรอง Intent เพื่อค้นพบอุปกรณ์เสริมเมื่อเชื่อมต่ออยู่ อุปกรณ์เสริมจะได้รับโดยอัตโนมัติ หากผู้ใช้อนุญาตให้แอปพลิเคชันของคุณจัดการ Intent หากไม่ใช่ คุณต้องส่งคำขอ อนุญาตอย่างชัดแจ้งในแอปพลิเคชันของคุณก่อนที่จะเชื่อมต่อกับอุปกรณ์เสริม

การขอสิทธิ์อย่างชัดแจ้งในบางสถานการณ์อาจจำเป็น เช่นเมื่อคุณ แอปพลิเคชันแจกแจงอุปกรณ์เสริมที่เชื่อมต่ออยู่แล้วและต้องการสื่อสารกับ ข้อแรก คุณต้องตรวจสอบสิทธิ์ในการเข้าถึงอุปกรณ์เสริมก่อนที่จะพยายามสื่อสารกับอุปกรณ์ดังกล่าว ไม่เช่นนั้น คุณจะได้รับข้อผิดพลาดเกี่ยวกับรันไทม์หากผู้ใช้ปฏิเสธการอนุญาตให้เข้าถึง อุปกรณ์เสริม

หากต้องการได้รับอนุญาตอย่างชัดแจ้ง ให้สร้าง Broadcast Receiver ก่อน รีซีฟเวอร์นี้จะคอยฟัง Intent ที่จะประกาศเมื่อคุณโทรหา requestPermission() การโทรไปยัง requestPermission() แสดงกล่องโต้ตอบสำหรับ ผู้ใช้ที่ขออนุญาตเชื่อมต่อกับอุปกรณ์เสริม โค้ดตัวอย่างต่อไปนี้จะแสดงวิธีการ สร้าง Broadcast Receiver:

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);
                }
            }
        }
    }
};

ในการลงทะเบียน Broadcast Receiver ให้วางลงในเมธอด 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);

เมื่อผู้ใช้ตอบกลับกล่องโต้ตอบ เครื่องรับการออกอากาศจะได้รับ Intent ที่มี เกินมา EXTRA_PERMISSION_GRANTED ซึ่งเป็นบูลีน ที่แสดงถึงคำตอบ ตรวจสอบส่วนเพิ่มเติมนี้เพื่อดูค่า "จริง" ก่อนเชื่อมต่อกับ อุปกรณ์เสริม

สื่อสารด้วยอุปกรณ์เสริม

คุณสามารถสื่อสารกับอุปกรณ์เสริมโดยใช้ UsbManager เพื่อ รับข้อบ่งชี้ไฟล์ที่คุณสามารถตั้งค่าสตรีมอินพุตและเอาต์พุตเพื่ออ่านและเขียนข้อมูล ข้อบ่งชี้ สตรีมจะแสดงอุปกรณ์ปลายทางจำนวนมากสำหรับอินพุตและเอาต์พุตของอุปกรณ์เสริม คุณควรตั้งค่า การสื่อสารระหว่างอุปกรณ์และอุปกรณ์เสริมในชุดข้อความอื่น เพื่อให้คุณไม่ล็อก เทรด UI หลัก ตัวอย่างต่อไปนี้แสดงวิธีเปิดอุปกรณ์เสริมเพื่อสื่อสาร

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 โปรดตรวจสอบว่าบัฟเฟอร์ที่ ที่คุณใช้มีขนาดใหญ่พอที่จะจัดเก็บข้อมูลแพ็กเก็ต USB โปรโตคอลอุปกรณ์เสริมของ Android รองรับ บัฟเฟอร์แพ็กเก็ตมีขนาดได้ถึง 16, 384 ไบต์ คุณจึงสามารถเลือกประกาศบัฟเฟอร์ของคุณให้สอดคล้องกับเงื่อนไขนี้ได้เสมอ เพื่อความเรียบง่าย

หมายเหตุ: ในระดับที่ต่ำกว่า แพ็กเก็ตจะมีขนาด 64 ไบต์สำหรับ USB อุปกรณ์เสริมความเร็วสูงสุดและ 512 ไบต์สำหรับอุปกรณ์เสริมความเร็วสูงแบบ USB อุปกรณ์เสริม Android จะจัดกลุ่มแพ็กเก็ตของความเร็วทั้งสองแบบเข้าด้วยกันเป็นแพ็กเก็ตเชิงตรรกะเดียวกันเพื่อความง่าย

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ชุดข้อความใน Android ได้ที่กระบวนการและ Threads

สิ้นสุดการสื่อสารด้วยอุปกรณ์เสริม

เมื่อสื่อสารกับอุปกรณ์เสริมเสร็จแล้ว หรือหากถอดอุปกรณ์เสริมออก ให้ปิด ตัวบอกไฟล์ที่คุณเปิดโดยการเรียกใช้ close() หากต้องการฟังกิจกรรมที่แยกจากกัน ให้สร้าง Broadcast Receiver ดังตัวอย่างต่อไปนี้

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
            }
        }
    }
};

การสร้าง Broadcast Receiver ภายในแอปพลิเคชัน ไม่ใช่ไฟล์ Manifest เพื่อจัดการเหตุการณ์ที่ถูกตัดออกขณะทำงานอยู่เท่านั้น วิธีนี้จะทำให้เหตุการณ์ที่แยกจากกัน ส่งไปยังแอปพลิเคชันที่ทำงานอยู่ในปัจจุบันเท่านั้นและไม่ได้ประกาศไปยังแอปพลิเคชันทั้งหมด