恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Android 获取最新短信实战:ContentResolver 查询与 TaoToken 配置骨架

  • 首页
  • 资讯中心
  • /
  • Android 获取最新短信实战:ContentResolver 查询与 TaoToken 配置骨架

相关资讯

PaddleOCR 更换模型避坑指南:从 config 到 TaoToken 统一 Key 的完整配置 2026/9/23 13:51:30
微信小程序电影购票系统源码解析:数据库表设计与选座下单全链路 2026/9/23 13:51:30
Convex 调度实战:用 cronJobs 定时任务与 scheduler.runAfter 构建自毁消息应用 2026/9/23 13:51:30

最新资讯

适合跨境电商的海外广告账户资源平台
共射极放大电路实验报告:从静态工作点到自动生成docx
uni-id-pages配置Email验证码全流程:SMTP与云函数避坑指南
搞懂开户银行行号是什么,手写实现银行数据校验避坑指南
STM32用PWM实现模拟电压输出:滤波电路设计与避坑指南
OpenCV阴影检测与去除实战:基于YCbCr光照估计的完整方案

今日推荐

3招搞定手机怎么下载微信面试难题实战项目解析
清单计价规范2013手写实现:3个血泪坑教你避开90%的返工
搞定msn股票中国数据延迟:实战项目里省下的200ms

本周热门

BrewUI:给Homebrew套上图形界面,让macOS软件包管理更简单
BrewUI:让Homebrew包管理变得可视化与高效
公式与文本对齐全攻略:从Word到LaTeX的实用技巧

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

Android 获取最新短信实战:ContentResolver 查询与 TaoToken 配置骨架

发布时间:2026/9/23 13:51:30
Android 获取最新短信实战:ContentResolver 查询与 TaoToken 配置骨架 1. 短信读取这件事为什么总在真机上翻车Android 获取最新短信说白了就是拿ContentResolver去查content://sms/这个系统收件箱按date desc倒序排一下取第一条就完事。听起来三行代码能搞定但真正在真机上跑你会发现坑一个接一个模拟器上查得到、真机返回空 Cursor权限在 Android 13 上申请了还是 SecurityException查出来的date字段是毫秒时间戳直接塞进SimpleDateFormat格式化出来是 1970 年更别提有些厂商 ROM 对短信 Provider 做了额外限制。这篇就聚焦一件事在 Android 端通过 ContentResolver 读取收件箱里最新的一条短信把运行时权限申请、按日期倒序查询、结果解析这条链路完整跑通。同时给出一份 TaoToken 统一 Key/API 通道的settings.json配置骨架方便你在调试短信解析逻辑时把模型调用也一并接进来做内容识别或格式化。适合正在做短信验证码自动填充、通知类短信归类、或者单纯想跑通 ContentResolver 查询的开发者。我试过在几台不同 Android 版本的机器上反复验证下面这套流程是能稳定拿到最新一条短信的。核心检索词就三个Android、短信、ContentResolver围绕它们展开。2. 前置准备权限、Provider 与 TaoToken 通道2.1 短信权限的声明与运行时申请读取短信属于危险权限必须在AndroidManifest.xml里声明然后在运行时动态申请。注意READ_SMS和RECEIVE_SMS是两回事前者是读已有短信后者是监听新到短信。本篇只读收件箱所以核心是READ_SMS。manifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.example.smsreader uses-permission android:nameandroid.permission.READ_SMS / !-- 如果后续要监听新短信再加下面这条 -- uses-permission android:nameandroid.permission.RECEIVE_SMS / application android:allowBackuptrue android:labelSmsReader android:themestyle/Theme.AppCompat activity android:name.MainActivity android:exportedtrue intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity /application /manifest运行时申请用ActivityResultLauncher别再用老的onRequestPermissionsResult回调容易漏掉分支private final ActivityResultLauncherString smsPermissionLauncher registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted - { if (granted) { readLatestSms(); } else { Toast.makeText(this, 未授予短信读取权限, Toast.LENGTH_SHORT).show(); } }); private void ensurePermissionAndRead() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) PackageManager.PERMISSION_GRANTED) { readLatestSms(); } else { smsPermissionLauncher.launch(Manifest.permission.READ_SMS); } }注意Android 6.0 以下权限在安装时授予但现在的项目基本不用管那么老的版本。Android 13 及以上对短信权限没有额外收紧但部分厂商 ROM 会在应用商店审核层面限制真机调试时如果一直返回空先确认权限状态是不是PERMISSION_GRANTED。2.2 TaoToken 统一 Key/API 通道的 settings.json 骨架短信读出来之后很多时候你要做的是把短信内容丢给模型做解析比如识别验证码、判断是不是营销短信。这时候如果每个模型都单独配 Key管理起来很乱。TaoToken 提供统一 Key 和 API 通道官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。下面是一份settings.json配置骨架放在项目根目录或者你的配置目录下用于统一管理模型通道。字段名按你实际接入的 SDK 调整这里给的是通用结构{ taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的统一Key, defaultModel: claude-sonnet-4-20250514, timeoutMs: 30000, retry: { maxAttempts: 3, backoffMs: 800 } }, smsParser: { model: claude-sonnet-4-20250514, systemPrompt: 你是一个短信解析助手从短信正文中提取验证码、发送方、业务类型输出 JSON。, maxTokens: 512 } }Key 的获取在控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。如果你只是想先验证模型能不能正常返回可以直接用模型对话页面试一条https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。长期做编码或 Agent 类任务可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。提示baseUrl末尾不要带斜杠很多 SDK 拼接路径时会出双斜杠导致 404。API 地址统一用 https://taotoken.net/api 不要加 UTM 参数到代码里。3. 可复制配置ContentResolver 查询最新短信3.1 按 date desc 查询并取第一条原始做法是query之后while (cursor.moveToNext())遍历全部再在循环里判断i cursor.getCount() - 1。这样写有两个问题一是把整个收件箱都读了一遍短信多的时候很慢二是边界判断容易出错。既然只要最新一条直接在查询参数里用sortOrder date desc然后moveToFirst()就够了。private void readLatestSms() { Cursor cursor null; try { cursor getContentResolver().query( Uri.parse(content://sms/inbox), new String[]{_id, address, body, date, type}, null, null, date desc ); if (cursor null) { Log.e(SmsReader, cursor 为 nullProvider 可能不可用); return; } if (!cursor.moveToFirst()) { Log.d(SmsReader, 收件箱为空); return; } int idxAddress cursor.getColumnIndex(address); int idxBody cursor.getColumnIndex(body); int idxDate cursor.getColumnIndex(date); String address cursor.getString(idxAddress); String body cursor.getString(idxBody); long dateMillis cursor.getLong(idxDate); String time new SimpleDateFormat(yyyy-MM-dd HH:mm:ss, Locale.getDefault()) .format(new Date(dateMillis)); Log.d(SmsReader, 最新短信来自: address); Log.d(SmsReader, 时间: time); Log.d(SmsReader, 内容: body); } catch (SecurityException e) { Log.e(SmsReader, 缺少 READ_SMS 权限, e); } finally { if (cursor ! null) { cursor.close(); } } }几个关键点content://sms/inbox只查收件箱比content://sms/更精确避免把已发送、草稿也带出来sortOrder传date desc让 Provider 在数据库层排序比在 Java 层排序高效moveToFirst()直接定位第一条不用遍历。3.2 结果解析与字段说明短信 Provider 的字段里常用的就这几个字段名类型说明_idint短信在数据库中的主键addressString发送方号码可能是手机号或服务号bodyString短信正文datelong收到时间毫秒时间戳typeint1 为收件2 为发件3 为草稿date字段是毫秒时间戳直接new Date(long)再格式化就行。如果你拿到的是字符串先Long.parseLong转一下。address有时为 null比如某些系统短信做展示时给个「未知」兜底。如果你要把短信内容交给模型解析可以在拿到body之后调用 TaoToken 通道。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言 SDK 的调用示例。Claude Code 相关的接入说明在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。4. 真机验证从安装到看到日志4.1 验证步骤第一步把上面的权限声明和readLatestSms()代码放进项目在MainActivity.onCreate里调用ensurePermissionAndRead()。第二步用 USB 连接真机打开开发者选项和 USB 调试adb devices确认设备在线。第三步安装并启动应用系统会弹出短信权限对话框点允许。第四步用另一台手机给测试机发一条短信内容随便写比如「测试验证码 123456」。第五步看 Logcat过滤 tagSmsReader应该能看到类似输出D/SmsReader: 最新短信来自: 106xxxxxxxx D/SmsReader: 时间: 2025-01-15 14:32:08 D/SmsReader: 内容: 测试验证码 123456如果日志里address和body都正常说明整条链路通了。这时候你可以把body丢给 TaoToken 的模型通道做进一步解析比如提取验证码。4.2 用 adb 直接验证 Provider 是否可读有时候代码没问题但真机就是返回空。可以先绕过应用用 adb 直接查 Provider确认系统层面是否允许adb shell content query --uri content://sms/inbox --projection address:body:date --sort date DESC如果这条命令能返回数据说明 Provider 正常问题在应用权限或代码如果返回No result found或者权限错误那就是系统层面限制了。部分厂商 ROM 对content query也有保护这条命令失败不代表应用一定读不到但能作为参考。5. 本篇常见错排查5.1 返回空 Cursor 或 SecurityException最常见的原因是权限没真正授予。检查checkSelfPermission的返回值别只看对话框弹没弹。Android 11 及以上如果用户选了「仅本次允许」应用退到后台再回来权限会失效需要重新申请。另外targetSdkVersion太高时部分 ROM 会要求你在 Manifest 里同时声明READ_SMS和RECEIVE_SMS才放行读取可以先都加上试试。还有一种情况是查询的 URI 写错了。content://sms/和content://sms/inbox行为不同前者包含所有类型后者只有收件箱。如果你要的是最新收到的短信用inbox更准。5.2 时间格式化出来是 1970 年date字段是毫秒时间戳但如果你用cursor.getString(idxDate)拿到的是字符串再Long.parseLong一般没问题。出 1970 通常是因为getColumnIndex返回了 -1导致取到了错误的列或者date字段本身为 0。先打印idxDate确认列索引有效再打印原始dateMillis看是不是 0。5.3 查询很慢或 ANR如果你用了content://sms/并且没加sortOrderProvider 可能返回全部短信几千条的时候主线程直接卡死。两个改法一是查询放到子线程用ExecutorService或Coroutine二是 URI 用inbox并加date desc让数据库层排序并配合moveToFirst()只取一条。如果确实要读多条用CursorLoader或者分页查询。5.4 TaoToken 调用返回 401 或超时先确认apiKey是不是从控制台复制的完整 Key有没有多余空格。baseUrl用 https://taotoken.net/api 不要自己拼/v1之类的路径具体路径以接入文档为准。超时的话把timeoutMs调到 60000 试试短信解析这种短文本一般不会超时除非网络本身有问题。如果一直 401去 API Keys 页面重新生成一个 Key 再试https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。6. 把短信读取接进你的调试链路短信读取本身不复杂难的是权限状态、URI 选择、时间戳解析这几个细节。把content://sms/inboxdate descmoveToFirst()这套组合用熟基本能覆盖「获取最新一条短信」的所有场景。读出来之后如果你要做内容识别把body通过 TaoToken 的统一通道发给模型settings.json里配好baseUrl和apiKey就能跑。验证模型连通性用模型对话页面最快长期编码任务再考虑 Coding Plan。接入过程中遇到报错先查接入文档里的错误码说明大部分问题都能定位到。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号