给App默认授予权限的方法。
自从android 6.0之后,安卓加强了对权限的管理。上层App必须通过弹框申请权限,来让用户去选择时候授予选择。
但是在实际开发中,我们希望,app安装之后就可以直接使用,默认获取相关的权限,而不需要弹框请求权限。
第一种方法
将targetSdkVersion改成小于23,因为从23后,开始进行了权限限制
defaultConfig {
applicationId "com.ad.audiotest"
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
测试可行。
当targetSdkVersion>=23时,则无法默认获取权限。
第二种方法
frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
frameworks/base/core/res/res/values/arrays.xml
frameworks/base/core/res/res/values/symbols.xml
frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
在DefaultPermissionGrantPolicy.java中,加入:
private void grantDefaultSystemHandlerPermissions(int userId) {
//省略一部分代码
//...
//add by sunxiaolin start 20190905
// add Storage permission
grantStoragePermissionsToCustomApp(userId);
//add by sunxiaolin end 20190905
//省略一部分代码
//...
}
//add by sunxiaolin start 20190905
private void grantStoragePermissionsToCustomApp(int userId){
Log.i(TAG, "sunxiaolin,grantStoragePermissionsToCustomApp userId=" + userId);
final String[] itemString = mContext.getResources()
.getStringArray(com.android.internal.R.array.storage_permission_custom_packagename);
for (int i = 0; i < itemString.length; i++) {
PackageParser.Package customPackage = getPackage(itemString[i]);
Log.i(TAG, "sunxiaolin,grantStoragePermissionsToCustomApp customPackage=" + customPackage);
if ((customPackage != null) && doesPackageSupportRuntimePermissions(customPackage)) {
grantRuntimePermissions(customPackage, STORAGE_PERMISSIONS, userId);
}
}
}
//add by sunxiaolin end 20190905
重点: grantRuntimePermissions(customPackage, STORAGE_PERMISSIONS, userId);中给app授权STORAGE_PERMISSIONS权限。
frameworks/base/core/res/res/values/arrays.xml
<!-- Add by sunxiaolin start 20190905 -->
<string-array name="storage_permission_custom_packagename">
<item>com.ad.audiotest</item>
</string-array>
<!-- Add by sunxiaolin end 20190905 -->
在item中加入你想授予STORAGE_PERMISSIONS权限的app包名。
frameworks/base/core/res/res/values/symbols.xml
<java-symbol type="array" name="storage_permission_custom_packagename" />
添加storage_permission_custom_packagename的定义,否则编译不过。
编译:/frameworks/base/services/下,mm,测试OK.
第三种方法
在system/etc/default-permissions目录下有一个文件:default-car-permissions.xml
在DefaultPermissionGrantPolicy中会去读这个文件,来给app赋予权限。
<exception
package="com.android.car.messenger">
<!-- Contacts -->
<permission name="android.permission.READ_CONTACTS" fixed="false"/>
<!-- SMS -->
<permission name="android.permission.SEND_SMS" fixed="false"/>
<permission name="android.permission.READ_SMS" fixed="false"/>
</exception>
<!-- add by sunxiaolin start 20190912 -->
<exception
package="com.ad.audiotest">
<!-- Contacts -->
<permission name="android.permission.ACCESS_COARSE_LOCATION" fixed="false"/>
<!-- SMS -->
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
<permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
</exception>
<!-- add by sunxiaolin end 20190912 -->
在里面加入你想赋予权限的app包名和权限。
其中第二种和第三种方法可以清楚存储空间中可以看到。
并且只对于默认打包在系统中的Image生效。对于第三方应用,需要修改下代码逻辑。