当前位置:   article > 正文

USB主机模式——Android

USB主机模式——Android

理论

摘自:USB 主机和配件概览  |  Connectivity  |  Android Developers (google.cn)

Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件)。

在 USB 主机模式下,Android 设备充当主机。设备示例包括数码相机、键盘、鼠标和游戏控制器。当 Android 设备处于主机模式时,它会充当 USB 主机并为总线供电。

Android 3.1(API 级别 12)或更高版本的平台直接支持 USB 配件和主机模式。USB 配件模式还作为插件库向后移植到 Android 2.3.4(API 级别 10),以支持更广泛的设备。设备制造商可以选择是否在设备的系统映像中包含插件库。

注意:对 USB 主机和配件模式的支持最终取决于设备的硬件,而与平台级别无关。您可以通过 <uses-feature> 元素过滤出支持 USB 主机和配件的设备。如需了解详情,请参阅 USB 配件主机文档。

主机模式

官网使用说明:

USB 主机概览  |  Connectivity  |  Android Developers (google.cn)

其实官网写的很清楚了,但是有些东西还是要实践后才能真正清楚。

AndroidManifest.xml 

添加特征

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

如果需要程序在USB 插入或拔出做些处理,还需要配置一下:

  1. <intent-filter>
  2. <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
  3. </intent-filter>
  4. <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
  5. android:resource="@xml/device_filter" />

其中res/xml/device_filter.xml如下(供应商id值和产品id值都是厂家提供的):

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <usb-device vendor-id="1061" product-id="33113"/>
  4. </resources>

整合起来 AndroidManifest.xml 为:

  1. <manifest ...>
  2. <uses-feature android:name="android.hardware.usb.host" />
  3. <uses-sdk android:minSdkVersion="12" />
  4. ...
  5. <application>
  6. <activity ...>
  7. ...
  8. <intent-filter>
  9. <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
  10. </intent-filter>
  11. <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
  12. android:resource="@xml/device_filter" />
  13. </activity>
  14. </application>
  15. </manifest>

 代码

查找设备

通过枚举的方式查找设备:

  1. for (UsbDevice device : mUsbManager.getDeviceList().values())
  2. {
  3. if( device.getVendorId() == 1061 && device.getProductId() == 33113 )
  4. {
  5. }
  6. }

动态申请USB权限 

 如果没有USB权限,需要动态请求:

  1. private static final String ACTION_USB_PERMISSION = "com.example.test.USB_PERMISSION";
  2. IntentFilter filter = new IntentFilter();
  3. filter.addAction(ACTION_USB_PERMISSION);
  4. registerReceiver(mUsbReceiver, filter);
  5. //权限结果处理
  6. private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
  7. public void onReceive(Context context, Intent intent) {
  8. String action = intent.getAction();
  9. if (ACTION_USB_PERMISSION.equals(action)) {
  10. synchronized (this)
  11. {
  12. UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
  13. if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false))
  14. {//用户授予权限
  15. ...
  16. }
  17. else
  18. {//用户拒绝了
  19. ...
  20. }
  21. }
  22. }
  23. }
  24. };
  25. //请求权限
  26. if(!mUsbManager.hasPermission(device))
  27. {
  28. Intent intent = new Intent(ACTION_USB_PERMISSION);
  29. PendingIntent mPermissionIntent = PendingIntent.getBroadcast(
  30. this, 0, intent, 0);
  31. mUsbManager.requestPermission(device, mPermissionIntent);
  32. }

 接收USB插、拔的通知

如果需要接收USB插、拔的通知,在清单配置完成后,添加监听。

  1. IntentFilter filter = new IntentFilter();
  2. ...
  3. //添加插拔的监听
  4. filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
  5. filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
  6. registerReceiver(mUsbReceiver, filter);
  7. //处理
  8. private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
  9. public void onReceive(Context context, Intent intent) {
  10. String action = intent.getAction();
  11. if (ACTION_USB_PERMISSION.equals(action))
  12. {
  13. ...
  14. }
  15. else if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action))
  16. {//插入
  17. ...
  18. }
  19. else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action))
  20. {//拔出
  21. ...
  22. }
  23. }
  24. };

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号