Android USB
通信
- Author: 迷你小猪
- Date:
2020-09-07
- Email:
Benjie1017@outlook.com
知识简介:
-
Android
通过USB
配件和USB
主机两种模式支持各种USB
外围设备和Android USB
配件(实现Android
配件协议的硬件)。-
在
USB
配件模式下,外部USB
硬件充当USB
主机,配件包括机器人控制器、扩展坞、音乐设备、自助服务终端、读卡器等。不具备主机功能的Android
设备就能够与USB
硬件互动。Android USB
配件必须设计为与Android
设备兼容,并且必须遵守Android
配件通信协议。 -
在
USB
主机模式下,Android
设备充当主机,设备包括数码相机、键盘、鼠标和游戏控制器等。针对各类应用和环境设计的USB
设备仍可与能够与设备正常通信的Android
应用互动。
-
-
下图展示了这两种模式之间的差异。
-
当
Android
设备处于主机模式时,它会充当 USB 主机并为总线供电。 -
当
Android
设备处于USB
配件模式时,所连接的USB
硬件(本例中为Android USB
配件)充当主机并为总线供电。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OuBVIJUv-1605706806773)(https://developer.android.com/images/usb-host-accessory.png)]
-
-
Android 3.1
(API 级别 12)或更高版本的平台直接支持 USB 配件和主机模式。USB 配件模式还作为插件库向后移植到Android 2.3.4
(API 级别 10)中,以支持更广泛的设备。设备制造商可以选择是否在设备的系统映像中添加该插件库。
USB
通信模式简称:
-
Accessory Mode
: 配件模式,以下简称AM
-
Host Mode
: 主机模式,以下简称HM
-
USB
设备管理器:-
Android 2.3.4
版本:UsbManager manager = UsbManager.getInstance(this);
-
Android 3.1
版本:UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
-
USB AM
介绍:
获取指定的配件设备:
-
获取已连接的配件(通过清单文件结合
IntentFilter
获取):-
Android 2.3.4
版本:UsbAccessory accessory = UsbManager.getAccessory(intent);
-
Android 3.1
版本:UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
-
-
配置
AndroidManifest.xml
:-
Android 2.3.4
版本:-
添加
<uses-feature>
元素来声明您的应用使用com.android.future.usb.accessory
功能<uses-feature android:name="com.android.future.usb.accessory" android:required="true"/> <uses-sdk android:minSdkVersion="10" />
-
-
Android 3.1
版本:-
添加
<uses-feature>
元素来声明您的应用使用android.hardware.usb.accessory
功能<uses-feature android:name="android.hardware.usb.accessory" android:required="true"/> <uses-sdk android:minSdkVersion="12" />
-
-
-
如果需要动态监听
USB
配件的连接或断开,需要在Activity
的标签中制定<intent-filter>
和<meta-data>
元素。其中,<meta-data>
元素指向一个外部XML
资源文件,该文件位于res/xml/
路径下,声明了关于要检测的配件的识别信息。该XML
资源文件中,为要过滤的配件声明<usb-accessory>
元素。每个<usb-accessory>
可以包含属性:manufacturer、model 、version
。-
activity 标签配置示例:
<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>
-
型号、制造商、版本信息的
xml
文件如:<?xml version="1.0" encoding="utf-8"?> <resources> <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/> </resources>
-
获取设备列表:
-
获取已连接的所有 USB 配件的列表
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbAccessory[]