โหมดอุปกรณ์เสริม 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 ผู้ผลิตอุปกรณ์แต่ละรายเป็นผู้ตัดสินใจ รองรับความสามารถนี้หรือไม่ นี่คือสาเหตุที่คุณต้องประกาศความสามารถนี้ในไฟล์ Manifestandroid.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>
สำหรับ Intentandroid.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 จะทำสิ่งต่อไปนี้ได้ ระบุว่าแอปพลิเคชันของคุณสนใจอุปกรณ์เสริมที่เชื่อมต่อหรือไม่ หากใช่ คุณสามารถ สื่อสารกับอุปกรณ์เสริมได้ หากต้องการ ในการดำเนินการดังกล่าว แอปพลิเคชันของคุณจะต้อง:
- สำรวจอุปกรณ์เสริมที่เชื่อมต่อโดยใช้ตัวกรอง Intent ที่กรองอุปกรณ์เสริม เหตุการณ์ที่แนบหรือนับจำนวนอุปกรณ์เสริมที่เชื่อมต่อ และค้นหาอุปกรณ์เสริมที่เหมาะสม
- ขอสิทธิ์จากผู้ใช้ในการสื่อสารกับอุปกรณ์เสริม หากยังไม่ได้ดำเนินการ ที่ได้รับ
- สื่อสารกับอุปกรณ์เสริมโดยการอ่านและเขียนข้อมูลบนอินเทอร์เฟซที่เหมาะสม ปลายทาง
สำรวจอุปกรณ์เสริม
แอปพลิเคชันจะค้นพบอุปกรณ์เสริมได้โดยใช้ตัวกรอง 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 เพื่อจัดการเหตุการณ์ที่ถูกตัดออกขณะทำงานอยู่เท่านั้น วิธีนี้จะทำให้เหตุการณ์ที่แยกจากกัน ส่งไปยังแอปพลิเคชันที่ทำงานอยู่ในปัจจุบันเท่านั้นและไม่ได้ประกาศไปยังแอปพลิเคชันทั้งหมด