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

 该类提供的主要方法有: 

  1.  getDeviceList()      获得设备列表,返回的是一个HashMap<String,UsbDevice>
  2. hasPermission(UsbDevice device) 判断你的应用程序是否有接入此USB设备的权限,如果有则返回true,否则false
  3. openDevice(UsbDevice device)        打开USB 设备,以便向此USB设备发送和接收数据,返回一个关于此USB设备的连接
  4. requestPermission(UsbDevice device,PendingIntent pi)          向USB设备请求临时 的接入权限
  • UsbDevice       
  1. UsbDevice 代表一个USB设备的类,每个设备都包含了一个或多个接口,每个接口又包含一个或多个节点用来与此设备传输数据。该类的方法主要有
  1. getDeviceClass()    返回此USB设备的类别,用一个整型来表示
  2. getDeviceId()         返回唯一标识此设备的ID号,也用一个整型来表示
  3.  getDeviceName()     返回此设备的名称,用一个字符串来表示
  4.  getDeviceProtocol()       返回此设备的协议类别,用一个整型来表示
  5.  getDeviceSubclass ()      返回此设备的子类别,用一个整型来表示
  6.  getVendorId()                 返回生产商ID
  7.  getProductId()                 返回产品ID
  8.  getInterfaceCount()         返回此设备的接口数量
  9.  getInterface(int index)     得到此设备的一个接口,返回一个 UsbInterface
  • UsbInterface

代表USB 设备的一个接口,注意:UsbInterface 本身是一个类,并不是一个接口。此类的主要方法有:

  1. getId()           得到给接口的ID 号
  2. getInterfaceClass()            得到该接口的类别
  3. getInterfaceSubclass ()     得到该接口的子类
  4. getInterfaceProtocol()  得到该接口的协议类别
  5. getEndpointCount()    得到关于此接口的节点数量
  6. getEndpoint(int index)     对于指定的index获得此接口的一个节点,返回一个UsbEndpoint
  • UsbEndpoint

        代表一个接口的某个节点的类,该类主要提供了以下方法:

  1.  getAddress()   获得此节点的地址
  2.  getAttributes ( )   获得此节点的属性
  3.  getDirection()             获得此节点的数据传输方向
  •   UsbDeviceConnection 

    代表USB 连接的一个类。用此连接可以向USB 设备发送和接收数据,可以通过调用该方法openDevice(UsbDevice usbDevice)来得到该类的一个实例。该类提供了以下方法使用:

  1. 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属性指定了要过滤的数据设备信息,包括:

  1. vendor-id  设备生产商id
  2. product-id 设备id
  3. class 设备类别
  4. subclass 设备子类
  5. 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、终止通信