1.介绍
此修改的应用场景是当某些apk打开时默认会有弹框提示申请权限,但在一些需求中是不希望apk弹框,所以只需要将应用授予权限作为安装权限 GRANT_INSTALL 就可以屏蔽掉弹框。
我们要了解下以下几个常量所代表的含义
/** Permission grant: not grant the permission. */
private static final int GRANT_DENIED = 1; 不授予权限
/** Permission grant: grant the permission as an install permission. */
private static final int GRANT_INSTALL = 2; 授予权限作为安装权限
/** Permission grant: grant the permission as a runtime one. */
private static final int GRANT_RUNTIME = 3; 授予运行运行时的权限
/** Permission grant: grant as runtime a permission that was granted as an install time one. */
private static final int GRANT_UPGRADE = 4; 授予作为运行时一个被授予的权限,作为一个安装时间
此修改实际上只适用于Android 9.0和Android 10.0两个版本
allowPackageName 此数组中可以添加多个应用包名让多个应用都默认获取到所有已申请的权限
路径:frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
private static final int[] EMPTY_INT_ARRAY = new int[0];
//*/soda water.20220614 grant permission
private String[] allowPackageName= {"com.baidu.map.location"};
//*/soda water.20220614 grant permission end
} else if (bp.isRuntime()) {
if (origPermissions.hasInstallPermission(bp.getName())
|| upgradedActivityRecognitionPermission != null) {
// Before Q we represented some runtime permissions as install permissions,
// in Q we cannot do this anymore. Hence upgrade them all.
grant = GRANT_UPGRADE;
} else {
// For modern apps keep runtime permissions unchanged.
grant = GRANT_RUNTIME;
}
//*/soda water.20220614 grant permission
for(String packageName : allowPackageName){
if(pkg.packageName!=null && pkg.packageName.equals(packageName)){
Log.d(TAG, "haha: PackageName=" + pkg.packageName + ", permName=" + permName);
grant = GRANT_INSTALL;
}
}
//*/soda water.20220614 grant permission end