扫出tel:、sms:、wifi:后如何解析?QRCode4cj客户端结果解析完全指南
【免费下载链接】qrcode4cj一维码/二维码扫描库。项目地址: https://gitcode.com/Cangjie-TPC/qrcode4cj
QRCode4cj 是一个解析/生成一维码、二维码的开源扫描库。扫码得到tel:、sms:、wifi:这类 URI 后如何解析?本指南带你快速上手 QRCode4cj 的客户端结果解析(ResultParser),把扫码原始文本拆成电话号码、短信内容、WiFi 密码等结构化字段。
解析流程:原始文本如何变成结构化结果?
QRCode4cj 的客户端模块位于 src/client/result/,核心入口是 result_parser.cj 中的ResultParser.parseResult()。它的工作方式非常直观:
- 拿到扫码得到的原始文本(自动去除 BOM 头)
- 按顺序尝试内置的解析器队列:WiFi → Geo → 电话 → 短信/MMS → 邮件 → URI → 纯文本……
- 哪个解析器"认领"成功就返回对应的结构化结果;全部不匹配则回退为
TextParsedResult
也就是说,你不需要自己判断扫码内容是什么类型,框架会自动路由到正确的解析器,最终结果统一继承自 parsed_result.cj,可通过ParsedResultType区分类型。
一键解析:三步拿到结构化数据
典型用法只需三步(完整示例参考 README.md 的"功能示例"章节):
- 用
MultiFormatReader解码得到Result - 调用
ResultParser.parseResult(result)获得ParsedResult - 根据类型转型后读取字段,或直接用
getDisplayResult()获取可读文本
tel: 电话二维码如何解析?
适用场景:名片、门店牌上的"扫码拨号"二维码。
TelResultParser 的解析规则:
- 支持大小写前缀
tel:/TEL:,会自动归一化为小写 ?之后的 query 部分会被剔除- 结果类 TelParsedResult 提供三个取数方法:
| 方法 | 含义 | 示例输入tel:+8613800138000的输出 |
|---|---|---|
getNumber() | 纯号码 | +8613800138000 |
getTelURI() | 完整 URI | tel:+8613800138000 |
getDisplayResult() | 展示文本 | +8613800138000 |
拿到getNumber()后直接交给系统拨号接口即可,这正是"扫码拨号"功能的核心一行。
sms: / mms: 短信二维码如何解析?
适用场景:预填收件人和短信内容的快捷回复码(RFC 5724 规范)。
SMSMMSResultParser 同时识别sms:和mms:前缀,支持多收件人与扩展语法:
- 多收件人:逗号分隔,
sms:10086,10010?body=Hi - 预填正文与主题:
?body=你好&subject=咨询 - via 中继:非标准但常见的
+12125551212;via=+12124440101写法也兼容
结果类 SMSParsedResult 的关键方法:
| 方法 | 说明 |
|---|---|
getNumbers() | 收件人号码数组 |
getVias() | 与收件人一一对应的中继号码 |
getBody()/getSubject() | 预填正文 / 主题 |
getSMSURI() | 重新拼回标准sms:URI |
💡 小提醒:若短信正文本身带?且没有 body/subject 参数,解析器会保守地把?当作正文内容而非 query 分隔符,避免误拆。
WIFI: 二维码如何解析出 SSID 和密码?
适用场景:餐厅、酒店门口的"扫码连 WiFi"二维码——本指南中最实用的场景。
WifiResultParser 严格按WIFI:前缀匹配(大写),字段以;分隔、反斜杠可转义。各字段含义:
| 字段 | 含义 | 结果类方法 |
|---|---|---|
S: | SSID 名称 | getSsid() |
P: | 密码 | getPassword() |
T: | 加密方式(WPA/WEP/nopass) | getNetworkEncryption() |
H: | 隐藏网络 | isHidden() |
I:/A:/E:/PH2: | 企业认证(EAP/PEAP 等) | getIdentity()等 |
示例:WIFI:T:WPA;S:MyHome;P:88886666;;
解析后ssid=MyHome、password=88886666、加密类型WPA。⚠️ 注意两点:
- SSID 为空的 WIFI: 串会被拒绝(返回不匹配,回退到文本结果)
- 未指定
T:时默认按nopass处理;H:字段在旧数据里可能表示二阶段认证方式,解析器会自动兼容判断
不止 tel/sms/wifi:其他常见类型速查
同一个parseResult()入口还支持更多格式,全部位于 src/client/result/ 目录:
geo:经纬度 → geo_parsed_result.cjmailto:邮件地址 → email_address_parsed_result.cjhttp(s):网页链接 → uri_parsed_result.cj- 商品条码 / ISBN / VIN 码 / 名片(VCard)等 → parsed_result_rype.cj 中定义了完整类型枚举
总结
用一句话概括:解码得到Result后,把原始文本扔给ResultParser.parseResult(),QRCode4cj 就会自动帮你识别tel:、sms:、WIFI:等 URI 并输出结构化字段,剩下的只是调用 getter 而已。想深入细节,可对照 result_parser.cj 中的解析器调度顺序与字段匹配工具方法matchPrefixedField()。
【免费下载链接】qrcode4cj一维码/二维码扫描库。项目地址: https://gitcode.com/Cangjie-TPC/qrcode4cj
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考