怎么加载android usb资源,Android USB 开发

Android通过两种模式支持各种USB设备: USB accessory 和USB host。(Android 3.1 API 12 以上)

对USB主机和附件模式的支持最终取决于设备的硬件,和API级别无关。可以通过元素过滤支持USB主机和附件的设备。

在这种情况下,因为USB接口被占用,使用WiFi调试

$ adb connect device_ip_address(电脑开WiFi,手机连接的IP)

USB Host Mode主机模式

Android设备充当主主设备,并为总线供电。

例如数字相机,键盘,鼠标和游戏控制器。USB设备与Android应用进行数据交互。

USB Accessory Mode附件模式

外部硬件充当USB主设备,并为总线供电。例如手机和电脑连接

dd0621383dd3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

USB Host and Accessory Modes

USB Host 端是主设备,Device是从设备

Host模式

此时Android设备作为主设备,对外供电,可以列出连接上的USB设备

相关API

UsbManager

枚举设备、和所连接的USB设备通信

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

UsbDevice

代表一个连接的USB从设备,并包含访问其标识信息,接口和端点的方法。

UsbInterface

表示一个UsbDevice的一个接口。UsbDevice可以具有一个或多个在接口用来通信。

UsbEndpoint

表示一个UsbInterface一个端点,它是接口的通信通道。一个接口可以具有一个或多个端点,与设备进行双向通信通常有一个端点用于输入和一个端点用于输出。

UsbDeviceConnection

表示与设备的连接,用来收发数据,传输控制信息。

UsbRequest

通过UsbDeviceConnection与设备通信的异步请求,只用来异步通信

UsbConstants

USB常量定义,与Linux内核的linux / usb / ch9.h中的定义相对应

UsbManager来检索所需的UsbDevice,找到对应的设备

找到合适的UsbInterface和UsbEndpoint进行通信

获得正确的端点后,打开UsbDeviceConnection与USB设备进行通信。

在Manifest中声明需要的USB设备信息

这样,当检测到相应的USB设备插入的时候,系统会出现一个弹框,如果用户点击同意接入的话,可以直接启动应用相应的Activity

声明需要的硬件功能

设定最低API Level 12 (基本不需要了)

在插入相关USB设备时通知应用程序,在相应Activity中为android.hardware.usb.action.USB_DEVICE_ATTACHEDIntent指定一个和元素对。 元素指向一个外部XML资源文件(位于 res/xml 文件夹下,文件名保持一致),声明要检测的设备的信息。

...

...

android:resource="@xml/device_filter" />

在XML资源文件中,通过元素声明要过滤的USB设备。

一般来说,使用供应商vendor-id和产品IDproduct-id过滤特定设备。

使用类class, 子类subclass, 和协议protocol 过滤一组设备

没有属性时,匹配每个USB设备

的属性如下

vendor-id

product-id

class

subclass

protocol (device or interface)

例如:声明过滤UVC摄像头

使用设备

发现连接的USB设备,通过使用来获取通知,或者程序主动查询已经连接的设备,看是否感兴趣

请求连接USB设备的权限(如果尚未获得)

通过在相应的接口 endPoint上读取和写入数据与USB设备进行通信

发现一个设备

一种方法是在清单文件中指定一个和元素对

当用户连接与设备过滤器匹配的设备时,系统会显示一个对话框,询问是否要启动程序,如果用户接受,应用程序自动有权访问设备,直到设备断开连接。

通过Intent获取代表接入设备的UsbDevice:

Intent intent = getIntent();

UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

自动授予权限,此时intent的extra没有EXTRA_PERMISSION_GRANTED字段对应的boolen信息,只有EXTRA_DEVICE 字段对应的device信息

枚举设备

通过枚举总线上的设备,检查当前连接的所有USB设备。

HashMap 的Key值对应的是USB设备的名称

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

HashMap deviceList = manager.getDeviceList();

UsbDevice device = deviceList.get("deviceName");

//或者通过迭代的方式,对每个Device执行操作

Iterator deviceIterator = deviceList.values().iterator();

while(deviceIterator.hasNext()){

UsbDevice device = deviceIterator.next();

//your code

}

获取权限

在尝试与USB设备通信之前,必须检查访问设备的权限。 如果没有权限,会返回运行时错误。

如果使用Intent Filter来连接USB设备,插入设备,就会有系统弹框,点允许我们的应用处理此设备时,就会获得权限。如有点击方框,永久授予权限,一插入设备,就会自动启动应用对应的Activity。否则,必须在连接到设备之前明确请求许可。

当通过枚举查找已连接的USB设备,然后要与其通信时,需要显示请求许可,需要创建广播接收器,因为调用'requestPermission'请求权限时,返回信息包含在PendingIntent内部,Intent包含两个额外信息

EXTRA_DEVICE :表示调用请求时对应的设备

EXTRA_PERMISSION_GRANTED一个布尔值,表示是否授予权限

if (mUsbManager.hasPermission(device)) {

//进行通信相关的操作

} else {

mUsbManager.requestPermission(device, mPermissionIntent);

}

//函数原型

UsbManager.hasPermission(UsbDevice device)

UsbManager.requestPermission(UsbDevice device, PendingIntent mPermissionIntent)

注册广播,接收相应的请求权限后系统产生的广播Intent

private static final String ACTION_USB_PERMISSION =

"com.android.example.USB_PERMISSION";

UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);

mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);

IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);

registerReceiver(mUsbReceiver, filter);

private final 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)) {

if(device != null){

//进行通信相关的操作

}

}

else {

Log.d(TAG, "permission denied for device " + device);

}

}

}

}

};

通信

通信肯定是要放到另一个线程中去操作,以免阻塞UI线程

//打开设备

UsbDeviceConnection connection = mUsbManager.openDevice(device);

[TODO]

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值