Android USB 配件必須遵循 Android Open Accessory (AOA) 通訊協定,該協定定義了配件如何偵測 Android 裝置並設定通訊。配件應執行下列步驟:
- 等待並偵測已連線的裝置。
- 判斷裝置是否支援配件模式。
- 嘗試以配件模式啟動裝置 (如有需要)。
- 如果裝置支援 AOA,請與裝置建立通訊。
以下各節將說明如何實作這些步驟。
等待並偵測已連結的裝置
配件應持續檢查是否有連線的 Android 裝置。裝置連線時,配件應判斷裝置是否支援配件模式。
判斷是否支援配件模式
注意:連接配件不需要啟用 USB 偵錯功能,但開發期間可能需要 ADB。詳情請參閱 偵錯考量因素。
Android 裝置連線時,可能會有下列三種狀態:
- 支援 Android 配件模式,且已處於配件模式。
- 支援 Android 配件模式,但未處於配件模式。
- 不支援 Android 配件模式。
在初始連線期間,配件應檢查已連線裝置的 USB 裝置描述元版本、供應商 ID 和產品 ID。供應商 ID 應與 Google ID (0x18D1
) 相符。如果裝置已處於配件模式,產品 ID 應為 0x2D00
或 0x2D01
,且配件可使用自己的通訊通訊協定,透過大量傳輸端點與裝置建立通訊 (裝置不需要在配件模式下啟動)。
注意: 0x2D00
僅供支援配件模式的 Android 裝置使用。0x2D01
是為支援配件模式和 Android Debug Bridge (ADB) 通訊協定的裝置保留,可為 ADB 提供含有兩個大量端點的第二個介面。如果您要在電腦上模擬配件,可以使用這些端點來偵錯配件應用程式。一般來說,除非配件在裝置上實作 ADB 的傳遞功能,否則請勿使用這個介面。
如果 USB 裝置描述元中的版本、供應商 ID 或產品 ID 與預期值不符,配件就無法判斷裝置是否支援 Android 配件模式。配件應嘗試在配件模式下啟動裝置 (詳情請見下文),以判斷裝置是否支援。
重點: USB 配件必須在初始握手時傳送標頭。標頭包含製造商、型號和版本。雖然版本是選用欄位,但如果安裝的 Android 應用程式只符合版本,而配件未傳送版本,則搭載 Android 10 以下版本的 Android 裝置會因為系統程序中發生例外狀況而重新啟動。
嘗試在配件模式下啟動
如果版本、供應商和產品 ID 不對應至 Android 搭載裝置的配件模式,配件就無法判斷裝置是否支援配件模式 (但裝置並未處於配件模式),或是裝置不支援配件模式。發生這種情況的原因是,支援配件模式 (但未處於配件模式) 的裝置一開始會回報裝置製造商供應商和產品 ID,而不是 AOA 供應商和產品 ID。
配件應嘗試以配件模式啟動裝置,以判斷裝置是否支援該模式:
- 傳送 51 控制要求 (「Get Protocol」),判斷裝置是否支援 Android 配件通訊協定。如果裝置支援該通訊協定,則會傳回非零的數字,代表所支援的通訊協定版本。控制要求位於端點 0,具有下列特性:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from the device to the accessory)
- 如果裝置傳回支援的通訊協定版本,請傳送控制要求,並附上識別字串資訊。裝置可利用這項資訊,判斷配件的適當應用程式 (如果沒有適當的應用程式,則會向使用者顯示網址)。控制項要求位於端點 0 (針對每個字串 ID),且具有下列特性:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
系統支援下列字串 ID,每個字串的大小上限為 256 個位元組 (必須以
\0
結尾)。manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- 傳送控制要求,要求裝置以配件模式啟動。控制要求位於端點 0,具有下列特性:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
完成這些步驟後,配件應等待已連結的 USB 裝置在配件模式下重新介紹自己,然後重新列舉已連結的裝置。如果裝置成功切換至配件模式,演算法會檢查供應商和產品 ID,藉此判斷是否支援配件模式,這些 ID 應為正確的值 (例如對應 Google 的供應商和產品 ID,而非裝置製造商的 ID)。如果 ID 和版本正確,配件就會開始與裝置建立通訊。
注意:AOA 目前不支援同時使用 AOA 和 MTP 連線。如要從 AOA 切換至 MTP,配件必須先斷開 USB 裝置 (以實體或電氣等效方式),然後再使用 MTP 重新連線。
如果任何步驟失敗,配件會判斷裝置不支援 Android 配件模式,並等待下一個裝置連線。
與裝置建立通訊
如果配件偵測到 Android 裝置處於配件模式,則可查詢裝置介面和端點描述符,取得用於與裝置通訊的大量端點。
介面和大量端點的數量取決於產品 ID。搭載 Android 的裝置,產品 ID 為:
0x2D00
有一個介面,其中包含兩個大量端點,用於輸入和輸出通訊。0x2D01
有兩個介面,每個介面都有兩個大量端點,分別用於輸入和輸出通訊。第一個介面會處理標準通訊,第二個介面則會處理 ADB 通訊。如要使用介面,請找出第一個大量輸入和輸出端點,然後使用SET_CONFIGURATION
(0x09
) 裝置要求,將裝置設定設為 1,再使用端點進行通訊。