Android 的framework里有相关默认权限的操作,主要针对预装的情况
frameworks\base\services\core\java\com\android\server\pm\DefaultPermissionGrantPolicy.java
private void grantDefaultSystemHandlerPermissions(int userId) {
Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
..........
synchronized (mService.mPackages) {
// Installer
PackageParser.Package installerPackage = getSystemPackageLPr(
mService.mRequiredInstallerPackage);
if (installerPackage != null
&& doesPackageSupportRuntimePermissions(installerPackage)) {
grantRuntimePermissionsLPw(installerPackage, STORAGE_PERMISSIONS, true, userId);
}
// Camera
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
cameraIntent, userId);
if (cameraPackage != null
&& doesPackageSupportRuntimePermissions(cameraPackage)) {
grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId);
}
// Maps
Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackageLPr(
mapsIntent, userId);
if (mapsPackage != null
&& doesPackageSupportRuntimePermissions(mapsPackage)) {
grantRuntimePermissionsLPw(mapsPackage, LOCATION_PERMISSIONS, userId);
}
// Gallery
Intent galleryIntent = new Intent(Intent.ACTION_MAIN);
galleryIntent.addCategory(Intent.CATEGORY_APP_GALLERY);
PackageParser.Package galleryPackage = getDefaultSystemHandlerActivityPackageLPr(
galleryIntent, userId);
if (galleryPackage != null
&& doesPackageSupportRuntimePermissions(galleryPackage)) {
grantRuntimePermissionsLPw(galleryPackage, STORAGE_PERMISSIONS, userId);
}
// Email
Intent emailIntent = new Intent(Intent.ACTION_MAIN);
emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr(
emailIntent, userId);
if (emailPackage != null
&& doesPackageSupportRuntimePermissions(emailPackage)) {
grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId);
grantRuntimePermissionsLPw(emailPackage, CALENDAR_PERMISSIONS, userId);
}
// Browser
PackageParser.Package browserPackage = null;
String defaultBrowserPackage = mService.getDefaultBrowserPackageName(userId);
if (defaultBrowserPackage != null) {
browserPackage = getPackageLPr(defaultBrowserPackage);
}
if (browserPackage == null) {
Intent browserIntent = new Intent(Intent.ACTION_MAIN);
browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
browserPackage = getDefaultSystemHandlerActivityPackageLPr(
browserIntent, userId);
}
if (browserPackage != null
&& doesPackageSupportRuntimePermissions(browserPackage)) {
grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
}
// Music
Intent musicIntent = new Intent(Intent.ACTION_VIEW);
musicIntent.addCategory(Intent.CATEGORY_DEFAULT);
musicIntent.setDataAndType(Uri.fromFile(new File("foo.mp3")),
AUDIO_MIME_TYPE);
PackageParser.Package musicPackage = getDefaultSystemHandlerActivityPackageLPr(
musicIntent, userId);
if (musicPackage != null
&& doesPackageSupportRuntimePermissions(musicPackage)) {
grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
}
// Home
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.addCategory(Intent.CATEGORY_LAUNCHER_APP);
PackageParser.Package homePackage = getDefaultSystemHandlerActivityPackageLPr(
homeIntent, userId);
if (homePackage != null
&& doesPackageSupportRuntimePermissions(homePackage)) {
grantRuntimePermissionsLPw(homePackage, LOCATION_PERMISSIONS, false, userId);
}
// Storage Manager
Intent storageManagerIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
PackageParser.Package storageManagerPckg = getDefaultSystemHandlerActivityPackageLPr(
storageManagerIntent, userId);
if (storageManagerPckg != null
&& doesPackageSupportRuntimePermissions(storageManagerPckg)) {
grantRuntimePermissionsLPw(storageManagerPckg, STORAGE_PERMISSIONS, true, userId);
}
//这是我添加的谷歌拼音输入法
//GoogleInputMethod
PackageParser.Package GoogleInputMethodPckg = getPackageLPr( "com.google.android.inputmethod.pinyin");
if (GoogleInputMethodPckg != null) {
grantRuntimePermissionsLPw(GoogleInputMethodPckg, MICROPHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, STORAGE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, CONTACTS_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, LOCATION_PERMISSIONS,true, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, PHONE_PERMISSIONS, userId);
}
mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
}
}
根据自己的APK的包名来给默认权限,这里以Google输入法为例,给个模板
//GoogleInputMethod
PackageParser.Package GoogleInputMethodPckg = getPackageLPr( "com.google.android.inputmethod.pinyin");
if (GoogleInputMethodPckg != null) {
grantRuntimePermissionsLPw(GoogleInputMethodPckg, MICROPHONE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, STORAGE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, CONTACTS_PERMISSIONS, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, LOCATION_PERMISSIONS,true, userId);
grantRuntimePermissionsLPw(GoogleInputMethodPckg, PHONE_PERMISSIONS, userId);
}
只需要根据上面的例子,把自己的APK加进去就行。相应的权限可以参考源文件里的其它APK的授权去找。
注意
如果你的APK是预装的那么按照上面的操作,是OK的。
如果不是预装的,则需要重启机器才行。
APK不预装,在安装的时候给权限
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index d6b3a00..1c94618 100755
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1940,7 +1940,7 @@ public class PackageManagerService extends IPackageManager.Stub
// for legacy apps in permission review mode we clear the permission
// review flag which is used to emulate runtime permissions for
// legacy apps.
- if (grantPermissions) {
+ if (grantPermissions || res.name.equals("你的包名")) {
grantRequestedRuntimePermissions(res.pkg, res.newUsers, grantedPermissions);
}
参考: