Android9.0给系统应用添加默认权限的方法

软件平台:Android9.0

硬件平台:Mtk6771

        近来做产品需求开发,发现首次起机或者恢复出厂设置之后,app首次启动的时候,会触发权限申请的提示弹窗,用户可以选择授权或者拒绝,会给用户造成不良体验,于是琢磨了一套Framework层默认给app授权的机制,具体操作如下:

diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 1c40347f..a1b37a1a 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -359,6 +359,25 @@ public final class DefaultPermissionGrantPolicy {
         String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
              

Android 系统中,系统应用默认权限授权可以通过多种方式实现,尤其是在定制系统开发中。以下是几种常见的实现方法: ### 1. 通过 `DevicePolicyManager` 设置自动授权策略 在 `GrantPermissionsActivity.java` 文件中,可以重写 `getPermissionPolicy()` 方法,返回 `DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT`,以实现权限的自动授予。这种方式适用于系统应用,并且可以隐藏权限请求的弹窗界面,从而避免用户感知到权限请求过程。具体代码如下: ```java private String mCallingPackage; private int getPermissionPolicy() { DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); return DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT; } @Override public void onCreate(Bundle icicle) { // 在 onCreate 中处理权限授予逻辑 } ``` 这种方法适用于系统应用,而不是普通的第三方应用[^2]。 ### 2. 在预置系统应用配置默认权限 对于系统应用,可以在编译时预置权限配置,使其在安装时自动获得所需权限。这种方案通常用于系统内置应用,例如设备制造商或运营商提供的应用。通过在系统构建过程中配置特定的权限策略,可以在不提示用户的情况下完成权限授予[^2]。 在 Android 构建配置文件(如 `Android.bp`)中添加权限声明,确保应用系统镜像中被正确打包并赋予默认权限。例如: ```java android_app { name: "MySystemApp", srcs: ["app-release.apk"], certificate: "platform", privileged: true, requiredSystemProperties: { "ro.product.device": "my_device", }, permissions: [ "android.permission.CAMERA", "android.permission.ACCESS_FINE_LOCATION", ], } ``` ### 3. 修改系统权限管理逻辑 在某些定制系统开发中,可能需要修改 Android 系统源码中的权限管理逻辑,以实现对特定应用默认授权。例如,在 `PackageManagerService` 中调整权限授予的流程,或者在 `PermissionManager` 中定义特定的权限授予规则。这种方法通常较为复杂,需要深入理解 Android 权限机制和系统架构。 此外,也可以在系统启动时,通过系统服务模块在特定时机授予默认权限。例如,在 `SystemServer` 或其他系统服务初始化过程中,调用 `IPackageManager` 接口为特定应用授予权限: ```java IPackageManager packageManager = IPackageManager.Stub.asInterface( ServiceManager.getService("package")); packageManager.grantRuntimePermission("com.example.myapp", "android.permission.CAMERA", UserHandle.USER_SYSTEM); ``` 该方法需要系统签名权限,并且通常用于系统应用或设备管理员应用。 ### 4. 使用设备管理策略授予默认权限 如果设备是企业设备,并且使用了 Android 的设备管理功能(如 Android Enterprise),可以通过设备管理员策略来授予特定权限。例如,使用 `DevicePolicyManager` API 来授予位置、摄像头、麦克风等权限,而无需用户手动确认。 ### 注意事项 - **系统定制要求**:上述方法主要适用于系统级定制开发,普通应用开发者通常无法直接修改系统权限管理逻辑。 - **安全性考虑**:默认授权权限可能会带来安全风险,因此在实施时需要确保应用的安全性和可信度。 - **兼容性问题**:不同版本的 Android权限管理的实现有所不同,因此在 Android 9.0、10、11、12、13 等版本中,实现方式可能会有细微差别。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值