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

Android中如何通过ContentResolver获取特定号码收件箱的已收短信并正序显示

解决特定号码收件箱短信的筛选与排序问题

我来帮你调整代码,完美实现你要的三个需求:

核心思路拆解

  1. 限定收件箱范围:直接使用收件箱专属Uri,避免混入发送的短信;
  2. 精准过滤发件人:通过查询条件只保留目标号码的已收短信;
  3. 调整排序规则:按短信时间戳升序排列,实现旧到新的展示顺序。

完整代码示例

// 替换成你要过滤的目标号码
String targetPhoneNumber = "138xxxx1234";

// 使用收件箱专属Uri,确保只查询已接收的短信
Uri inboxSmsUri = Uri.parse("content://sms/inbox");
ContentResolver contentResolver = pContext.getContentResolver();

// 查询条件:仅匹配目标号码的短信
String selection = "address = ?";
String[] selectionArgs = new String[]{targetPhoneNumber};

// 排序规则:按短信时间戳升序(旧短信在前,新短信在后)
String sortOrder = "date ASC";

// 执行查询,按需选择需要的字段(这里选了ID、号码、内容、时间)
Cursor smsCursor = contentResolver.query(
        inboxSmsUri,
        new String[]{"_id", "address", "body", "date"},
        selection,
        selectionArgs,
        sortOrder
);

// 遍历并处理短信数据
if (smsCursor != null) {
    try {
        if (smsCursor.moveToFirst()) {
            do {
                // 提取短信字段
                String phone = smsCursor.getString(smsCursor.getColumnIndexOrThrow("address"));
                String content = smsCursor.getString(smsCursor.getColumnIndexOrThrow("body"));
                long timestamp = smsCursor.getLong(smsCursor.getColumnIndexOrThrow("date"));
                
                // 这里可以把数据添加到你的列表中,用于后续展示
            } while (smsCursor.moveToNext());
        }
    } finally {
        // 务必关闭Cursor,避免内存泄漏
        smsCursor.close();
    }
}

关键注意事项

  • 权限要求:别忘了在AndroidManifest.xml中声明权限:
    <uses-permission android:name="android.permission.READ_SMS" />
    
    针对Android 6.0(API 23)及以上版本,还需要动态申请READ_SMS权限,用户授权后才能正常读取短信。
  • 号码匹配问题:有些短信的address字段可能会带区号或特殊格式,如果匹配不到,可以考虑对号码做格式化处理(比如去掉空格、特殊符号)后再进行匹配。

内容的提问来源于stack exchange,提问作者Manikandan Kuppusamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:23