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);
    

分析过程

权限对话框
在这里插入图片描述

正常情况

点击权限对话框(向用户请求连接到设备的权限)的确定按钮之后,正常的情况是在注册的广播接收器中接收到包含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的值。
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 应用中获取 USB 权限,需要在应用的 AndroidManifest.xml 文件中声明一个 `<uses-feature>` 标签,指定应用需要使用 USB 设备。同时还需要申请 USB 权限,可以在应用中调用 `UsbManager.requestPermission()` 方法来实现。 以下是一个示例代码,演示如何获取 USB 设备权限: ```java // 在AndroidManifest.xml文件中添加以下权限声明 <uses-feature android:name="android.hardware.usb.host" /> // 在应用中获取USB设备权限 public void getUsbPermission(UsbDevice device) { if (device != null) { UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); usbManager.requestPermission(device, permissionIntent); } } // USB设备权限申请结果的广播接收器 private final BroadcastReceiver usbPermissionReceiver = new BroadcastReceiver() { @Override 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) { // 成功获取USB设备权限,可以进行后续操作 } } else { // 未能获取USB设备权限 } } } } }; ``` 注意,获取 USB 设备权限需要用户授权,因此在申请权限之前需要先向用户说明该应用需要使用 USB 设备,以获得用户的同意。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值