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版本,或者考虑使用更合规的短信访问方式。
- 除了在Manifest里声明
厂商定制系统的特殊情况
有些国内厂商会修改短信存储的逻辑,比如把草稿存在自己的私有URI里。如果上面的方法还是不行,可以尝试查询content://mms-sms/drafts这个URI,部分厂商的系统会支持这个路径。
内容的提问来源于stack exchange,提问作者Nick B
相关产品推荐
相关产品推荐

