安卓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);
}
});
这样就不会弹窗了