Android SMS(一)—— 用 TaoToken 统一 Key 读取短信
1. 从一次真机调试说起Android 读取短信到底卡在哪如果你正在做 Android 本地调试想验证「读取收件箱并打印短信列表」这条链路大概率会遇到三个卡点权限申请没生效、ContentResolver 查询返回空游标、字段解析时person拿到 null 直接崩。这篇就围绕 Android SMS 读取短信的完整流程把权限声明、查询代码、游标解析、Logcat 验证动作一次讲清楚顺带说明怎么把模型调用 endpoint 统一改到 TaoToken 做 Key 管理。先说清楚这套东西是什么、能做什么、适合谁。Android 系统把短信存在mmssms.db里对外通过content://sms/这组 ContentProvider URI 暴露。你不需要直接碰数据库文件用ContentResolver.query()就能拿到游标再按字段解析出号码、正文、时间、类型。适合的人群很明确做本地调试的 Android 开发者、需要验证短信读取链路的测试同学、以及想把短信数据接进自己工具链但不想碰灰色手段的工程同学。我试过在真机上直接跑老代码结果moveToFirst()返回 false一开始以为是权限没给后来发现是查询 URI 写成了content://sms/inbox但设备上收件箱为空。这类问题不复杂但排查起来很费时间所以下面会把每一步的验证动作都写出来你可以照着做。需要提前说明的是读取短信属于敏感权限仅用于你自己的设备本地调试和真机验证不要用于任何未经授权的数据采集。本文所有代码都在本地调试场景下验证。2. TaoToken 前置准备统一 Key 管理与 endpoint 配置在进入代码之前先把模型调用的 endpoint 统一到 TaoToken。这一步的意义在于当你的调试工具、脚本、IDE 插件都要调模型时不用每个地方各配一套 Key改一处就行。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数保持干净。你需要准备三件套Base URL、API Key、Model ID。这三者在任何接入场景里都是必须的缺一个都跑不通。Base URL 填https://taotoken.net/apiAPI Key 在控制台的 API Keys 页面生成Model ID 按你实际要用的模型填。生成 Key 的入口在这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。如果你用的是 Claude Code 这类编码工具接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有对应的配置说明。想先验证模型能不能通可以直接用模型对话页面试一条https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。长期做编码或 Agent 任务的话Coding Plan 会更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。这里要强调一点TaoToken 是模型调用的统一入口不是用来替代 Android Studio 或编辑器的。你的短信读取代码还是在 Android 工程里写TaoToken 只负责模型请求这一层。配置的时候把 Base URL、Key、Model ID 三件套记牢。下面给一个通用的配置片段路径按你实际工具调整{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的ModelID }如果是 TOML 风格的配置[model] base_url https://taotoken.net/api api_key sk-你的Key model 你的ModelID把这段配好之后后面所有模型调用都走同一个 Key换工具时只改这一处。这一步做完再回到 Android 短信读取本身。3. 可复制配置权限声明与 ContentResolver 查询代码这一节是核心直接给可复制的代码。先看 AndroidManifest.xml 的权限声明。uses-permission android:nameandroid.permission.READ_SMS /注意从 Android 6.0API 23开始READ_SMS 属于危险权限光在 Manifest 里声明不够运行时还要动态申请。很多人卡在这里Manifest 写了代码里没申请查询直接抛 SecurityException。运行时申请可以这样写if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) ! PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, 1001); }申请结果在onRequestPermissionsResult里判断grantResults[0] PackageManager.PERMISSION_GRANTED才算通过。权限过了之后进入查询。短信的 URI 有好几种按需选URI含义content://sms/所有短信content://sms/inbox收件箱content://sms/sent已发送content://sms/draft草稿content://sms/outbox发件箱content://sms/failed发送失败content://sms/queued待发送列表查询代码片段Uri uri Uri.parse(content://sms/inbox); String[] projection new String[]{_id, address, person, body, date, type}; Cursor cur getContentResolver().query(uri, projection, null, null, date desc);projection是你想拿的字段selection和selectionArgs是过滤条件最后一个参数是排序。这里按date desc让最新的排前面。字段结构对照一下方便你解析字段含义_id短消息序号thread_id对话序号同一发信人相同address发件人手机号person联系人列表序号陌生人可能为 nulldate日期long 型type1 接收2 发送body短信内容read0 未读1 已读status-1 接收0 complete64 pending128 failed解析游标的时候先moveToFirst()判断有没有数据再循环moveToNext()。取列索引用getColumnIndex取字符串用getString取 long 用getLong。这里有个坑person字段对陌生短信是 null如果你直接getInt会拿到 0但更稳妥的做法是先判断isNull。int idxAddress cur.getColumnIndex(address); int idxBody cur.getColumnIndex(body); int idxDate cur.getColumnIndex(date); int idxType cur.getColumnIndex(type); if (cur.moveToFirst()) { do { String address cur.getString(idxAddress); String body cur.getString(idxBody); long date cur.getLong(idxDate); int type cur.getInt(idxType); Log.d(SMS_DEBUG, addr address body body date date type type); } while (cur.moveToNext()); } cur.close();游标用完一定要close()否则容易泄漏。查询放在子线程里做别在主线程跑不然会 ANR。4. 验证请求与成功结果Logcat 打印短信列表代码写完之后怎么确认真的跑通了最直接的办法是看 Logcat。在 Android Studio 底部打开 Logcat过滤SMS_DEBUG这个 tag。如果你在真机上跑先确认设备已授权 READ_SMS 权限然后触发查询逻辑。正常情况下你会看到类似这样的输出D/SMS_DEBUG: addr8613811810000 body你的验证码是123456 date1256539465022 type1 D/SMS_DEBUG: addr10086 body您本月流量已使用80% date1256539500000 type1每条记录包含号码、正文、时间戳、类型。时间戳是 long 型格式化一下更直观SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss, Locale.getDefault()); String dateStr sdf.format(new Date(date));注意这里用HH是 24 小时制老代码里用hh是 12 小时制容易看错时间。如果你想把结果直接显示在界面上可以用 TextView 拼接或者用 RecyclerView 列表。调试阶段用 Logcat 最快不用管 UI。验证成功的标志有三个一是 Logcat 有输出且字段完整二是没有 SecurityException三是游标正常关闭没有泄漏警告。三个都满足说明读取收件箱这条链路通了。如果查询返回空先确认设备收件箱里确实有短信再检查 URI 是不是写成了content://sms/inbox但设备上收件箱为空。可以换成content://sms/查所有短信试试。5. 本篇常见错排查401、local proxy failed、游标异常调试过程中最常见的几类报错这里逐个对照。第一类是权限相关。如果你看到java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider说明 READ_SMS 没授权。检查 Manifest 声明和运行时申请两步是否都做了。真机上还要去设置里确认应用权限没被手动关掉。第二类是模型调用侧的 401。如果你在调试工具里调模型时看到401 Unauthorized多半是 API Key 没配对或者 Base URL 写错了。回到 TaoToken 控制台确认 Key 有效Base URL 填https://taotoken.net/api注意不要多加斜杠或路径。三件套 Base URL、Key、Model ID 缺一不可。第三类是local proxy failed。这个通常出现在本地代理配置场景检查你的工具代理设置是否指向了正确的地址。如果你用的是 Claude Code 或类似工具参考接入文档里的配置说明确认 endpoint 和 Key 都填对。第四类是游标解析异常比如android.database.CursorIndexOutOfBoundsException。这通常是因为在moveToFirst()返回 false 的情况下还去取列索引。正确做法是先判断moveToFirst()的返回值再进入循环。第五类是person字段为 null 导致的空指针。前面说过陌生短信的person是 null解析时先cur.isNull(idxPerson)判断一下。第六类是 OAuth 相关报错。如果你在接入某些工具时看到 OAuth 失败检查授权流程是否走完Key 是否过期。TaoToken 的 Key 在控制台可以重新生成。排查顺序建议先确认权限再确认 URI 和查询参数最后确认模型调用配置。大部分问题出在前两步。6. 把模型调用接进你的调试链路短信读取跑通之后如果你想把短信内容接进模型做进一步处理比如自动分类或摘要这时候统一 Key 管理的价值就体现出来了。你只需要在调用侧配置一次 Base URL、Key、Model ID所有请求都走 TaoToken。想快速验证模型能不能通用模型对话页面发一条测试消息https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。确认返回正常后再把它接进你的代码。如果你在做长期编码或 Agent 任务Coding Plan 会更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。Key 管理入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后给一个实用技巧调试短信读取时把查询结果先打到 Logcat确认字段完整再往模型送。不要一上来就把原始数据直接丢给模型先本地验证数据质量能省很多排查时间。游标记得关权限记得动态申请三件套记得配齐这三条做到基本不会卡住。

相关新闻

自动化脚本实战:测试、运维、Windows与AI辅助全攻略

自动化脚本实战:测试、运维、Windows与AI辅助全攻略

如果让我说过去十年里最值得投入的一项技能,自动化脚本一定排在前三。它不是某一个编程语言的专利,而是一种“把重复交给机器、把时间留给自己”的工作方式。这篇文章不聊理论,只聊实战:自动化测试、运维自动化、Windows脚本、AI辅…

2026/10/14 12:55:48 阅读更多 →
把 Docling 做成企业服务:Spring Boot 封装下的异步、并发与大文件拆分实战

把 Docling 做成企业服务:Spring Boot 封装下的异步、并发与大文件拆分实战

把 Docling 做成企业服务:Spring Boot 封装下的异步、并发与大文件拆分实战 【免费下载链接】docling Get your documents ready for gen AI 项目地址: https://gitcode.com/GitHub_Trending/do/docling 从 2024 年底在 GitHub 上单周飙升数千 Star 开始&…

2026/10/13 12:02:15 阅读更多 →
Flutter鸿蒙化适配:auto_exporter代码生成与Barrel文件治理实践

Flutter鸿蒙化适配:auto_exporter代码生成与Barrel文件治理实践

1. 项目概述与适配背景1.1 核心需求解析先说结论:auto_exporter 是一个基于 Dart 注解的代码生成工具,它的核心价值在于自动维护 Dart 和 Flutter 项目里的 barrel 文件(也就是 export 汇总文件)。这类文件通常叫做xxx.dart或barr…

2026/10/12 23:49:26 阅读更多 →

最新新闻

podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

简介:Podofo 0.9.5 在 Visual Studio 2013 下编译生成的 x86 预编译库,面向需要在 Windows 平台读写、编辑 PDF 文件的 C 开发者。Podofo 是一套开源 PDF 处理库,支持元数据读取、页面渲染、文本抽取、文档生成等常用能力,本包省去…

2026/10/14 12:54:56 阅读更多 →
从零实现轻量级实时事件聚合器:滑动窗口与增量聚合实战

从零实现轻量级实时事件聚合器:滑动窗口与增量聚合实战

1. 从“rea”这个标题说起:一个极简命名背后的完整项目思维 第一次看到“rea”这个标题,很多人会愣一下——三个字母,没有上下文,没有说明,甚至不知道它指代什么。但恰恰是这种极简命名,在技术圈和创意圈里…

2026/10/14 12:54:56 阅读更多 →
城市轨道交通GNSS控制网数据处理:从基线解算到网平差全流程

城市轨道交通GNSS控制网数据处理:从基线解算到网平差全流程

简介:这份PDF文献面向城市轨道交通测量、GNSS控制网数据处理及相关工程技术人员,聚焦线路控制网建设中长度变形计算与不同线路间无缝对接两大核心难题。全文结合某市轨道交通线路GNSS控制网实例,系统推导高程归化与高斯投影长度变形的计算公式…

2026/10/14 12:54:56 阅读更多 →
Python命名规范转换:蛇形与帕斯卡命名实践

Python命名规范转换:蛇形与帕斯卡命名实践

1. 命名转换的背景与价值 在Python开发中,命名规范直接关系到代码的可读性和维护性。蛇形命名(snake_case)和帕斯卡命名(PascalCase)是两种最常见的命名约定,它们分别适用于不同的场景: 蛇形命名:单词间用下划线连接,…

2026/10/14 12:54:56 阅读更多 →
单细胞RNA测序数据导入与质量控制指南

单细胞RNA测序数据导入与质量控制指南

1. 单细胞RNA测序数据入门操作指南刚接触单细胞RNA测序(scRNA-seq)数据分析时,最基础也是最重要的第一步就是获取并正确导入数据。作为生物信息学分析流程的起点,这个环节的规范操作直接影响后续所有分析步骤的可靠性。本文将详细介绍从公共数据库获取单…

2026/10/14 12:53:55 阅读更多 →
lingbot-map 解析:自动化智能体的地图映射与状态管理框架

lingbot-map 解析:自动化智能体的地图映射与状态管理框架

1. 从“lingbot-map”这个标题说起:它到底想解决什么问题 第一次看到“lingbot-map”这个项目名,我的直觉是:这大概率是一个把“地图”与“机器人/智能体”结合起来的工具。拆开来看,“ling”可能是某个前缀或代号,“b…

2026/10/14 12:53:55 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →