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))
		{//拔出
			...
		} 
	}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

香橙派 AIpro上手体验并验证车道线识别算法

香橙派 AIpro上手体验并验证车道线识别算法 1.前言 最近入手了一块香橙派AIpro&#xff0c;体验了一下&#xff0c;感觉还不错&#xff0c;在这里分享给大家&#xff0c;大家可以做个参考。 2.开箱 整套产品包含一块主板、一个电源插头和一条双端Type-C的数据线&#xff0c;…

jenkins本地打包远程部署项目

1、 Jenkins简介 Jenkins是一款开源的持续集成工具&#xff0c;用于自动化构建、测试和部署软件项目。它可以通过插件扩展来支持各种不同的开发语言和工具。Jenkins提供了一个简单易用的Web界面&#xff0c;可以通过界面配置和管理构建任务&#xff0c;也可以通过命令行工具进…

实物资产的市场主线将逐步回归

民生证券认为&#xff0c;投资者逐渐意识到长期趋势并没有发生变化&#xff0c;这或许正是本周最大的变化。在预期博弈重回冷静期后&#xff0c;去金融化背景下实物资源占优的市场主线也将逐步回归。 1 高低切换后的冷静期 从4月下旬至上周&#xff0c;A股市场呈现出由高位资产…

【iOS】UI学习(二)

UI学习&#xff08;二&#xff09; 进度条和滑动条步进器与分栏控件警告对话框和提示等待器UITextFieldUITextField控件UITextFieldDelegate协议 UIScrollView布局子视图手动布局子视图自动布局子视图 进度条和滑动条 下面通过一个程序来讲解该内容&#xff1a; #import <…

c++函数基础总结

在给出的代码片段中&#xff0c;我们看到两部分内容&#xff1a;一个类定义和一个全局函数声明。让我们逐一分析它们&#xff1a; 类定义&#xff1a; cpp复制代码 class { public: void a(); }; 这个类定义是不完整的&#xff0c;因为它没有类名。但为了说明&#xff0c;我…

变量的作用域

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 变量的作用域是指程序代码能够访问该变量的区域&#xff0c;如果超出该区域&#xff0c;再访问时就会出现错误。在程序中&#xff0c;一般会根据变量…

HarmonyOS鸿蒙学习笔记(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的关系Component生命周期Entry生命周期 生命周期流程图生命周期展示示例代码参考资料 HarmonyOS的生命周期可以分为Compnent的生命周期和Entry的生命周期&#xff0c;也就是自定义组件的生命周期和页面的生命周期。 entry和Compone…

MySQL 索引使用(二)

本篇继续介绍有关索引的使用。 目录 一、SQL提示 二、单列索引和联合索引 三、覆盖索引 四、前缀索引 五、索引的使用原则 一、SQL提示 我们在使用索引来进行查询时&#xff0c;很有可能会出现一个字段中包含多个索引的情况&#xff0c;例如这里有一个name字段&#xff0c…

曾巩,散文的艺术与哲思

曾巩&#xff0c;字子固&#xff0c;世称南丰先生&#xff0c;南丰&#xff08;今江西&#xff09;人&#xff0c;生于北宋真宗天禧三年&#xff08;公元1019年&#xff09;&#xff0c;卒于北宋元丰六年&#xff08;公元1083年&#xff09;&#xff0c;享年64岁。他是中国北宋…

Unity开发——编辑器打包、3种方式加载AssetBundle资源

一、创建ab资源 &#xff08;一&#xff09;Unity资源设置ab格式 1、选中要打包成assetbundle的资源&#xff1b; 可以是图片&#xff0c;材质球&#xff0c;预制体等&#xff0c;这里方便展示用预制体打包设置展示&#xff1b; 2、AssetBundle面板说明 &#xff08;1&…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃&#xff0c;显示为空白页面。 比如下图的错误&#xff0c;导致了左侧页面直接白屏&#xff1a; 由于某一个组件报错导致整个页面崩溃是很严重的问题&#xff0c;那么我们应该如何去降低代码报错带来的影响呢&#xff1f; 我们…

JavaScript 动态网页实例 —— 窗口控制

除了打开和关闭窗口之外,还有很多其他控制窗口的方法。例如,可以使用 window.focus()方法使窗口获得焦点,也可以利用与其相对的window.blur 方法使窗口失去焦点。本节介绍移动窗口、改变窗口大小、窗口滚动、窗口超时操作、常用窗口事件、常用窗口扩展等窗口控制的方法和手段。…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件&#xff0c;它允许用户在多台计算机之间共享同一组键盘和鼠标&#xff0c;实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统&#xff0c;并且支持多种连接方式&#xff0c;包括局域网连接和无线连接。 使用 ShareMouse&…

从openstack环境中将服务器镜像导出的简单办法

1 登录openstack的页面&#xff0c;找到计划导出的主机信息。 通过实例名称&#xff0c; IP地址&#xff0c;找到对应的记录。点击实例名称&#xff0c;进入详情页。 在这里主要可以知道&#xff0c;当前主机在服务器上的文件ID&#xff0c;可以按这个ID去找对应的目录。 还可…

java读取文件内容(正则表达式匹配)

已知文件score.txt内容如下&#xff1a; 语文85分&#xff0c;数学89分&#xff0c;英语75分&#xff0c;马列95分。 要求解析出其中的成绩数据&#xff0c;并计算总成绩 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import jav…

JDK环境配置、安装

DK环境配置&#xff08;备注&#xff1a;分32位与64位JDK&#xff0c;32位电脑只能按照32位JDK&#xff0c;64位电脑兼容32、64位JDK&#xff09; 一、检查自己电脑是否安装过JDK 1.在电脑屏幕左下角&#xff0c;输入命令提示符CMD&#xff0c;打开命令提示符应用 2.在打开界…

QT系列教程(7) QLineEdit介绍

简介 QLineEdit属于输入插件&#xff0c;用来实现单行录入。支持几种录入模式。 Normal表示正常录入,录入的信息会显示在QLineEdit上。 Password表示密码录入的方式&#xff0c;录入的信息不显示QLineEdit&#xff0c;只是通过黑色圆点显示。 NoEcho 表示不显示录入信息&am…

“开源与闭源:AI大模型发展的未来之路“

文章目录 每日一句正能量前言数据隐私开源大模型与数据隐私闭源大模型与数据隐私数据隐私保护的共同考虑结论 商业应用开源大模型的商业应用优势&#xff1a;开源大模型的商业应用劣势&#xff1a;闭源大模型的商业应用优势&#xff1a;闭源大模型的商业应用劣势&#xff1a;商…

ros DWA局部规划模块

ROS-DWA模块 主要流程DWAPlannerROS::computeVelocityCommandsDWAPlannerROS::dwaComputeVelocityCommandsDWAPlanner::findBestPathSimpleScoredSamplingPlanner::findBestTrajectory 调参技巧DWA被目标点过度吸引&#xff0c;且不听全局规划器指挥 消融实验goal_front_costs_…

Java 异步编编程——Java内置线程池(Executor 线程池)

文章目录 知道线程池是什么以及解决什么问题Java 内置线程池Java 内置线程池设计结构及执行机制ThreadPoolExecutor 中的概念生命周期核心参数阻塞队列4 种任务拒绝策略 线程池使用场景 知道线程池是什么以及解决什么问题 线程池&#xff08;Thread Pool&#xff09;是一种基于…