如何在Android系统中通过查询方式获取被拦截的SMS及MMS消息
三星Galaxy S8+获取系统拦截SMS/MMS方案
你之前的代码无法生效的核心原因是三星定制系统对短信存储逻辑做了修改:系统自带拦截功能拦截的垃圾短信、彩信没有存储在原生content://sms路径下,而是单独存入了三星短信服务专属的私有路径,因此用原生库的spam_report、locked字段查询无法命中目标数据。
前置配置
- 首先在
AndroidManifest.xml中添加短信读取权限:
<uses-permission android:name="android.permission.READ_SMS" />
- Android 6.0及以上系统需要动态申请上述运行时权限,未获取权限会导致查询返回空或者抛出安全异常
- Android 19及以上系统仅允许默认短信应用读取完整短信数据库,若你的应用不是默认短信应用,可能无法读取该部分数据
专属查询代码
读取拦截的SMS
// 三星系统专属垃圾短信URI Uri spamSmsUri = Uri.parse("content://com.samsung.android.smsprovider/spam/sms"); ContentResolver con = getContentResolver(); if(con == null){ Log.d("TAG","contentResolver not exist"); return; } // 按发送时间倒序查询 Cursor cursor = con.query(spamSmsUri, null, null, null,"date DESC"); if(cursor != null && cursor.moveToFirst()){ do{ // 读取核心字段:address为发件人号码,body为短信内容,date为发送时间戳 String sender = cursor.getString(cursor.getColumnIndexOrThrow("address")); String content = cursor.getString(cursor.getColumnIndexOrThrow("body")); long sendTime = cursor.getLong(cursor.getColumnIndexOrThrow("date")); // 自行处理读取到的短信数据 }while (cursor.moveToNext()); cursor.close(); }
读取拦截的MMS
只需将上述代码中的URI替换为彩信专属路径即可:
Uri spamMmsUri = Uri.parse("content://com.samsung.android.smsprovider/spam/mms");
注意事项
- 上述方案仅适用于读取三星系统自带短信应用拦截的垃圾消息,若你使用第三方安全应用、第三方短信应用拦截短信,对应数据存储在第三方应用私有目录,无法通过系统ContentResolver读取
- 若三星系统版本更新后专属URI失效,可以通过遍历原生短信库所有数据,核对
type字段值(部分三星版本拦截短信type值为-1或3)做兼容处理
内容的提问来源于stack exchange,提问作者황재현
相关产品推荐
相关产品推荐

