- 删除 VerificationCodeParser 及相关测试,短信捕获和推送不再解析验证码 - 飞书推送改为只发送短信原文,时间戳格式化为可读日期 - 移除主界面"只推送验证码"开关和"调试时上传完整短信正文"选项 - 移除"保存轮询间隔"按钮,开启轮询时自动保存间隔(未输入默认1秒) - 按钮文字从"开始1秒轮询验证码"改为"开始短信轮询" - 删除"打印最近30条短信"功能及相关 SmsInboxReader.logRecentMessages - SmsInboxReader 用 RecentSmsResult 替换 RecentCodeResult - FeishuWebhookConfigStore.Config 移除 filterVerificationCode/sendFullBodyDebug - 修复代码缩进不一致问题
54 lines
3.8 KiB
Markdown
54 lines
3.8 KiB
Markdown
## Why
|
||
|
||
你想做的不是完整短信客户端,而是一个只服务自己手机的短信接收工具:在小米 12S、澎湃 OS 3、Android 15 上尽可能可靠地读取新收到短信的原文,并把关键结果快速展示出来。
|
||
|
||
这类需求的关键不在 UI,而在 Android 15 与厂商系统对短信权限、广播分发、后台限制和短信原文读取链路的真实行为。因此必须先把可用 API、兜底路径和真机验证方案写清楚,再进入编码。
|
||
|
||
## What Changes
|
||
|
||
- 新建一个 Android App 规格方案,目标能力限定为“接收短信原文、展示最近结果、输出诊断状态”。
|
||
- 明确三条可用 SMS 获取路径,并按优先级落地:
|
||
- `Telephony.Sms.Intents.SMS_RECEIVED_ACTION` + `RECEIVE_SMS`:主路径,适合个人自用、非 Play 上架场景,直接读取收到短信内容。
|
||
- `SMS User Consent API`:备选路径,不要求短信带 app hash,但需要用户对单条短信授权,适合验证系统广播被限制时的可行性。
|
||
- `SMS Retriever API`:受控格式路径,不需要短信权限,但要求测试短信包含当前 app 的 hash,更适合服务端可控短信模板,不适合作为读取任意平台短信的主路径。
|
||
- 明确不把 Android Studio、Gradle、JDK 环境初始化纳入本次工作,后续实现时参考已有 `Weather` 项目的构建环境。
|
||
- 设计短信原文处理和展示策略,支持短信多段 PDU 合并后的完整正文展示、最近结果存储和诊断摘要。
|
||
- 设计真机验证路径,重点验证 Android 15 + HyperOS 3 上:
|
||
- 运行时申请 `RECEIVE_SMS` 是否成功。
|
||
- 应用在前台/后台时 `SMS_RECEIVED_ACTION` 是否触发。
|
||
- 短信正文是否能被解析为完整 message body。
|
||
- 常见短信原文是否能稳定读取。
|
||
- 建立诊断能力,暴露权限状态、API 路径状态、最近一次广播时间、最近一次读取结果和失败原因。
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
- `sms-code-capture`: 定义应用通过系统短信广播、Google SMS 验证 API 备选路径接收短信正文并保留原始内容的行为要求。
|
||
- `sms-permission-diagnostics`: 定义应用对短信权限、接收状态、API 可用性和解析失败原因的诊断展示要求。
|
||
- `sms-code-validation-workflow`: 定义在小米 12S、澎湃 OS 3、Android 15 真机上的短信原文读取验证流程和测试通过标准。
|
||
|
||
### Modified Capabilities
|
||
|
||
- 无。当前 `SmsReceive` 目录没有既有 OpenSpec 能力规格。
|
||
|
||
## Impact
|
||
|
||
- 预期后续会创建一个最小 Android 工程或复用 Weather 工程环境生成同类 Android 工程配置。
|
||
- 预期会影响 Android Manifest、运行时权限申请、BroadcastReceiver、短信 PDU 解析、最近结果展示、前台诊断 UI 和测试用例。
|
||
- 需要引入或使用的主要 Android/Google API:
|
||
- `android.provider.Telephony.Sms.Intents.SMS_RECEIVED_ACTION`
|
||
- `android.permission.RECEIVE_SMS`
|
||
- `Telephony.Sms.Intents.getMessagesFromIntent(Intent)`
|
||
- `com.google.android.gms.auth.api.phone.SmsRetriever`
|
||
- `SMS User Consent API`
|
||
- 不以 Play Store 上架合规为目标,因此可以使用短信权限;但实现仍必须以本地读取、展示和诊断为主线,减少不必要的短信内容扩散。
|
||
|
||
## Validation
|
||
|
||
- OpenSpec 文档结构完整,至少包含 `proposal.md`、`design.md`、`tasks.md` 和三个 capability spec。
|
||
- API 方案必须明确主路径、备选路径、适用条件和限制,不写成泛泛而谈的短信读取方案。
|
||
- 设计必须说明 Android 15、HyperOS 3、个人自用 sideload/debug 场景下的权限与后台行为风险。
|
||
- 后续实现前必须能从任务列表直接进入编码,不再需要重新讨论核心架构。
|
||
- 后续实现完成后,必须在目标真机上完成至少一轮短信接收、展示和诊断验证。
|