使用getContentResolver().query查询content://sms/inbox近10天筛选SQL
Android 近10天收件箱短信查询的Selection筛选写法
核心逻辑说明
- 短信内容提供者(Sms Provider)的收件箱表中,标识短信接收时间的固定字段为
date,字段值为毫秒级Unix时间戳,数值越大代表短信接收时间越临近当前。 - 实现10天范围筛选的核心逻辑:取当前系统时间往前回溯10天的时间戳作为阈值,所有接收时间大于等于该阈值的短信,都属于目标查询范围。
正确实现步骤
- 计算时间范围阈值
10天对应的毫秒偏移量计算需注意代码规范性,正确计算方式:// 计算10天对应的毫秒总时长,开头加L标识为长整型,为后续调整查询范围留足容错空间 long tenDaysDuration = 10L * 24 * 60 * 60 * 1000; // 计算范围起点的时间戳:当前时间减去10天时长 long rangeStart = System.currentTimeMillis() - tenDaysDuration; - 编写安全的Selection筛选条件
推荐使用参数占位符的写法,避免SQL拼接带来的注入风险,对应筛选语句:String selection = "date >= ?"; String[] selectionArgs = new String[]{String.valueOf(rangeStart)}; - 执行查询的完整片段
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
相关产品推荐
相关产品推荐

