Android 10 无法获取USB设备权限异常问题

问题

在小米和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);
    

分析过程

权限对话框
Android 10 无法获取USB设备权限异常问题_第1张图片

正常情况

点击权限对话框(向用户请求连接到设备的权限)的确定按钮之后,正常的情况是在注册的广播接收器中接收到包含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的值。
Android 10 无法获取USB设备权限异常问题_第2张图片

你可能感兴趣的:(android,android,android,studio,java)