Android6.0 系统上运行时权限检测checkSelfPermission接口问题

在 Android6.0 系统的机器上测试运行时权限,将应用获取摄像头权限禁止掉,然后应用在调用扫码功能时,检测权限,并确定是否要获取权限,然后根据权限的获取结果启动扫码界面,还是已有 权限直接启动扫码界面:


但是接口的返回值却没有想象中的那么顺利,使用context.checkSelfPermission接口再我将应用相关权限禁止时,依然返回已经granted授权,这就让代码的逻辑无法像之前那样进行,即使没有授权,依旧会走直接启动扫码界面的逻辑,但是进入界面之后却又无法正常初始化摄像头,导致背后一片黑,好在应用代码里面还做了容错处理,弹出提示框。

通过网上搜索资料看到如下说明:

https://blog.csdn.net/qq_15364915/article/details/53425414

说对于targetSdkVersion 版本号小于23 的要使用PermissionChecker.checkSelfPermission接口来检测权限,然后我的targetsdkVersion 是27,但是还是参照修改了代码:

public static boolean selfPermissionGranted(Context context, String permission) {
    int targetSdkVersion = 0;
    boolean ret = false;

    try {
        final PackageInfo info = context.getPackageManager().getPackageInfo(
                context.getPackageName(), 0);
        targetSdkVersion = info.applicationInfo.targetSdkVersion;
        Log.d(TAG,"selfPermissionGranted targetSdkVersion="+targetSdkVersion);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (targetSdkVersion >= Build.VERSION_CODES.M) {
            ret = context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
        } else {
            ret = PermissionChecker.checkSelfPermission(context, permission) == PermissionChecker.PERMISSION_GRANTED;
        }
    }else{
        return true;
    }
    Log.d(TAG,"selfPermissionGranted permission:" + permission +" grant:" + ret);
    return ret;
}

结果在OPPO 和 360 两款Android6.0 的机器上测试,都是无效的,依然都还是返回已经授权。

最后无奈,拿微信做了对比测试,关掉微信摄像头权限,开启扫码功能,其同样在未i授权的情况下进入了扫码界面,只是交互体验很好,不会看到背景全黑。



从log 来看当点击扫码功能时,Activity已经启动,只是系统权限弹框可能会将其延迟展示出来,应该时五秒钟超时之后,界面显示,然后需要应用来处理好这个场景。

猜你喜欢

转载自blog.csdn.net/yangwubolwg/article/details/80987937