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

Android系统中短信草稿存储位置及读取问题咨询

解决Android短信草稿查询无结果的问题

我之前也碰到过一模一样的情况,用content://sms/draft/直接查询完全拿不到数据,但去掉draft就能正常获取收件箱内容,明明权限也都给了。咱们来一步步解决这个问题:

  • 别直接用content://sms/draft这个URI
    很多现代Android版本(尤其是API 21+)已经不再推荐直接使用带路径的draft URI了,系统更建议通过标准的短信URI加上筛选条件来获取草稿。短信的类型字段type里,草稿对应的数值是3,所以我们可以用这个条件来过滤。

  • 用Android官方提供的标准化常量更靠谱
    硬编码URI和类型值容易踩厂商定制系统的坑,最好用Telephony类里的常量来保证兼容性:

    // 获取ContentResolver实例
    ContentResolver contentResolver = getContentResolver();
    
    // 定义要查询的字段
    String[] projection = {
        Telephony.Sms._ID,
        Telephony.Sms.ADDRESS,
        Telephony.Sms.BODY,
        Telephony.Sms.DATE
    };
    
    // 筛选条件:只取草稿类型的短信
    String selection = Telephony.Sms.TYPE + " = ?";
    String[] selectionArgs = { String.valueOf(Telephony.Sms.MESSAGE_TYPE_DRAFT) };
    
    // 执行查询
    Cursor cursor = contentResolver.query(
        Telephony.Sms.CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    );
    
    if (cursor != null) {
        while (cursor.moveToNext()) {
            String draftContent = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.BODY));
            // 这里处理你的草稿内容
            Log.d("DraftMessage", "内容:" + draftContent);
        }
        cursor.close();
    }
    
  • 再确认权限细节
    虽然你说权限已设置,但还是要注意:

    • 除了在Manifest里声明<uses-permission android:name="android.permission.READ_SMS" />,还要在运行时动态申请这个权限(Android 6.0+)。
    • Android 10(API 29)及以上,第三方应用直接访问短信内容会有更多限制,如果是这种情况,你可能需要检查应用的目标SDK版本,或者考虑使用更合规的短信访问方式。
  • 厂商定制系统的特殊情况
    有些国内厂商会修改短信存储的逻辑,比如把草稿存在自己的私有URI里。如果上面的方法还是不行,可以尝试查询content://mms-sms/drafts这个URI,部分厂商的系统会支持这个路径。

内容的提问来源于stack exchange,提问作者Nick B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:27