当前位置: 首页 > news >正文

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 插入或拔出做些处理,还需要配置一下:

<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" />

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

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

整合起来 AndroidManifest.xml 为:

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

 代码

查找设备

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

for (UsbDevice device : mUsbManager.getDeviceList().values())
{if( device.getVendorId() == 1061 && device.getProductId() == 33113 ) {}
}

动态申请USB权限 

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

private static final String ACTION_USB_PERMISSION = "com.example.test.USB_PERMISSION";IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);//权限结果处理
private BroadcastReceiver mUsbReceiver = 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)){//用户授予权限...}else{//用户拒绝了...}}} }
};//请求权限
if(!mUsbManager.hasPermission(device))
{Intent intent = new Intent(ACTION_USB_PERMISSION);PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, intent, 0);mUsbManager.requestPermission(device, mPermissionIntent);
}

 接收USB插、拔的通知

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

IntentFilter filter = new IntentFilter();
...
//添加插拔的监听
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUsbReceiver, filter);//处理
private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_USB_PERMISSION.equals(action)) {...}else if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)){//插入...}else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){//拔出...} }
};

相关文章:

  • python项目中的日志定义
  • Qt for android : libusb在android中使用
  • gitea的git库备份与恢复
  • nacos连接异常did not find the Leader node;
  • JAVA应用服务器如何快速定位CPU问题
  • 【vue】@、@/、../和./的区别
  • apollo版本更新简要概述
  • 【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径
  • 现货白银的交易时间有多连贯?
  • 数据结构(六)队列
  • 计算机视觉与模式识别实验1-2 图像的形态学操作
  • PostgreSQL入门教程
  • 【算法】位运算算法——消失的两个数字(困难)
  • FinalShell无法连接Linux
  • 【论文导读】Grid Graph Reduction for Efficient Shortest Pathfinding(2023 Access)
  • ES6指北【2】—— 箭头函数
  • $translatePartialLoader加载失败及解决方式
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 4个实用的微服务测试策略
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JS题目及答案整理
  • KMP算法及优化
  • mysql外键的使用
  • Python学习之路13-记分
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • SQLServer插入数据
  • windows-nginx-https-本地配置
  • 读懂package.json -- 依赖管理
  • 聊聊directory traversal attack
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 使用权重正则化较少模型过拟合
  • 一份游戏开发学习路线
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 数据可视化之下发图实践
  • 正则表达式-基础知识Review
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • "无招胜有招"nbsp;史上最全的互…
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #APPINVENTOR学习记录
  • #知识分享#笔记#学习方法
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (11)MATLAB PCA+SVM 人脸识别
  • (12)Hive调优——count distinct去重优化
  • (4)事件处理——(7)简单事件(Simple events)
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (day18) leetcode 204.计数质数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (floyd+补集) poj 3275
  • (PySpark)RDD实验实战——求商品销量排行
  • (二)springcloud实战之config配置中心
  • (分类)KNN算法- 参数调优
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (七)Flink Watermark