本文件說明 Android Open Accessory (AOA) 通訊協定中的異動 包括首次發布 AOA 1.0 說明文件。AOAv2 新增以下功能:
- 音訊輸出 (不適用於 Android 8.0)。
- 支援做為一或多部人機介面裝置的配件 (HID)。
可供 Android 應用程式開發人員使用的 Android SDK API 則維持不變。
偵測 AOAv2 支援
如何判斷已連結的 Android 裝置是否支援配件和
支援的通訊協定版本,配件必須傳送 getProtocol()
並檢查結果僅支援這些功能的 Android 裝置
在 AOAv1 中,必須傳回 1
做為通訊協定版本。執行
支援 AOAv2 中的額外功能必須傳回 2
,因為
通訊協定版本AOAv2 可與 AOAv1 回溯相容,因此配件
專為原始配件通訊協定所設計的 Android 裝置仍可繼續與較新的 Android 系統搭配運作
裝置。
下列範例來自 2011 年配件開發套件
原始碼
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
)。
程式庫會示範這項通訊協定檢查作業:
bool AndroidAccessory::switchDevice(byte addr) { int protocol = getProtocol(addr); if (protocol >= 1) { Serial.print("device supports protocol 1 or higher\n"); } else { Serial.print("could not read device protocol version\n"); return false; } sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer); sendString(addr, ACCESSORY_STRING_MODEL, model); sendString(addr, ACCESSORY_STRING_DESCRIPTION, description); sendString(addr, ACCESSORY_STRING_VERSION, version); sendString(addr, ACCESSORY_STRING_URI, uri); sendString(addr, ACCESSORY_STRING_SERIAL, serial); usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL); return true; }
AOAv2 針對各種 USB 介面組合提供新的 USB 產品 ID 支援配件模式:
版本 | 產品 ID | 通訊 | 說明 |
---|---|---|---|
AOAv1 | 0x2D00 |
配件 | 提供兩個大量端點,用來與 Android 應用程式通訊。 |
0x2D01 |
配件 + ADB | 在配件開發期間進行偵錯。僅適用於 使用者在 Android 裝置設定中啟用 USB 偵錯功能。 | |
AOAv2 | 0x2D02 |
音訊內容 | 用於將 Android 裝置的音訊傳輸到配件。 |
0x2D03 |
音訊 + ADB | ||
0x2D04 |
配件 + 音訊 | ||
0x2D05 |
配件 + 音訊 + ADB |
用於 AOAv1 (0x2D00
和 0x2D01
) 的產品 ID
繼續支援 AOAv2
音訊支援
AOAv2 支援從 Android 裝置輸出至 透過標準 USB 音訊類別介面連接 2 聲道 (16 位元) 的配件 位元率為 44100 Khz 的 PCM 音訊 (可 未來)。
如要啟用音訊支援功能,配件必須傳送新的 USB 控制要求:
**SET_AUDIO_MODE** requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 58 value: 0 for no audio (default), 1 for 2 channel, 16-bit PCM at 44100 KHz index: 0 data none
這個指令必須在傳送前傳送
進入配件模式的 ACCESSORY_START
指令。
HID 支援
AOAv2 可讓配件註冊一或多個 USB 人機介面 搭載 Android 裝置的裝置 (HID)。這個方法會反轉 一般 USB HID 裝置 (例如 USB 滑鼠和鍵盤) 的通訊。 一般來說,HID 裝置是連接到 USB 主機 (即 個人電腦),但在 AOA 中,USB 主機可當做一或多個輸入來源 將裝置連接到 USB 週邊裝置。
HID 支援可做為標準 HID 事件的 Proxy;這個 不對內容或事件類型做出假設 直接傳入輸入系統,使 AOAv2 配件 充當任何 HID 裝置 (滑鼠、鍵盤、遊戲控制器等)。您可以使用 HID 支援提供基本功能,例如媒體上的播放/暫停按鈕 或其他進階功能,例如用滑鼠移動站點 全 QWERTY 鍵盤。
AOAv2 新增 USB 控制要求,可讓配件 Android 裝置的一或多部 HID 輸入裝置。已處理 HID 支援 因此完全無需新的 USB 介面 。以下是四種新的控制要求:
- ACCESSORY_REGISTER_HID 會使用
Android 裝置。這個配件會提供可用於識別 HID 裝置的 ID
其他三個呼叫這個 ID 有效期限到 USB 中斷或直到 USB 連接
配件會傳送
ACCESSORY_UNREGISTER_HID
以取消註冊 HID 裝置。 - ACCESSORY_UNREGISTER_HID 取消註冊 HID 裝置
先前已註冊
ACCESSORY_REGISTER_HID
。 - ACCESSORY_SET_HID_REPORT_DESC 傳送報表描述元
複製到 Android 裝置的 HID 裝置這個請求是用來描述
HID 裝置的功能,必須在回報任何 HID 事件前傳送
分享到 Android 裝置如果報表描述元大於上限
端點 0 或多個端點的封包大小
系統會傳送
ACCESSORY_SET_HID_REPORT_DESC
指令來轉移 完整描述元 - ACCESSORY_SEND_HID_EVENT 會從 Android 裝置配件。
新控制項要求的程式碼定義如下:
/* Control request for registering a HID device. * Upon registering, a unique ID is sent by the accessory in the * value parameter. This ID will be used for future commands for * the device * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID_DEVICE * value: Accessory assigned ID for the HID device * index: total length of the HID report descriptor * data none */ #define ACCESSORY_REGISTER_HID 54 /* Control request for unregistering a HID device. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_REGISTER_HID * value: Accessory assigned ID for the HID device * index: 0 * data none */ #define ACCESSORY_UNREGISTER_HID 55 /* Control request for sending the HID report descriptor. * If the HID descriptor is longer than the endpoint zero max packet size, * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC * commands. The data for the descriptor must be sent sequentially * if multiple packets are needed. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SET_HID_REPORT_DESC * value: Accessory assigned ID for the HID device * index: offset of data in descriptor * (needed when HID descriptor is too big for one packet) * data the HID report descriptor */ #define ACCESSORY_SET_HID_REPORT_DESC 56 /* Control request for sending HID events. * * requestType: USB_DIR_OUT | USB_TYPE_VENDOR * request: ACCESSORY_SEND_HID_EVENT * value: Accessory assigned ID for the HID device * index: 0 * data the HID report for the event */ #define ACCESSORY_SEND_HID_EVENT 57
與 AOAv1 的互通性
原始通訊協定 (AOAv1) 為 Android 應用程式提供直接與 USB 通訊的支援 主機 (配件) 透過 USB 傳輸。AOAv2 繼續使用這項支援功能並添加新功能 讓配件與 Android 作業系統本身通訊 (具體來說是音訊和輸入系統)。AOAv2 的設計讓 建構使用全新音訊和 HID 支援功能的配件 除了原本的功能組合外只需使用新功能和 原始功能
在不使用 Android 應用程式
您可以設計使用音訊和 HID 的配件 (例如音訊座架) 無法與 Android 裝置上的應用程式通訊。適用對象 使用者不需要透過對話方塊提示 將新連接的配件與 Android 應用程式建立關聯 與 Google 服務相互通訊
如要在配件連線後隱藏這類對話方塊, 配件可選擇不將製造商名稱及型號名稱傳送至 Android 裝置。如未將這些字串提供給 Android 裝置,請按照下列步驟操作:
- 系統不會嘗試尋找用來與配件通訊的應用程式。
- Android 裝置 USB 中沒有配件 USB 介面 設定。