已获取Root权限的设备如何为应用授予READ_VOICEMAIL权限?
解决Android 13下获取READ_VOICEMAIL权限的问题
一、修复pm grant命令失效的问题
部分系统级权限(如语音信箱相关权限)需要指定用户身份或更高权限上下文才能授予,直接执行pm grant可能失败,可尝试以下两种方式:
- 指定主用户执行命令
通过Root切换后,明确指定用户ID为0(主用户)执行授权:
su pm grant --user 0 com.my.app com.android.voicemail.permission.READ_VOICEMAIL
- 直接修改权限数据库
如果命令仍报错,可直接操作系统权限数据库(需先挂载/system为可读写):
su mount -o rw,remount /system sqlite3 /data/system/users/0/runtime-permissions.db INSERT OR REPLACE INTO permissions (packageName, name, granted, flags) VALUES ('com.my.app', 'com.android.voicemail.permission.READ_VOICEMAIL', 1, 0); .exit mount -o ro,remount /system
执行后重启应用,权限即可生效。
二、解决移至/system/priv-app导致无限重启的问题
Android 13对系统应用的校验逻辑更严格,直接移动APK到该目录引发重启通常是以下原因:
应用未使用系统签名
LineageOS 20要求priv-app下的应用必须与ROM签名兼容,若没有ROM的签名密钥,此方法不可行。缺少系统应用必要声明
系统应用需在AndroidManifest.xml中添加android:sharedUserId="android.uid.system"或android:uid.phone",同时将目标权限的protectionLevel设为signature或signatureOrSystem,否则系统会拒绝加载应用。使用兼容的Magisk模块替代
尝试Universal Systemless Interface (USI) 或Systemizer (Terminal Emulator) 这类支持Android 12/13的模块:
安装模块后,在终端执行su -c systemizer,按提示选择应用完成系统化,这种无系统分区修改的方式不会触发重启。
三、替代方案:Root权限下直接访问Content Provider
若上述方法均无效,可利用Root权限直接读取语音信箱的Content Provider:
// 示例代码(需Root权限) ContentResolver resolver = getContentResolver(); Uri voicemailUri = Uri.parse("content://com.android.voicemail/voicemail"); String[] projection = {"_id", "number", "duration", "date"}; // 通过Root执行内容查询 Process process = Runtime.getRuntime().exec("su"); OutputStream os = process.getOutputStream(); os.write(("content query --uri " + voicemailUri + " --projection " + String.join(",", projection)).getBytes()); os.flush(); os.close(); // 读取process.getInputStream()获取查询结果
内容的提问来源于stack exchange,提问作者user496854
相关产品推荐
相关产品推荐

