Android权限检查API checkSelfPermission失效问题

当Android应用的targetSdkVersion小于23时,Context的checkSelfPermission方法可能失效。原因是6.0及以上系统针对不同targetSdkVersion采用了不同的权限管理策略。对于targetSdkVersion<23的应用,系统不会更新runtime权限状态,导致checkSelfPermission始终返回已授权。为了解决这个问题,可以使用PermissionChecker类来检查6.0以上设备上的权限状态。
摘要由CSDN通过智能技术生成

为什么targetSdkVersion < 23 Context 的 checkSelfPermission失效

跟踪一下源码发现Context 的 checkSelfPermission最终会调用ContextImp的checkPermission,最终调用

@Override
public int checkPermission(String permission, int pid, int uid) {
if (permission == null) {
throw new IllegalArgumentException(“permission is null”);
}

try {
return ActivityManagerNative.getDefault().checkPermission(
permission, pid, uid);
} catch (RemoteException e) {
return PackageManager.PERMISSION_DENIED;
}
}

最终请求ActivityManagerService的checkPermission,经过预处理跟中转最后会调用PackageManagerService的checkUidPermission

@Override
public int checkUidPermission(String permName, int uid) {
final int userId = UserHandle.getUserId(uid);
synchronized (mPackages) {

Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj != null) {
final SettingBase ps = (SettingBase) obj;
final PermissionsState permissionsState = ps.getPermissionsState();

if (permissionsState.hasPermission(permName, userId)) {
return PackageManager.PERMISSION_GRANTED;
}
if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) {
return PackageManager.PERMISSION_GRANTED;
}
} … }

return PackageManager.PERMISSION_DENIED;
}

PackageManagerService会从mSettings全局变量中获取权限,然后进一步验证权限是否被授予

public boolean hasPermission(String name, int userId) {
enforceValidUserId(userId);

if (mPermissions == null) {
return false;
}

PermissionData permissionData = mPermissions.get(name);
return permissionData != null && permissionData.isGranted(userId);
}

这里的检查点只有两点,第一个是是否有这个权限,第二是是否是Granted,对于targetSdkVersion<23的所有的权限都在packages.xml中,grante一直是true,无法被跟新,为什么无法被更新呢?看一下6.0之后的授权与取消授权的函数,首先看一个变量mAppSupportsRuntimePermissions

mAppSupportsRuntimePermissions = packageInfo.applicationInfo
.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
mAppOps = context.getSystemService(AppOpsManager.class);

mAppSupportsRuntimePermissions定义在AppPermissionGroup中,6.0之后权限都是分组的,对于targetSdkVersion<23的APP来说,很明显是不支持动

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值