每个网购过的人都被快递通知折磨过:短信被淹没,取件时翻聊天记录,取完件还要手动删通知。
码达 toCode 监听系统通知栏:所有快递通知(短信、菜鸟、丰巢、快递 100 等发到通知栏的消息)都会经过它的识别引擎,取件码、快递公司、取件地点被自动提取、结构化入库。通知不该被复制粘贴,应该被"收走"。
- 🎯 全自动捕获 — 无需复制粘贴,通知到达即提取,取件完成一键归档
- 🔍 混合识别引擎 — 关键词初筛 + 三级正则(前缀词 / 分段数字 / 数字兜底)+ 可选 AI 兜底,严格排除运单号、日期、金额、门牌号误判
- 🏢 21 家快递公司识别 + 取件地点解析(驿站 / 快递柜 / 代收点)
- 🗂 待取 / 已完成 双列表管理,同码智能合并,全局搜索,批量操作
- 💎 液态玻璃视觉 — AGSL SDF 边缘光、渐进模糊顶栏、液态底栏,内置 Full / Degraded / Fallback 三级性能降级
- 🔐 本地优先 — 无账号无云端;AI Key 经 AndroidKeyStore + AES/GCM 加密存储
- 🧪 6 组单元测试 覆盖识别引擎与数据层
| 分类 | 技术 |
|---|---|
| 语言 | Kotlin 2.4 |
| UI | Jetpack Compose + Miuix + 自研液态玻璃特效层(AGSL RuntimeShader) |
| 架构 | 单 Activity + Compose 页面 + Repository |
| 数据 | Room(4 索引 + 3 版迁移)+ DataStore |
| 异步 | Coroutines + Channel 生产者-消费者队列 + LRU 去重 |
| AI(可选) | 兼容 OpenAI Chat Completions 协议的任意端点,HttpURLConnection + kotlinx.serialization |
| 加密 | AndroidKeyStore + AES/GCM(API Key 静态加密) |
通知 → 关键词初筛(40+ 词,廉价过滤)
→ AI 语义抽取(可选,失败自动降级)
→ 三级正则抽取:
① 前缀词正则(取件码/提货码/凭码… 12 种)
② 分段数字 6-2-0838(排除日期 2026-10-21 与金额上下文 ¥ / 元)
③ 纯数字兜底(唯一最长者,排除年份)
→ 快递公司识别(【签名】优先 + 最长匹配)
→ 取件地点解析(括号站点 → 动词触发 → 宽松兜底)
→ 同码合并入库
设计原则:规则优先、AI 兜底、误报的代价高于漏报。详见博客文章《一条通知里的取件码》。
- Android Studio(较新版本)+ JDK 21
- Android SDK 24 (minSdk) — 37 (targetSdk/compileSdk)
git clone https://github.com/Fq77/toCode.git
cd toCode
# 用 Android Studio 打开,同步 Gradle 后运行
./gradlew installDebug- 授予通知使用权(设置 → 通知读取权限)
- (可选)设置页配置 AI 接口:任意 OpenAI 兼容端点 + API Key + 模型名,用于长尾通知的语义兜底
app/src/main/java/com/tocode/app/
├── ai/ # AI 客户端与语义识别(AiClient / AiRecognizer / AiCallMonitor)
├── data/
│ ├── db/ # Room 数据库、DAO、迁移
│ ├── model/ # ExpressItem 实体
│ ├── prefs/ # DataStore 设置
│ └── repository/# 仓库层(同码合并、备份恢复)
├── engine/ # 识别引擎(ExpressRecognizer / CodeExtractor / KeywordMatcher)
├── service/ # NotificationListenerService 通知监听
├── ui/
│ ├── effects/ # 液态玻璃特效(EdgeLight SDF 着色器 / Glass / 渐进模糊)
│ ├── glass/ # 液态底栏、阻尼拖拽
│ ├── home/ history/ settings/ setup/ detail/ common/
│ └── theme/ # 主题
└── util/ # 取件地点解析、导出、加密等
MIT © Fq77