Android权限 - 默认授予应用运行时权限方法

在DefaultPermissionGrantPolicy.java文件中,进行默认授权;
 * This class is the policy for granting runtime permissions to
 * platform components and default handlers in the system such
 * that the device is usable out-of-the-box. For example, the
 * shell UID is a part of the system and the Phone app should
 * have phone related permission by default.
 此类是一种策略类,用于向系统中的平台组件和默认处理程序授予运行时权限,以便设备可以立即使用。
 例如,短信默认被赋予了CONTACTS_PERMISSIONS,SMS_PERMISSIONS,STORAGE_PERMISSIONS等权限;默认情况下,电话应用程序应该具有与电话相关的权限。
 一般是以Group形式授予,如STORAGE_PERMISSIONS,SMS_PERMISSIONS,CONTACTS_PERMISSIONS等。
 
 如:关于对STORAGE_PERMISSIONS的默认授权以及对指定的应用默认授予指定的权限:

private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
 static {
     STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
     STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
     STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION);
 }
public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
    grantDefaultPermissionExceptions(userId);
    synchronized (mLock) {
        mDefaultPermissionsGrantedUsers.put(userId, userId);
    }
}
private void grantDefaultSystemHandlerPermissions(int userId) {
    ......
    String[] smsAppPackageNames = (smsAppPackagesProvider != null)
                ? smsAppPackagesProvider.getPackages(userId) : null;
                
    .... 
    // SMS
    if (smsAppPackageNames == null) {
        String smsPackage = getDefaultSystemHandlerActivityPackageForCategory(
                Intent.CATEGORY_APP_MESSAGING, userId);
        grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
    } else {
        for (String smsPackage : smsAppPackageNames) {
            grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
        }
    }
    ......

    // Add begin
    // Add by mengqin.zhang,20200418,add default permission for deskclock
        Log.i(TAG, "Granted deskclock POWER_OFF_ALARM permission");
        PackageInfo deskclockPackage = getSystemPackageInfo("xxx.xxx.deskclock");
        if ((deskclockPackage != null) && doesPackageSupportRuntimePermissions(deskclockPackage)) {
            Set<String> cusSetPL = new ArraySet<String>();
            cusSetPL.add("xxx.xxxxxx.permission.POWER_OFF_ALARM");
            grantRuntimePermissions(deskclockPackage, cusSetPL, false, userId);
        }
    // Add end
    ......

 }
private void grantDefaultPermissionsToDefaultSystemSmsApp(String smsPackage, int userId) {
    grantPermissionsToSystemPackage(smsPackage, userId,
            PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
            STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
 }

最终调用到grantRuntimePermissions方法,在grantRuntimePermissions方法中,最后调用到getPackageManager().updatePermissionFlags. 最终也是调用到mPermissionManager.updatePermissionFlags.

猜你喜欢

转载自blog.csdn.net/hanhan1016/article/details/105865633