如何避免通过adb读取SMS时出现“Permission Denial”权限拒绝问题?
无需Root读取Android 9设备SMS的可行方案
核心结论
在未Root的Android 9设备上,无法直接通过adb shell content query --uri content://sms读取SMS,原因如下:
- Android的
READ_SMS属于危险权限,必须明确授予给具体应用包,而adb shell默认以uid=2000(系统shell用户)运行,该用户默认不具备此权限,非Root状态下无法直接为其授权。 - 你提到的adb拨打电话操作(如
adb shell am start -a android.intent.action.CALL -d tel:xxx)是通过调用系统Intent组件实现的,无需直接持有对应权限,和读取SMS的权限逻辑完全不同。
可行替代方案
1. 开发简易测试应用获取SMS
这是Android 9设备上最可靠的非Root方案:
- 创建Android项目,在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.READ_SMS" /> - 在应用代码中添加动态权限申请逻辑(Android 6+要求危险权限动态申请),并编写代码查询SMS内容,将结果输出到Logcat或本地文件:
// 查询SMS示例代码 Cursor cursor = getContentResolver().query(Uri.parse("content://sms"), null, null, null, null); if (cursor != null && cursor.moveToFirst()) { do { String body = cursor.getString(cursor.getColumnIndexOrThrow("body")); Log.d("SMS_LOG", "短信内容: " + body); } while (cursor.moveToNext()); cursor.close(); } - 将应用安装到设备,手动授予
读取短信权限后,通过adb启动应用并查看Logcat结果:adb shell am start -n com.your.package/.MainActivity adb logcat -s SMS_LOG
2. 利用run-as命令(限自开发Debug应用)
如果你有一个已授予READ_SMS权限的Debug签名应用,可通过run-as进入应用沙箱环境执行查询:
adb shell run-as com.your.debug.package content query --uri content://sms
该命令会切换到应用的uid环境,此时已具备读取SMS的权限。
3. 更换至Android 11+设备
Android 11及以上系统支持直接为adb shell授予危险权限,只需执行以下命令即可直接读取SMS:
adb shell pm grant com.android.shell android.permission.READ_SMS adb shell content query --uri content://sms
这是最便捷的方案,但需要更换设备。
内容的提问来源于stack exchange,提问作者Baradé
相关产品推荐
相关产品推荐

