安卓14默认赋予应用权限
安卓14上赋予应用默认权限的方式跟之前的不太一样了
需要修改两个地方,一个是frameworks\base\services\core\java\com\android\server\pm\permission\Permission.java
public boolean isNormal() {//eturn (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)// == PermissionInfo.PROTECTION_NORMAL;return true;}public boolean isRuntime() {//return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)// == PermissionInfo.PROTECTION_DANGEROUS;return false;}
这里也可以加上通过packagename白名单模式过滤,我没这个需求,所以直接全部通过,这个改好后应用其实就安装完成后就有权限了,
但是有一些应用在第一次打开时还会弹ReviewPermissionsActivity这个界面,如果需求没有说要处理这个情况的话,下面的就不用管了
所以我们对这个界面做处理,首先在packages\modules\Permission\PermissionController\src\com\android\permissioncontroller\permission\ui\handheld\ReviewPermissionsFragment.java这个界面处理继续按钮时,注释调关闭的代码,因为结合前面的赋予权限,应用已经有权限了, 只要不去取消即可,这个时候即使用户点了关闭权限也不会生效
private void confirmPermissionsReview() {
...if (permPreference.getState().and(PermissionTarget.PERMISSION_FOREGROUND)!= PermissionTarget.PERMISSION_NONE.getValue()) {KotlinUtils.INSTANCE.grantForegroundRuntimePermissions(app, group);}if (permPreference.getState().and(PermissionTarget.PERMISSION_BACKGROUND)!= PermissionTarget.PERMISSION_NONE.getValue()) {KotlinUtils.INSTANCE.grantBackgroundRuntimePermissions(app, group);}if (permPreference.getState() == PermissionTarget.PERMISSION_NONE) {Log.i("test","app:" + app + " permission group:" + group + " bypass");//KotlinUtils.INSTANCE.revokeForegroundRuntimePermissions(app, group);//KotlinUtils.INSTANCE.revokeBackgroundRuntimePermissions(app, group);}
...
然后为了优化体验,在权限回调里面直接模拟用户点击了继续按钮onClick(mContinueButton);
mViewModel.getPermissionGroupsLiveData().observe(this,(Map<String, LightAppPermGroup> permGroupsMap) -> {if (getActivity().isFinishing()) {return;}if (permGroupsMap.isEmpty()) {//If the system called for a review but no groups are found, this means// that all groups are restricted. Hence there is nothing to review// and instantly continue.confirmPermissionsReview();executeCallback(true);activity.finishAfterTransition();} else {bindUi(permGroupsMap);loadPreferences(permGroupsMap);onClick(mContinueButton);}});
这样就不会弹窗了