自定义Android 9 AOSP中自动授予麦克风权限失败问题求助
确认目标包的系统属性与获取逻辑
先检查com.mycustomaudioservice是否安装在system/app或priv-app目录下——只有这类目录的应用才会被getSystemPackage()识别为系统包。可以在代码中加日志验证包是否被正确获取:Log.d("PermGrantDebug", "Package found: " + (customAudioServicesPackage != null));如果日志显示未找到包,需调整应用的安装路径至系统目录。
验证权限常量定义
确保MICROPHONE_PERMISSIONS数组包含android.permission.RECORD_AUDIO。Android 9原生DefaultPermissionGrantPolicy.java中该常量的标准定义是:private static final String[] MICROPHONE_PERMISSIONS = { Manifest.permission.RECORD_AUDIO, };若你自定义的数组未包含该权限,授权逻辑会直接失效。
检查应用targetSdkVersion
doesPackageSupportRuntimePermissions()方法会判断应用的targetSdkVersion是否≥23。如果com.mycustomaudioservice的targetSdkVersion低于23,这个判断会返回false,导致授权代码不执行。需在服务的AndroidManifest.xml中明确设置:<uses-sdk android:targetSdkVersion="28" /> <!-- Android 9对应API级别28 -->确认userId的处理范围
保证你的授权代码处于遍历所有用户ID的循环内。DefaultPermissionGrantPolicy的grantDefaultPermissions()方法通常会循环处理系统内所有用户,示例如下:for (int userId : UserManagerService.getInstance().getUserIds()) { // 你的授权逻辑放在此处 PackageParser.Package customAudioServicesPackage = getSystemPackage("com.mycustomaudioservice"); if (customAudioServicesPackage != null && doesPackageSupportRuntimePermissions(customAudioServicesPackage)) { grantRuntimePermissions(customAudioServicesPackage, MICROPHONE_PERMISSIONS, userId); grantRuntimePermissions(customAudioServicesPackage, STORAGE_PERMISSIONS, userId); } }若只处理单个用户,会导致其他用户环境下权限未被自动授权。
清除权限缓存并重新刷入系统
修改AOSP代码后,必须重新编译系统并刷入设备。同时,清除旧的权限配置缓存:adb shell rm /data/system/users/0/runtime-permissions.xml adb reboot重启后系统会重新生成权限配置文件,确保新的授权逻辑生效。
尝试授权权限组(备选方案)
如果单个权限授权无效,可以尝试直接授权麦克风权限组:grantRuntimePermissions(customAudioServicesPackage, new String[]{Manifest.permission_group.MICROPHONE}, userId);
内容的提问来源于stack exchange,提问作者Ben

