问题
在小米和VIVO的Android 10的版本上面,利用如下代码无法获取USB设备的权限:
private static final String ACTION_USB_PERMISSION =
"com.android.example.USB_PERMISSION";
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){
//call method to set up device communication
usbManager.openDevice(device);
}
}
else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
...
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
...
permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
...
UsbDevice device;
...
usbManager.requestPermission(device, permissionIntent);
分析过程
权限对话框
正常情况
点击权限对话框(向用户请求连接到设备的权限)的确定按钮之后,正常的情况是在注册的广播接收器中接收到包含UsbDevice对象的Intent,Intent包含键值为UsbManager.EXTRA_PERMISSION_GRANTED的布尔值,并且布尔值为true,然后就可以正常打开Usb设备了。
异常情况
在Android 10中,点击权限对话框的确定按钮之后,可以在注册的广播接收器中接收到包含UsbDevice对象的Intent,但是UsbManager.EXTRA_PERMISSION_GRANTED的布尔值一直为false。如果无视为false的布尔值,在接收到广播之后,强行打开Usb设备的话,会打开失败,并提示没有权限打开该设备。
可能的原因
在Android的其他版本比如Android 9.1和Android 11中,都可以正常获取权限,但是只有Android 10的版本出现这种异常,推测可能是Android 10的Usb权限逻辑本身有问题。
解决办法
设置build.gradle里面targetSdkVersion版本小于等于27的值。