You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免通过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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:52:40