本文译自:http://developer.android.com/guide/topics/connectivity/usb/host.html
当你的Android设备在USB主机模式中时,它作为USB主机给从属设备供电,并会列举被连接的USB设备。USB主机模式在Android3.1以后开始被支持。
API概要
在开始之前,重要的是要理解工作中所需要的类。下表介绍了在android.hardware.usb包中的USB主机模式API。
表1.USB主机模式API
类 |
介绍 |
UsbManager |
用于列举被连接的USB设备,并跟其通信。 |
UsbDevice |
代表了一个被连接的USB设备,并且包含了访问它的识别信息、接口、和端点的方法。 |
UsbInterface |
代表了一个USB设备的接口,该接口定义了设备的一组功能。一个设备可以有一个或多个用于通信的接口。 |
UsbEndpoint |
代表一个接口端点,它是跟接口通信的通道。一个接口可以有一个或多个端点,通常会有跟设备进行双工通信的输入和输出端点。 |
UsbDeviceConnection |
代表一个设备连接,它在端点之上传输数据。这个类用于在连接的两个设备间使用同步或异步的方式来回发送数据。 |
UsbRequest |
代表一个通过UsbDeviceConnection对象跟设备通信的异步请求。 |
UsbConstants |
定义了跟Linux内核中linux/usb/ch9.h文件定义对应的USB常量。 |
在大多数情况中,跟USB设备通信时,需要使用所有这些类(如果你是在使用异步通信,那么只需要使用UsbRequest类)。通常,要使用UsbManager对象来获取期望的UsbDevice对象。当你有了这个UsbDevice对象时,就需要查找对应的UsbInterface对象和基于该接口通信的UsbEndpoint对象。一旦获取了正确的端点,就可以打开UsbDeviceConnect对象来跟USB设备进行通信了。
Android清单要求
在使用USB主机模式API工作之前,你需要把以下介绍的内容添加到你的应用程序清单中:
1. 因为不是所有的Android设备都保证支持USB主机模式,所以要在你的应用程序声明中包含<uses-feature>元素,以声明你的应用程序要使用android.hardware.usb.host功能。
2. 把应用程序的最小SDK设置为API Level 12或更高的版本。在较早的API版本中不存在USB主机模式API。
3. 如果你希望你的应用程序能够获得接入USB设备时的通知,那么还要在你的主Activity中指定用android.hardware.usb.action.USB_DEVICE_ATTACHED类型的Intent来配对的<intent-filter>和<meta-data>元素。<meta-data>元素要指向一个外部的XML资源文件,该文件声明了希望检测的设备的识别信息。
在这个XML资源文件中,要用<usb-device>元素来声明你想要过滤的USB设备。以下列出了<usb-device>元素的属性。通常,使用vendor-id和product-id来指定你所希望过滤的特定的设备,并且使用class、subclass和protocol来指定你所希望过滤的USB设备组,如大容量存储设备或数码相机。你可以不指定任何属性,或所有全部属性。不指定任何属性,就会跟所有USB设备匹配,如果应用程序需要,就可以这样做:
A. vendor-id
B. product-id
C. class
D. subclass
E. protocol(设备或接口)
在res/xml目录中保存这个资源文件。该资源文件的名称(不含.xml扩展名)必须跟<meta-data>元素中指定的名称相同。XML资源文件的格式请看下例。
清单和资源文件的示例
以下是一个简单的清单文件和它所对应的资源文件:
<manifest ...>
<uses-feature android:name="android.hardware.usb.host" />
<uses-sdk android:minSdkVersion="12" />
...
<application>
<activity ...>
...
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>
</manifest>
在这个实例中,下面的资源文件应该被保存在res/xml/device_filter.xml中,并且指定了所有的用于过滤USB设备的属性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" />
</resources>