这篇博客是针对之前的一篇文章Android开发之USB数据通信作的补充。主要是在开发中发现了另外两个不得不面对的问题:
- USB访问权限处理。
- USB设备插拔状态监听。
—USB访问权限处理——-
当我们安卓手机第一次安装我们USB相关功能的APK时,正常情况下,手机会弹出个类似于“XX应用访问USB设备…”的提示框,如果用户不接受的话,那肯定是不能进行USB通信的。
要怎么才能让手机在安装应用时弹出对应地提示框呢?答案就是在我们的项目中添加相应的权限访问的代码。
1,在Activity的OnCreate()方法中注册广播:
private PendingIntent mPermissionIntent;
....
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
//注册USB设备权限管理广播
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
2,广播处理:
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) {
}
} else {
showTmsg("用户不允许USB访问设备,程序退出!");
finish();
}
}
}
}
};
3,我们在查找到USB设备时,也应该判断下设备权限,如果没有权限,则请求权限:
if (!manager.hasPermission(usb)) {//权限判断
manager.requestPermission(usb, mPermissionIntent);
}
//注:usb是指UsbDevice对象,manager是指UsbManager对象。
—-USB设备插拔状态监听——
如果用户在使用应用的过程中,有意或无意中拔出了USB设备后,程序肯定也是不能进行操作的,当然我们也要做相应地判断。
1,同样是注册广播:
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(usbStateReceiver, filter);
2,广播代码处理:
private final BroadcastReceiver usbStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//USB连接上手机时会发送广播android.hardware.usb.action.USB_STATE"及UsbManager.ACTION_USB_DEVICE_ATTACHED
if (action.equals(ACTION) | action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {//判断其中一个就可以了
showTmsg("USB已经连接!");
} else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {//USB被拔出
showTmsg("USB连接断开,程序退出!");
finish();
}
}
};
//注1:UsbManager.ACTION_USB_DEVICE_ATTACHED对应的广播在USB每次插入时都能监听到,所以用这个就可以监听USB插入。
//注2:UsbManager.ACTION_USB_DEVICE_DETACHED用来监听USB拔出广播。
//注3:网上有不少资料是说通过android.hardware.usb.action.USB_STATE对应的广播来监听USB插拔,我在开发中发现该ACTION只在USB插入的时候能监听到,拔出时没有作用。