在进行系统定制时,内置应用会要求各式各样运行时权限,例如拨打电话和管理通话权限
为了避免用户没有留意而拒绝了应用的关键权限,我们必须对用户授权时的各种状态进行详细的分析。
用户在授予权限时存在三种状态:
允许—授权成功,授权结束。
拒绝—授权失败,下次申请仍会弹出提示框。如果权限是程序必须拥有的,则需要再次申请。
拒绝&不再询问—拒绝一次后,下次会有该提示。若选择拒绝并且不再询问,下次申请则不会弹出提示框。如果权限是程序必须拥有的,则需要用户到应用管理中手动设置。
对于内置应用,客户希望不会弹出这些东西,而且一旦错过允许就不会再次弹出,比较影响客户体验,所以我在PackageManagerService里自定义了一个方法,这个方法可以在应用解压的时候就赋予运行时权限.
private void grant3rdPermissionsToApps(int userId) {//lei add
synchronized (mPackages) {
final int packageCount = mPackages.size();
for (int i = 0; i < packageCount; i++) {
PackageParser.Package pkg = mPackages.valueAt(i);
if (!(pkg.mExtras instanceof PackageSetting)) {
continue;
}
if (pkg.requestedPermissions.isEmpty()) {
Log.i(TAG, "Skip package " + pkg.packageName);
continue;
}
for (String permission : pkg.requestedPermissions) {
BasePermission bp = mSettings.mPermissions.get(permission);
if (bp != null && bp.isRuntime()){
grantRuntimePermission(pkg.packageName, permission, userId);
}
}
}
}
}