USB Host and Accessory

61 篇文章 3 订阅

USB Host

 

      USB Host,中文意思是USB主模式,是相对于USB accessory(USB副模式)来说的,前者是在android设备上插入一USB设备,android设备做为主机运行;后者也是在android设备上通过USB数据线插入另外一个设备,但插入的设备可以是一个完整的独立主机,也就是可以是另外一个android设备。需要注意的是以上两种模式在android API level-12以下是不支持的,也就是说只有android3.1及更高的版本才支持这两种模式

Android配置文件要求

       在你使用以上API进行开发之前,你需要在你的AndroidManifest.xml文件中添加以下内容:

   1.因为并不能保证所有的安卓设备都支持以上API,所以你需要声明:

<uses-sdk android:minSdkVersion="12" />12以下的版本是不支持以上APId的。

 

<uses-feature android:name="android.hardware.usb.host"/>    

   2.如果你想有一个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(deviceor interface) 协议类别      

             device_filter.xml文件放在res\xml目录下,其中文件名不包括扩展名部分需要与<meta-data/> 标签中声明的一致。示例如下:

             <?xmlversion="1.0" encoding="utf-8"?>

<resources>
    <usb-devicevendor-id="1234" product-id="5678" class="255"subclass="66" protocol="1" />
</resources>

开发步骤

   1.检测设备

      你的应用可以通过两种方式来发现USB设备,一种是用一个意图过滤器在用户连接一个设备时对其进行通知,另一种则是通过枚举您已经连接的所有USB设备。如果你希望你的应用能够自动的探测到你想要的设备,请使用一个意图过滤器来做。但是,如果你希望得到一个已连接设备的列表或者你不希望过滤意图,枚举所有的设备会是一个更好的选择。

     1)Intent Filter

          

为了让应用可以发现一个特定的USB设备,你可以为android.hardware.usb.action.USB_DEVICE_ATTACHED这个意图指定一个意图来进行过滤。伴随着这个意图过滤器,您需要指定一个资源文件来特别说明这个USB设备的属性,例如供应商和产品ID。当用户连接到一个符合你配件过滤条件的配件时,这个系统会谈出一个对话框询问他们是否希望开始你的应用。如果用户同意,那么你的应用在失去连接之前会自动获取和设备连接的权限。

下面的例子告诉你该如何声明这个意图过滤器:

<activity ...>

...
   

<intent-filter>
       

<actionandroid: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>

 

下面的例子告诉你怎么样声明指定你希望连接的USB设备的相关资源文件:

<?xmlversion="1.0"encoding="utf-8"?>
 

<resources>
   

<usb-devicevendor-id="1234"product-id="5678"/>

</resources>

     2)列举设备

          你可以通过UsbMnanger来列举已经连接的USB设备:代码如下

          首先,得到UsbMnanger的一个实例

UsbManager manager = (UsbManager)getSystemService(Context.USB_SERVICE);

          其次,通过此类的getDeviceList()方法得到包含所有已连接的USB设备的列表

HashMap<String, UsbDevice> deviceList= manager.getDeviceList();
           最后,通过设备名称来得到给设备对象

UsbDevice device =deviceList.get("deviceName");

          如果你想一个一个的列举所有的设备,可以实用迭代器,代码实例如下:

UsbManager manager = (UsbManager)getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){

UsbDevice device = deviceIterator.next()
//在这里添加处理设备的代码

}

   2.获得和设备通信的权限

      如果你实用intentfilter来发现一个USB设备,即上述方法1)那么应用程序可以自动的获取权限;

      如果是使用方法2)来检测USB设备,则你需要显示声明权限。其步骤如下:

      首先:创建一个广播接收器,接受请求权限的广播,代码如下:

private static final StringACTION_USB_PERMISSION =private final BroadcastReceiver mUsbReceiver = newBroadcastReceiver() {

private final BroadcastReceivermUsbReceiver = new BroadcastReceiver() {

public void onReceive(Context context,Intent intent) {

String action = intent.getAction();

if (ACTION_USB_PERMISSION.equals(action)) {

synchronized (this) {

UsbDevice device =(UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false)) {

if(device != null){

                          //在这里增加通信的代码

}}}}}};

  

        然后:在你的主Activity中注册该广播接收器,代码如下:

UsbManager mUsbManager= (UsbManager)getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION=
  "com.android.example.USB_PERMISSION";
mPermissionIntent=PendingIntent.getBroadcast(this,0,new Intent(ACTION_USB_PERMISSION),0);
IntentFilter filter= new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);

        最后,调用此函数 requestPermission() 来显示询问对话框,即在上面红线处添加如下代码:

mUsbManager.requestPermission(device,mPermissionIntent);

3.和设备通信

Android设备和一个连接它的USB设备通信即可以是同步的也可以使异步的,不管是那种情况,你都应该创建一个新的线程去负责所有的数据传输,以免阻塞UI线程。为了和US B设备建立通信,你首先需要得到合适的接口和节点,然后通过UsbDeviceConnection在此节点上进行数据的传输,由此你的代码应该:

1)检查该USB设备的属性,例如,生产商id,产品id,设备类别,以确定你是否需要和此设备进行通信。

2)当你确定要和此设备进行通信的时候,找到合适的接口和节点。

3)当你找到一个合适的节点后,用UsbDeviceConnection在此节点上打开连接。

4)使用bulkTransfer()或者controlTransfer() 来发送和接收数据。示例代码如下:

private Byte[] bytes
private static int TIMEOUT= 0;
private boolean forceClaim= true;
...

UsbInterface intf= device.getInterface(0);
UsbEndpoint endpoint= intf.getEndpoint(0);
UsbDeviceConnection connection= mUsbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do inanother thread

4.终止通信

    当你完成数据的传输或者你的设备已拔出时,通过调用releaseInterface() close()来关闭接口和连接。



Android开辟者指南(29) —— USB Host and Accessory


Admin
2011年11月6日
名人名言:友谊的最大努力并不是向一个朋友展示我们的缺陷,而是使他看到自己的缺陷。——拉罗什夫科 

 

媒介

  本章内容为Android开辟者指南的 USB章节,译为"USB主从设备",版本为Android 4.0 r1,翻译来自:"太阳火神的美丽人生",迎接接见他的博客:"http://alot.sinaapp.com",再次感激"太阳火神的魅" !等待你一路参与翻译Android的相干材料,接洽我over140@gmail.com。

 

声明

  迎接转载,但请保存文章原始出处:) 

    博客园:http://www.cnblogs.com/

    Android中文翻译组:http://goo.gl/6vJQl
 

 

 

USB Host and Accessory

译者签名:太阳火神的美丽人生

译者链接:http://alot.sinaapp.com

版本:Android 4.0 r1

原文

         http://developer.android.com/guide/topics/usb/index.html

 

USB主从设备

Android支撑各类USB外围设备,经由过程两种模式来支撑Android USB外设 (实现了 Android 外设和谈的硬件):USB 外设模式和USB主机模式。在 USB 外设模式下,外部 USB 硬件(装有Android的设备要连接的外部设备)充当 USB 主机。外设的例子包含机械人、扩大插座诊断和音乐设备、电子报亭、读卡器等其他设备。这种模式赐与不具备主机功能的 Android 设备以与USB硬件交互的才能。Android USB外设必须设计用来与装有Android的设备一路工作,并且必须遵守Android 外设通信和谈。在USB主机模式下,装有 Android 的设备扮演着主机的角色。这种设备的例子包含数码像机,键盘,鼠标和游戏手柄。那些适应面很广的USB设备仍可以与Android应用交互,前提是这些Android应用可以正确的与这些设备通信。

1显现了两种模式的异同。当Android设备处于主机模式时,它扮演USB主机角色并为总线供电。当Android设备处于附件模式时,被连接的USB硬件(在这种景象下是一个Android USB附件)扮演主机角色并给总线供电。

 

1. USB主从模式

USB外设和主机模式在Android 3.1 (API level 12)或更高的平台中直接支撑。USB外设模式作为一个外设库也被回馈到Android 2.3.4 (API level 10)来支撑更广泛的设备。设备厂商可以选择是否在设备的体系镜像中包含附加库。

重视:对USB主机和外设模式的支撑终极取决于设备的硬件,不管平台的等级(是几许)。你可以经由过程<uses-feature>元素过滤那些支撑USB主机和外设的设备。查看USB外设主机文档获取更多具体信息。

 

 

调试重视事项

当调试那些应用了USB外设和主机特点的应用时,你很有可能把你的USB硬件连接到你的Android设备上,这将阻拦你经由过程USB建树adbAndroid设备的连接。你经由过程收集仍可以接见adb。经由过程收集连接adb

  1. 经由过程USBAndroid设备连接到电脑。
  2. SDK  platform-tools 目次,在号令行输入adb tcpip 5555
  3. 输入:adb connect <设备的IP地址>:5555 ,你如今将被连接到Android设备并能像adb logcat一样发出通用的adb号令。
  4. 要设置你的设备监听USB,输入adb usb 

 

补充

         文章精选

                   USB百度百科

                   谷歌I/O大会主题演讲内容:走进新版蜂巢


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值