当前位置:操作系统 > 安卓/Android >>

Android USB Host


目录
 [隐藏]
1USB主机
1.1文档内容
1.2相关例子
1.3API概述
1.4Android中manifest文件的需求
1.4.1Manifest文件和资源文件的例子
1.5用配件工作
1.5.1发现设备
1.5.1.1使用一个意图过滤器
1.5.1.2枚举所有配件
1.5.2获得使用一个配件的权限
1.5.3和设备之间的“交流”
1.5.4中止和设备的“交流”
USB主机
文档内容
API概述
Android中manifest文件需求
工作的设备
发现设备
获得和设备进行“交流”的权限
和设备进行“交流”
中止和设备的“交流”
相关例子
Adb测试用例
相关链接
当您搭载Android系统的设备处于USB主机模式时,它就像一个USB主机,为总线提供能源,并且列举出所有已经连接上的设备。在Android 3.1或者更高的版本中支持USB主机模式。
API概述
在您开始之前,有个很重要的一点就是您必须对将要用到的类有个了解。下面的表格就向您描述了在android.hardware.usb这个包下USB主机APIs的一些特点。
表1.USB主机APIs
Class/Inte易做图ce  Description
UsbManager
允许您枚举已连接的USB设备并且与其进行“交流”。
UsbDevice
代表了一个已连接的USB的设备并且包含具有该设备验证信息,接口和接入点的方法。
UsbInte易做图ce
代表了一个USB设备的一个接口,该接口定义了一系列关于设备的函数。一个设备在进行“交流”的时候可以有一个或者多个接口。
UsbEndpoint
代表一个接口的接入点,该接入点就是这个接口的通信信道。一个接口可以有一个或者多个这样的接入点,而且一般都是有输入和输出双向通信的接入点。
UsbDeviceConnection
代表该设备的一个连接,用来在接入点上传输数据。这个类允许您能用同步或者异步的方式发送和返回数据。
UsbRequest
在通过UsbDeviceConnection和设备进行“交流”的一个异步请求。
UsbConstants
关于在linux内核中linux/usb/ch9.h的相关定义的USB常量。
在大多数的情况之下,在和一个USB设备进行“交流”时,上面这些类都需要用到(UsbRequest这个类只有在您做异步通信的时候才会用到)。一般来说,您可以通过查询要操作的UsbDevice来获得一个UsbManager。当您有这个设备时,您需要找到正确的UsbInte易做图ce以及和这个接口所对应的UsbEndpoint来进行和设备的“交流”。一旦您获得了正确的接入点,打开UsbDeviceConnection来和该USB设备进行“交流”。
Android中manifest文件的需求
下面的列表就是描述您应该在用USB主机APIs之前应该在您的应用中的manifest文件中添加些什么:
因为不是所有的搭载Android系统的设备都能保证支持USB主机的APIs,不能包含那个声明您的应用使用android.hardware.usb.host这一特点的android.hardware.usb.host的这一元素。
设置您的应用的最低的SDK版本在12级或者更高。这个USB主机APIs不在更前面的版本之中。
如果您希望您的应用能够被连接的USB设备所提示,只要在您的主activity中在<intent-filter>和<meta-data>元素对中添加一个android.hardware.usb.action.USB_DEVICE_ATTACHED意图。<meta-data>元素指向一个额外的XML资源文件,该文件是用来声明验证您希望探测到的设备的验证信息。
   在这个XML资源文件中,为您希望过滤的USB设备声明<usb-device>元素。下面的列表描述<usb-device>的属性。一般来说,如果您想为一个特定的设备过滤就使用该产品的供应商和产品ID,如果您希望为一组USB设备,例如大量存储设备或者是数码相机来进行过滤那么就应该用类,子类和协议。您可以不指定这些属性,也可以指定所有的属性。不为每个设备指定属性,只有在您的应用需要它时才这么做(这句话翻译的一点问题^_^):
供应商ID
产品ID

子类
协议(设备或者借口)
   将您的资源文件保存到res/xml/目录下。资源文件名(不包含.xml的扩展名)必须和您在<meta-data>元素中指明的那个名字。在下面的例子中是这个XML资源文件的格式。
Manifest文件和资源文件的例子
下面的例子告诉您一个manifest文件以及与它相关资源文件的例子:
<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>
 
用配件工作
当用户将USB配件连接到搭载Android系统的设备上面时,Android系统会判断您的应用是否适用于已连接的该配件。如果适用,您就可以根据您的喜好为该设备建立连接。要这么做,您的应用必须做下面这些动作:
您需要通过一个可以过滤USB设备附加事件的意图过滤器或者枚举已连接的USB设备来发现连接的配件来找到合适的接口。
尚未获得许可的用户在适用USB设备操作时需要验证权限。
通过在接入的端点进行读写数据的操作达到和USB设备交互的目的。
发现设备
您的应用可以通过两种方式来发现USB设备,一种是用一个意图过滤器在用户连接一个设备时对其进行通知,另一种则是通过枚举您已经连接的所有USB设备。如果您希望您的应用能够自动的探测到你想要的设备,请使用一个意图过滤器来做。但是,如果您希望得到一个已连接设备的列表或者您不希望过滤意图,枚举所有的设备会是一个更好的选择。
使用一个意图过滤器
为了让您的应用可以发现一个特定的USB设备,您可以为android.hardware.usb.action.USB_DEVICE_ATTACHED这个意图指定一个意图来进行过滤。伴随着这个意图过滤器,您需要指定一个资源文件来特别说明这个USB设备的属性,例如供应商和产品ID。当用户连接到一个符合您配件过滤条件的配件时,这个系统会谈出一个对话框询问他们是否希望开始您的应用。如果用户同意,那么您的应用在失去连接之前会自动获取和设备连接的权限。
下面的例子告诉您该如何声明这个意图过滤器:
<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>
 

 
<?xml version="1.0" encoding="utf-8"?>
 
<resources>
    <usb-device vendor-id="1234" product-id="5678" />
</resources>

 
 在您的activity文件中,您可以从像这样的意图(有附加类的)中获取UsbDevice来代表这个相关的配件:
 
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

枚举所有配件
您可以使您的应用在运行时列举出所有能够被识别的USB设备。通过getDeviceList()方法来获得一个包含所有已连接USB配件的数组:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
... 
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
UsbDevice device = deviceL

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,