1. USB Host介绍
Usb Host (USB主模式),是相对于USB Accessory(USB副模式)来说的
如果Android工作在USB Host 模式下,则连接到Android 上的USB 设备把Android类似的看作是一台PC机,PC机能干的事,Android也能干,例如将鼠标、键盘插入则可以使用 它们来操作Android操作系统,如果插入U盘,则通过Android可以读写U盘上的数据。
而USB Accessory模式(USB副模式)表示将Android设备当作一个USB的键盘、鼠标、U盘插入到电脑主机上一样使用。这两种模式在Android API level-12 以上才支持,即 Android 3.1 及更高的版本支持这两种模式。
2. USB Host 模式介绍
- UsbManager
负责管理USB 设备的类,获取一个此对象的实例:
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
该类提供的主要方法有:
- getDeviceList() 获得设备列表,返回的是一个HashMap<String,UsbDevice>
- hasPermission(UsbDevice device) 判断你的应用程序是否有接入此USB设备的权限,如果有则返回true,否则false
- openDevice(UsbDevice device) 打开USB 设备,以便向此USB设备发送和接收数据,返回一个关于此USB设备的连接
- requestPermission(UsbDevice device,PendingIntent pi) 向USB设备请求临时 的接入权限
- UsbDevice
- UsbDevice 代表一个USB设备的类,每个设备都包含了一个或多个接口,每个接口又包含一个或多个节点用来与此设备传输数据。该类的方法主要有
- getDeviceClass() 返回此USB设备的类别,用一个整型来表示
- getDeviceId() 返回唯一标识此设备的ID号,也用一个整型来表示
- getDeviceName() 返回此设备的名称,用一个字符串来表示
- getDeviceProtocol() 返回此设备的协议类别,用一个整型来表示
- getDeviceSubclass () 返回此设备的子类别,用一个整型来表示
- getVendorId() 返回生产商ID
- getProductId() 返回产品ID
- getInterfaceCount() 返回此设备的接口数量
- getInterface(int index) 得到此设备的一个接口,返回一个 UsbInterface
- UsbInterface
代表USB 设备的一个接口,注意:UsbInterface 本身是一个类,并不是一个接口。此类的主要方法有:
- getId() 得到给接口的ID 号
- getInterfaceClass() 得到该接口的类别
- getInterfaceSubclass () 得到该接口的子类
- getInterfaceProtocol() 得到该接口的协议类别
- getEndpointCount() 得到关于此接口的节点数量
- getEndpoint(int index) 对于指定的index获得此接口的一个节点,返回一个UsbEndpoint
- UsbEndpoint
代表一个接口的某个节点的类,该类主要提供了以下方法:
- getAddress() 获得此节点的地址
- getAttributes ( ) 获得此节点的属性
- getDirection() 获得此节点的数据传输方向
- UsbDeviceConnection
代表USB 连接的一个类。用此连接可以向USB 设备发送和接收数据,可以通过调用该方法openDevice(UsbDevice usbDevice)来得到该类的一个实例。该类提供了以下方法使用:
- bulkTransfer(UsbEndpoint endpoint , byte[] buffer , int length , int timeout)
通过给定的endpoint 来进行大量的数据传输,传输的方向取决于该节点的方向,buffer是要发送或接收的字节数组,length是该字节数组的长度。失败则返回负数
2. controlTransfer( int requestType, int request , int value , int index , byte[] buffer , int length , int timeout)
该方法通过0节点向此设备传输数据,传输的方向取决于请求的类别,如果requestType 为 USB_DIR_OUT 则为写数据 , USB _DIR_IN ,则为读数据
Android配置文件要求
在使用以上API进行开发之前,你需要在你的AndroidManifest.xml 文件中添加以下内容
声明最低安装版本
<uses-sdk android:minSdkVersion="12"/>
<uses-feature android:name="android.hardware.usb.host"/>
如果想有一个USB设备接入你的安卓设备时能够通知你的应用程序,那么你需要在你的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" />
Resource属性指定了要过滤的数据设备信息,包括:
- vendor-id 设备生产商id
- product-id 设备id
- class 设备类别
- subclass 设备子类
- protocol(device or interface )协议类别
device_filter.xml文件放在res/xml目录下,其中文件名需要与<meta-data/>标签中声明的一致。示例:
<?xml version="1.0" encoding="utf-8"?>
<resource>
<usb-device
class="255"
product-id="5678"
protocol="1"
subclass="66"
vendor-id="1234" />
</resource>
开发步骤
1、检测设备
应用可以通过两种方式来发现USB设备,一种是用一个意图过滤器在用户连接一个设备时对其进行通知,另一种是通过枚举已经连接的所有USB设备。如果你希望应用能够自动的探测到你想要的设备,请使用一个意图过滤器来实现。
2、获得和设备通信的权限
3、和设备通信
4、终止通信