A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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、终止通信


4 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
很详细,收了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马