Android6.0 系统上运行时权限检测checkSelfPermission接口问题
在 Android6.0 系统的机器上测试运行时权限,将应用获取摄像头权限禁止掉,然后应用在调用扫码功能时,检测权限,并确定是否要获取权限,然后根据权限的获取结果启动扫码界面,还是已有 权限直接启动扫码界面:
但是接口的返回值却没有想象中的那么顺利,使用context.checkSelfPermission接口再我将应用相关权限禁止时,依然返回已经granted授权,这就让代码的逻辑无法像之前那样进行,即使没有授权,依旧会走直接启动扫码界面的逻辑,但是进入界面之后却又无法正常初始化摄像头,导致背后一片黑,好在应用代码里面还做了容错处理,弹出提示框。
通过网上搜索资料看到如下说明:
https://blog.****.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已经启动,只是系统权限弹框可能会将其延迟展示出来,应该时五秒钟超时之后,界面显示,然后需要应用来处理好这个场景。