You need to enable JavaScript to run this app. 使用getContentResolver().query查询content://sms/inbox近10天筛选SQL
优惠活动
大模型
产品
解决方案
定价
更多

使用getContentResolver().query查询content://sms/inbox近10天筛选SQL

Android 近10天收件箱短信查询的Selection筛选写法

核心逻辑说明

  • 短信内容提供者(Sms Provider)的收件箱表中,标识短信接收时间的固定字段为date,字段值为毫秒级Unix时间戳,数值越大代表短信接收时间越临近当前。
  • 实现10天范围筛选的核心逻辑:取当前系统时间往前回溯10天的时间戳作为阈值,所有接收时间大于等于该阈值的短信,都属于目标查询范围。

正确实现步骤

  1. 计算时间范围阈值
    10天对应的毫秒偏移量计算需注意代码规范性,正确计算方式:
    // 计算10天对应的毫秒总时长,开头加L标识为长整型,为后续调整查询范围留足容错空间
    long tenDaysDuration = 10L * 24 * 60 * 60 * 1000;
    // 计算范围起点的时间戳:当前时间减去10天时长
    long rangeStart = System.currentTimeMillis() - tenDaysDuration;
    
  2. 编写安全的Selection筛选条件
    推荐使用参数占位符的写法,避免SQL拼接带来的注入风险,对应筛选语句:
    String selection = "date >= ?";
    String[] selectionArgs = new String[]{String.valueOf(rangeStart)};
    
  3. 执行查询的完整片段
    Cursor smsCursor = getContentResolver().query(
        Uri.parse("content://sms/inbox"),
        null, // 可根据需求传入需要查询的列名数组,减少不必要的资源消耗
        selection,
        selectionArgs,
        "date DESC" // 可选配置:按接收时间倒序排列,最新短信优先展示
    );
    

常见问题避坑

  • 不要混淆时间字段:收件箱内的短信接收时间存储在date字段,不要误用sent(短信发送时间)作为筛选字段。
  • 不要搞错时间单位:Sms Provider存储的时间为毫秒级,若传入秒级计算的时间值,会导致筛选范围完全偏离预期(比如误检索到数十年前的旧短信)。
  • 整数溢出风险:计算时间跨度对应的毫秒值时,建议在时间天数参数前加L长整型标识,这是通用最佳实践——当你后续调整查询范围为30天、90天等更长跨度时,不会因为int类型的数值上限触发溢出,导致时间阈值计算完全错误。

内容的提问来源于stack exchange,提问作者African Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 12:06:04