Android USB 支持两种模式:1. 主机模式;2. 配件模式;这里我们主要梳理HOST模式的使用;

USB 模块的使用可参考官方文档:

USB 主机和配件概览  |  Android 开发者  |  Android Developers (google.cn)

使用流程总结

  1. 发现连接的 USB 设备,具体方法是使用 Intent 过滤器在用户连接 USB 设备时接收通知,或者枚举已连接的 USB 设备。
  2. 请求用户授予连接到 USB 设备的权限(如果尚未获得权限)。
  3. 通过在适当的接口端点读取和写入数据来与 USB 设备通信。
  4. 完成通信或设备断开后释放资源。

配置清单文件

  1. 使用 <uses-feature> 来声明需要使用 android.hardware.usb.host
  2. 通过 intent-filter 来声明接收USB设备连接的通知;
    1. 通过 action 声明通知类型
    2. 通过 meta-data 声明感兴趣的设备(过滤);
<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>

device-filter 文件:

    <?xml version="1.0" encoding="utf-8"?><resources><usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" /></resources>

如果您想过滤某个特定设备,请使用供应商 ID 和产品 ID;如果您想过滤一组 USB 设备(例如大容量存储设备或数码相机),请使用类、子类和协议。您可以指定所有这些属性,也可以不指定任何属性。如果不指定任何属性,则会与每个 USB 设备进行匹配

获取设备

  1. 获取触发设备
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
  1. 枚举设备
    通过 getDeviceList 方法来枚举设备:
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);...HashMap<String, UsbDevice> deviceList = manager.getDeviceList();UsbDevice device = deviceList.get("deviceName");

申请通信权限

  1. 如果应用使用 Intent 过滤器来发现已连接的 USB 设备,则它会在用户允许应用处理 Intent 时自动获得权限。否则,必须在应用中明确请求权限,然后才能连接到设备。
  2. 手动申请权限
  3. 创建广播接收器
    private static final String ACTION_USB_PERMISSION ="com.android.example.USB_PERMISSION";private final BroadcastReceiver usbReceiver = 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){//call method to set up device communication}}else {Log.d(TAG, "permission denied for device " + device);}}}}};
  1. 注册广播接收器:
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);private static final String ACTION_USB_PERMISSION ="com.android.example.USB_PERMISSION";...permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);registerReceiver(usbReceiver, filter);
  1. requestPermission
    UsbDevice device;...usbManager.requestPermission(device, permissionIntent);

当用户在该对话框中作出回复时,广播接收器会收到包含 EXTRA_PERMISSION_GRANTED extra 的 Intent,即表示回答的布尔值。在连接到设备之前,需要检查此 extra 的值是否为 true。

设备通信

与 USB 设备的通信可以是同步的,也可以是异步的。在两种情况下,都应该创建一个新线程来执行所有数据传输,这样就不会锁定UI线程。要正确设置与设备的通信,需要获取要与之通信的设备的相应 UsbInterface 和 UsbEndpoint,并使用 UsbDeviceConnection 在此端点发送请求。通常,您的代码应该执行以下操作:

  • 检查 UsbDevice 对象的属性(例如产品 ID、供应商 ID 或设备类别),判断您是否要与设备通信。
  • 在您确定要与设备通信时,找到您要用于通信的适当 UsbInterface 以及该接口的适当 UsbEndpoint。接口可以具有一个或多个端点,并且通常具有用于双向通信的输入和输出端点。
  • 找到正确的端点后,在该端点上打开 UsbDeviceConnection
  • 使用 bulkTransfer() 或 controlTransfer() 方法提供要在端点上传输的数据。您应该在另一个线程中执行此步骤,以防止主界面线程被锁定。如需详细了解如何在 Android 中使用线程,请参阅进程和线程。

同步数据传输

  private Byte[] bytes;private static int TIMEOUT = 0;private boolean forceClaim = true;UsbInterface intf = device.getInterface(0);UsbEndpoint endpoint = intf.getEndpoint(0);UsbDeviceConnection connection = usbManager.openDevice(device);connection.claimInterface(intf, forceClaim);//do in another threadconnection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT);

异步数据传输

使用 UsbRequest 类以 initialize 和 queue 异步请求,然后使用 requestWait() 等待结果。

如需了解详情,请参阅 AdbTest 示例(展示了如何执行异步批量传输)和 MissileLauncher 示例(展示了如何异步监听中断端点)。

  • AdbDevice.java | Android中文API (android-doc.com)

终止通信

  • 监听断开连接事件,创建如下广播接收器:
 BroadcastReceiver usbReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// call your method that cleans up and closes communication with the device}}}};
  • 当完成与设备的通信或者设备断开连接后,调用 releaseInterface() 和 close() 来关闭 UsbInterface 和 UsbDeviceConnection

安卓USB模块分析(二)- API使用相关推荐

  1. 安卓USB模块源码分析(一)- 准备

    介绍USB服务在Android服务体系中的位置,源码的位置及使用AndroidStudio 查看USB模块FWK的配置方式. Windows环境准备 WSL2安装及AOSP源码下载编译 (shimo. ...

  2. 安卓USB开发教程 二 USB Host

    USB Host(主机模式) 当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备.Android 3.1 及更高版本支持 USB 主机模式. ...

  3. Linux内核LED模块分析(二)

    Linux内核LED模块分析(二) 上次分析到那里后,还是有些同志说看不懂,那我就继续分析一把我认为不需要继续分析的东西吧.上回分析了 led_cdev和trigger的关系后就没有继续说了.有同志还 ...

  4. USB模块分析(四)- 设备列表权限申请

    getDeviceList 其调用入口位于 UsbManager中: // frameworks/base/core/java/android/hardware/usb/UsbManager.java ...

  5. BetaFlight模块设计之二十:CMS菜单模块分析

    BetaFlight模块设计之二十:CMS菜单模块分析 CMS菜单模块 CMS菜单按键控制 CMS菜单Elements CMS_Menu OSD_Etnry Element类型 可调Element类型 ...

  6. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

  7. 来自damon的zencart二次开发教程-2.2登录模块分析

    我们在制作zencart的模板时,经常会遇到需要将zencart的登陆页面与注册账户页面分离的情况(在 默认情况下,点击"Login"按钮会进入登陆页面与注册账号页面,登录zenc ...

  8. BetaFlight模块设计之三十二:MSP协议模块分析

    BetaFlight模块设计之三十二:MSP协议模块分析 1. MSP协议模块 1.1 MSP描述 1.2 MSP版本优缺点 1.3 MSP代码资源 2. MSP报文解析 2.1 MSP收包状态机 2 ...

  9. BetaFlight模块设计之二十九:滤波模块分析

    BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...

最新文章

  1. phpcms v9 为分类和内容添加伪静态
  2. mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
  3. tableau可视化数据分析60讲(二十一)-tableau预测及趋势线
  4. 改善前端优化的有用技巧
  5. python——xpath
  6. MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
  7. Hadoop的数据管理
  8. python判断回文_Python实现判断一个整数是否为回文数算法示例
  9. numpy中的对应元素相乘,可以使用广播
  10. 牛顿法的优缺点及特征
  11. 应用开发框架之——数据字典、原数据、模板
  12. 灰色系统理论及其应用 (一) :灰色系统概论、关联分析、与传统统计方法的比较
  13. 5个免费音效素材网站
  14. 活动现场大屏幕互动系统源码,包含3D签到投票抽奖等功能
  15. 微信小程序动态加载组件
  16. 查SCI索引号和EI索引号的方法
  17. Python——域名解析成IP地址
  18. Win8或Win8.1下输入法小技巧,个人习惯,可参考
  19. Ubuntu 16.04开机出现Kernel panic 。。。解决办法(亲测有效)
  20. 最简单的分类算法之一:KNN(原理解析+代码实现)

热门文章

  1. 元宵节趣味知识答题活动小程序
  2. PHP客户关系项目,【php源码】最新企业客户关系管理系统CRM源码|Thinkphp开发企业客户关系管理系统响应式源码 线索发掘、商机转化、客户挖掘、客户关怀、报表统计等...
  3. Java实现敏感词过滤
  4. L学姐美团金融测开面经
  5. 如何进行优秀的时间管理
  6. Docker 系列之 DockerDesktop 初步安装
  7. 以色列教育孩子的方法
  8. 暴走英雄坛怎么领服务器维护奖励,暴走英雄坛:日常任务押镖,如何轻松获得最高奖励,做到这几点...
  9. 南航毕业程序媛中奖一个亿裸辞后:30岁没钱没工作!中奖不如写代码
  10. 微商如何做销售(一)