วันนี้ขอหยิบเรื่องเบาสมองของแอนดรอยด์มาเล่าสู่กันฟังซักหน่อย ซึ่งเป็นเรื่องราวของการเชื่อมต่อกับอุปกรณ์ต่างๆผ่าน USB ที่ทุกๆคนคุ้นเคยกัน
โดยปกติแล้วบนแอนดรอยด์สามารถเชื่อมต่อผ่าน USB เข้ากับเครื่องคอมพิวเตอร์ได้ทันที ไม่ว่าจะเพื่อถ่ายโอนข้อมูลผ่าน MTP หรือเชื่อมต่อผ่าน ADB ซึ่งเป็นหนึ่งใน USB Protocol ที่ระบบแอนดรอยด์นั้นรองรับอยู่แล้ว ซึ่งแอปที่ติดตั้งอยู่ในเครื่องจะไม่สามารถเข้าไปยุ่งอะไรกับ Protocol เหล่านี้ได้โดยตรง
แต่เมื่อใดก็ตามที่นักพัฒนาอยากจะสร้างแอปที่รองรับการเชื่อมต่อกับอุปกรณ์ต่างๆนั้น บนแอนดรอยด์จะมี USB Protocol อยู่ 2 แบบด้วยกันเพื่อให้อุปกรณ์แอนดรอยด์สามารถทำงานในฐานะ Host หรือ Client ก็ได้
- USB Host
- USB Accessory
ซึ่งทั้งคู่ถูกเพิ่มเข้ามาตั้งแต่ Android 3.1 Honeycomb MR1 (API 12) นั่นหมายความว่าหายห่วงเรื่อง API Level ไปได้เลย เพราะถูกเพิ่มเข้ามานานมากแล้ว
USB Host
เป็น USB Protocol ที่จะช่วยรองรับการเชื่อมต่อกับอุปกรณ์อื่นๆผ่าน USB ในฐานะ Host (อุปกรณ์ที่มาเชื่อมต่อจะถือว่าเป็น Client) เช่น การเชื่อมต่อ Portable USB Storage เป็นต้น
ในยุคสมัยที่อุปกรณ์แอนดรอยด์ยังใช้ช่องชาร์จแบบ Micro USB อยู่ จะต้องใช้สายแปลงจาก Micro USB ให้กลายเป็น USB-A ที่เป็นหัวเสียบแบบตัวเมีย หรือที่เรียกกันว่า USB OTG (On-The-Go) แต่สำหรับในยุคของ USB-C ถ้าอุปกรณ์ที่มาต่อด้วยเป็นแบบ USB-C ก็ไม่จำเป็นต้องใช้สายแปลง (แต่ถ้าเป็น USB-A ก็ต้องใช้สายแปลงอยู่ดี)
ด้วยการทำงานในลักษณะของ Host จีงทำให้อุปกรณ์แอนดรอยด์ทำหน้าที่จ่ายไฟให้กับอุปกรณ์ที่มาเชื่อมต่อ
USB Accessory
เป็น USB Protocol ที่จะใช้สำหรับเชื่อมต่อกับอุปกรณ์ต่างๆโดยให้อุปกรณ์แอนดรอยด์ทำงานในฐานะ Client (คล้ายๆกับการต่อเข้ากับคอมพิวเตอร์นั่นเอง แต่อยู่บน USB Protocol ที่ชื่อว่า USB Accessory)
โดยอุปกรณ์ที่จะเชื่อมต่อผ่าน USB Protocol แบบนี้ได้นั้น ไม่ใช่ว่าจะเป็นอุปกรณ์แบบไหนก็ได้ เพราะจะต้องเป็นอุปกรณ์ที่ออกแบบตามเงื่อนไขที่ทาง Android กำหนดไว้เท่านั้น ถึงจะเชื่อมต่อกับอุปกรณ์แอนดรอยด์แบบ USB Accessory ได้
และการทำงานในโหมดนี้ อุปกรณ์ที่มาเชื่อมต่อจะทำการจ่ายไฟให้กับอุปกรณ์แอนดรอยด์ นั่นหมายความว่าอุปกรณ์แอนดรอยด์จะชาร์จพร้อมๆกับรับส่งข้อมูลไปในตัว
อุปกรณ์แอนดรอยด์แบบไหนรองรับ USB Host และ USB Accessory บ้าง?
ในปัจจุบันนั้น อุปกรณ์แอนดรอยด์แทบทุกรุ่นนั้นสามารถรองรับ USB Protocol ทั้ง 2 แบบได้อยู่แล้ว แต่เพื่อความมั่นใจ นักพัฒนาก็สามารถเช็คผ่านคลาส Package Manager ได้เลย
val packageManager: PackageManager = /* ... */
val isUsbHostSupported = packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
val isUsbAccessorySupported = packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)
ส่วนการเรียกใช้งาน USB Host และ USB Acessory ผ่านโค้ดในแอปของผู้ที่หลงเข้ามาอ่าน ก็สามารถอ่านต่อได้ที่