日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓USB开发教程 三 USB Accessory

發布時間:2023/12/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓USB开发教程 三 USB Accessory 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

USB Accessory(配件模式)

USB 配件模式允許用戶連接專為?Android?設備設計的 USB 主機硬件。配件必須遵守?Android Accessory Development Kit 文檔中列出的 Android 配件協議。 這使得 Android 設備無法充當 USB 主機時仍然可以與 USB 硬件交互。 當 Android 設備處于 USB 配件模式時,所連接的 Android USB 配件充當主機,為 USB 總線供電,并枚舉所連接的設備。 Android 3.1(API 級別12)支持 USB 配件模式,該功能也被以附加組件庫的方式回溯到 Android 2.3.4(API 級別10),以支持更廣泛的設備。前提是廠商必須在系統鏡像中添加附加組件庫。

選擇正確的 USB Accessory API 函數

盡管 USB accessory API 函數在 Android 3.1 引入到平臺,通過使用 Google APIs 附加庫的方式用在 Android 2.3.4 上。由于這些 APIs 使用外部庫的方式回溯,有兩個包可以導入來支持 USB 配件模式。根據你要支持的安卓設備,您可能要使用一個庫而不是另一個:

com.android.future.usb:?為了在 Android 2.3.4 中支持 USB accessory 模式,Google APIs add-on library?包括回溯的 USB accessory ?API,它們包含在此命名空間中。 Android 3.1 還支持在此命名空間中導入和調用類,以支持使用附加庫編寫的應用程序。 這個附加庫是圍繞?android.hardware.usb?accessory API 的簡版 wrapper,不支持USB主機模式。 如果您想支持最廣泛的支持 USB accessory 模式的設備,請使用附加庫并導入此軟件包。 重要的是要注意,并非所有的 Android 2.3.4 設備都需要支持 USB 配件功能。 每個單獨的設備制造商決定是否支持此功能,這就是為什么必須在 manifest 文件中聲明它。
android.hardware.usb:?此命名空間包含在 Android 3.1 中支持 USB accessory 模式的類。 該軟件包作為 framework API 的一部分,Android 3.1 支持 USB accessory 模式,而不需要附加庫。 如果您只關心具有 USB accessory 模式硬件支持的 Android 3.1 或更新版本,您可以在清單文件中聲明使用此軟件包。

安裝 Google APIs 附加庫

如果要安裝該附加庫,可以通過使用 SDK Manager 安裝 Google API Android API 10 軟件包。有關安裝附加庫的更多信息,請參閱?Installing the Google APIs Add-on

API 概述

由于附加庫是 framework API 的 wrapper,因此支持 USB accessory 功能的類很相似。 即使您正在使用附加庫,也可以使用?android.hardware.usb?的參考文檔。

Note:但是,您應該注意的附加庫和 framework API 之間存在較小的用法差異。
下表描述支持 USB accessory API 的類:
Class Description
UsbManager 允許枚舉以及與已連接 USB 配件通訊
UsbAccessory 表示USB 配件,包含訪問其標識信息的方法

附加庫和平臺 APIs 的使用差別

在使用?Google APIs 和平臺 APIs 之間有兩處使用區別。
如果正在使用附加庫,必須以下列方式獲取?UsbManager:

UsbManager manager = UsbManager.getInstance(this);

如果沒在使用附加庫,必須以下列方式獲取?UsbManager:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

當您使用 intent filter 過濾連接的配件時,UsbAccessory?對象包含在傳遞給應用程序的 intent 內。 如果正在使用附加庫,則必須以下列方式獲取?UsbAccessory?對象:

UsbAccessory accessory = UsbManager.getAccessory(intent);

如果沒在使用附加庫,必須以下列方式獲取?UsbAccessory:

UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

安卓 Manifest 要求

以下列表描述了在使用 USB accessory API 之前需要添加到應用程序的 manifest 文件中的內容。manifest and resource file examples?展示了如何聲明這些項目:

1. 因為并非所有 Android 設備被授權支持 USB accessory API,因此包含一個?<uses-feature>?元素,聲明您的應用程序使用?android.hardware.usb.accessory?功能。

2. 如果您正在使用附加庫,請添加指定?com.android.future.usb.accessory?的?<uses-library> 元素。

3. 如果您正在使用附加庫,請將應用程序的最小 SDK 設置為 API Level 10,如果使用的是android.hardware.usb 包,則將其設置為12。

4. 如果您希望應用程序在 USB 配件連接時收到通知,請在主要活動中為?android.hardware.usb.action.USB_ACCESSORY_ATTACHED 意圖指定?<intent-filter><meta-data> 元素對。<meta-data>?元素指向一個外部XML資源文件,它聲明了您想檢測的配件的標識信息。

在XML資源文件中,為要過濾的配件聲明 <usb-accessory> 元素。每個?<usb-accessory>?可以具有以下屬性:

  • manufacturer
  • model
  • version
將資源文件保存在?res/xml/?目錄中。資源文件名(不含 .xml 擴展名)必須與您在?<meta-data>?元素中指定的文件名相同。 XML資源文件的格式也展示在下面的?example?中

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?中,并且指定具有相關 model、manufacturer、version 的配件應該被過濾。配件將這些屬性發送給 Android 設備:

<?xml version="1.0" encoding="utf-8"?><resources><usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/> </resources>

使用配件

當用戶將 USB 配件連接到 Android 設備時,Android 系統可以決定您的應用程序是否對連接的配件感興趣。 如果是這樣,如果需要,您可以設置與附件的通信。如果是這樣,您可以根據需要建立與設備的通信。為此,您的應用程序必須:

1. 通過使用?intent filter?過濾配件連接事件來發現配件或通過枚舉已連接的配件找到正確的配件。

2. 請求用戶連接 USB 配件的權限,如果尚未獲得。

3. 在正確的接口端點上讀寫數據與 USB 配件進行通信。

發現配件

應用程序可以通過使用?intent filter?在用戶連接配件時收到通知或通過枚舉已連接的 USB 配件來發現 USB 配件。如果您希望能夠讓應用程序自動檢測到所需的配件,則使用?intent filter?非常有用。 如果要獲取所有連接的配件列表,或者您的應用程序沒有為 intent 進行過濾,則枚舉已連接的 USB 配件的方法非常有用。

使用 intent filter(意圖過濾器)

要使您的應用程序發現一個特定的 USB peijia,可以指定一個 intent filter 來過濾?android.hardware.usb.action.USB_ACCESSORY_ATTACHED?intent。?除了此 intent filter,您還需要指定一個資源文件,該資源文件指定 USB 配件的屬性,如 manufacturer、model 和 version。 當用戶連接與 accessory filter 匹配的配件時,

以下示例展示如何聲明 intent filter:

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

在你的活動中,你可以像這樣從 intent 中獲取表示連接附件的?UsbAccessory(使用附加庫)

UsbAccessory accessory = UsbManager.getAccessory(intent);

或者像這樣(使用平臺 APIs):

UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

枚舉配件

當應用程序運行時,可以讓應用程序枚舉已經標識自己的配件。

使用?getAccessoryList()?方法獲取所有已連接 USB 配件的數組:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbAccessory[] accessoryList = manager.getAcccessoryList();

Note:同一時間只可以支持一個已連接配件。

獲取與配件進行通信的權限

在與 USB 配件進行通信之前,應用程序必須獲得用戶的許可。

Note如果應用程序?uses an intent filter 來發現連接時的 USB 配件,則如果用戶允許您的應用程序處理 intent,則它將自動接收權限。如果沒有,您必須在連接到配件之前在應用程序中明確請求權限。

在某些情況下,顯式請求權限可能是必需的,例如當您的應用程序枚舉到已連接的 USB 配件,然后要與其進行通信時。在嘗試與之通信之前,您必須檢查訪問配件的權限。如果沒有,用戶拒絕訪問配件的權限時,您將收到 runtime 錯誤。

要明確獲得許可,首先創建一個廣播接收器。該接收器偵聽當您調用?requestPermission()?時獲得廣播的意圖。對?requestPermission()?的調用向用戶顯示一個對話框,請求連接到配件的權限。以下示例代碼展示了如何創建廣播接收器

private static final String ACTION_USB_PERMISSION ="com.android.example.USB_PERMISSION"; private final BroadcastReceiver mUsbReceiver = 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);}}}} };

要注冊廣播接收器,在活動的?onCreate()?方法中添加如下代碼:

UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); private static final String ACTION_USB_PERMISSION ="com.android.example.USB_PERMISSION"; ... mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver, filter);

要顯示請求用戶連接配件權限的對話框,調用?requestPermission()?方法

UsbAccessory accessory; ... mUsbManager.requestPermission(accessory, mPermissionIntent);

當用戶響應對話框時,廣播接收器收到包含額外值?EXTRA_PERMISSION_GRANTED?的 intent,這是表示答案的布爾值。 在連接配件之前,請檢查這個額外值是否為 true。

與配件通信

您可以使用 UsbManager?與配件通信,以獲取文件描述符,您可以配置輸入和輸出流來讀取和寫入數據到描述符。 數據流表示配件的輸入和輸出批量端點。 您應該在另一個線程中建立設備和配件之間的通信,因而不會阻塞主UI線程。 以下示例展示如何打開配件進行通信:

UsbAccessory mAccessory; ParcelFileDescriptor mFileDescriptor; FileInputStream mInputStream; FileOutputStream mOutputStream;...private void openAccessory() {Log.d(TAG, "openAccessory: " + accessory);mFileDescriptor = mUsbManager.openAccessory(mAccessory);if (mFileDescriptor != null) {FileDescriptor fd = mFileDescriptor.getFileDescriptor();mInputStream = new FileInputStream(fd);mOutputStream = new FileOutputStream(fd);Thread thread = new Thread(null, this, "AccessoryThread");thread.start();} }

在線程的 run()?方法中,可以使用?FileInputStream?或?FileOutputStream?對象來讀寫配件。 使用 FileOutputStream?對象從配件讀取數據時,請確保使用的緩沖區足夠大以存儲 USB 數據包數據。 Android 配件協議支持高達16384字節的數據包緩沖區,因此為了簡單起見,您可以選擇始終聲明緩沖區為此大小。

Note:注意:在較低級別,USB 全速配件的數據包為64字節,USB 高速配件為512字節。 為了簡單起見,Android 配件協議將兩個速度的數據包捆綁在一起成為一個邏輯數據包。

有關在 Android 中使用線程的更多信息,請參閱?Processes and Threads

終止與配件通信

當你與配件通信完成或者配件拔出時,調用?close()?方法關閉你打開的描述符。為了監聽拔除事件,如下所示創建廣播接收器:

BroadcastReceiver mUsbReceiver = 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}}} };

在應用程序中而不是 manifest 中創建廣播接收器允許應用在運行時只處理拔除事件。通過這種方式,廣播事件只會發送到當前正在運行的應用程序而不是廣播到所有應用。


原文鏈接:https://developer.android.com/guide/topics/connectivity/usb/accessory.html









總結

以上是生活随笔為你收集整理的安卓USB开发教程 三 USB Accessory的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。