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))
		{//拔出
			...
		} 
	}
};
相关推荐
2501_9159184142 分钟前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9511 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海1 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿1 小时前
毕业三年后,我离职了
android·面试
编程乐学2 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐2 小时前
Android14 init.rc中on boot阶段操作4
android
fatiaozhang95273 小时前
中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
android·xml·电脑·电视盒子·刷机固件·机顶盒刷机
Android出海5 小时前
Google Play账户与App突遭封禁?紧急应对与快速重构上架策略
android·网络·重构·新媒体运营·产品运营·内容运营
恋猫de小郭5 小时前
Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI
android·前端·flutter
锅拌饭6 小时前
saveEnabled导致的Fragment大量泄露
android