非系统进程/app如何在不动态申请或者刚开机的情况下获取系统权限
适用场景:
- 当app不需要动态申请权限页面的提示时
- 在开机启动需要直接赋予权限
- 某些开机运行的app中有对某数据库的监听,需要立即响应onchange事件
代码流程:
1.在frameworks\base\services\core\java\com\android\server\pm
DefaultPermissionGrantPolicy.java中添加方法,其中STORAGE_PERMISSIONS等静态常量为所需要申请的权限数组.
private void grantDefaultSystemHandlerPermissions(int userId)
private void grantDefaultSystemHandlerPermissions(int userId) {
Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
final PackagesProvider locationPackagesProvider;
......
synchronized (mService.mPackages) {
//就是下面这里增加一个方法
grantStoragePermissionsToCustomApp(userId);
// Installer
PackageParser.Package installerPackage = getSystemPackageLPr(
mService.mRequiredInstallerPackage);
if (installerPackage != null
&& doesPackageSupportRuntimePermissions(installerPackage)) {
grantRuntimePermissionsLPw(installerPackage, STORAGE_PERMISSIONS, true, userId);
}
......
}
private void grantStoragePermissionsToCustomApp(int userId){
final String []itemString = {"com.test.demo"};
for (int i = 0; i < itemString.length; i++) {
PackageParser.Package customPackage = getPackageLPr(itemString[i]);
if ((customPackage != null) && doesPackageSupportRuntimePermissions(customPackage)) {
grantRuntimePermissionsLPw(customPackage, MICROPHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(customPackage, STORAGE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(customPackage, CONTACTS_PERMISSIONS, userId);
//grantRuntimePermissionsLPw(customPackage, LOCATION_PERMISSIONS,true, userId);
grantRuntimePermissionsLPw(customPackage, PHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(customPackage, CAMERA_PERMISSIONS, userId);
}
}
}
2.然后需要在frameworks\base\data\etc\privapp-permissions-platform.xml文件中加上所需要的所有权限:
<privapp-permissions package="com.test.demo">
<permission name="android.permission.CAMERA"/>
<permission name="android.permission.READ_CONTACTS"/>
<permission name="android.permission.ACCESS_FINE_LOCATION"/>
<permission name="android.permission.RECORD_AUDIO"/>
<permission name="android.permission.READ_PHONE_STATE"/>
<permission name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission name="android.permission.SEND_SMS"/>
</privapp-permissions>