Android获取短信主要通过两种方式:注册BroadcastReceiver监听系统短信广播,或通过ContentResolver直接查询短信数据库,开发者需要根据场景选择合适的方法,并确保在Android 6.0及以上正确申请权限,同时注意不同厂商(如小米、华为、OPPO、荣耀)的系统定制可能带来的兼容性问题。

Android获取短信的两种核心方法
通过BroadcastReceiver监听短信广播
这是最常用的实时获取短信的方式,当设备收到短信时,系统会发送有序广播android.provider.Telephony.SMS_RECEIVED,开发者只需注册一个广播接收器即可捕获短信内容。
- 实现步骤:
- 在
AndroidManifest.xml中声明<receiver>,并设置<intent-filter>为android.provider.Telephony.SMS_RECEIVED,同时添加<uses-permission android:name="android.permission.RECEIVE_SMS" />。 - 在
onReceive方法中,从Intent中提取pdus数组,将每条pdu解析为SmsMessage对象,进而获取短信正文、发送号码等。 - 注意:Android 6.0+还需要在运行时请求
RECEIVE_SMS权限,且系统可能会限制后台广播接收。
- 在
- 优点:实时性高,适合验证码自动填充场景。
- 缺点:需要用户授权,且部分厂商(如小米MIUI)可能会默认关闭自启动导致广播无法触发。
通过ContentResolver查询短信数据库
适用于需要读取历史短信的场景,例如导入备份或短信管理。
- 实现步骤:
- 在
AndroidManifest.xml中声明<uses-permission android:name="android.permission.READ_SMS" />。 - 在代码中通过
getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null)获取所有短信,或使用条件筛选第一条。 - 遍历Cursor,提取字段如
body、address、date等。
- 在
- 优点:可以获取已存储的短信,不受实时性限制。
- 缺点:需要用户授权
READ_SMS,且从Android 14开始,系统进一步限制第三方应用对短信数据库的直接访问,除非应用是默认短信应用或拥有特殊权限。
权限要求与厂商适配
android读取短信权限设置清单
| 权限名称 | 用途 | 请求时机 |
|---|---|---|
RECEIVE_SMS |
接收短信广播 | 运行时请求(Android 6.0+) |
READ_SMS |
读取短信数据库 | 运行时请求(Android 6.0+) |
在Android 6.0及以上,除了在清单中声明,还需要在代码中通过ActivityResultLauncher请求权限,并处理用户拒绝的情况,根据Android官方文档,开发者应始终检查权限是否被授予,并在被拒绝时提供解释。
Android 14+的隐私限制
Android 14(API 34)进一步收紧了对短信数据库的访问,非默认短信应用无法再通过READ_SMS权限读取短信,官方推荐使用SMS User Consent API或SMS Retriever API来获取验证码,这些API无需直接读取数据库,用户授权后系统会返回指定短信内容,对于android怎么获取短信内容的需求,如果只用于验证码,应及时迁移到这些新API。
各大厂商适配踩坑记录
针对小米手机android获取短信权限和华为手机获取短信验证码等常见问题,以下是实测经验:

- 小米(MIUI):默认禁止应用自启动,导致广播接收器无法在后台唤醒,用户必须进入“手机管家”->“应用管理”->“权限”->“自启动管理”,将应用设为允许,在“电量和性能”中关闭后台限制,MIUI还会对
RECEIVE_SMS权限进行二次确认,需要在权限管理中手动开启“读取短信”权限。 - 华为(EMUI):系统会拦截第三方应用的短信广播,尤其是
SMS_RECEIVED,建议使用SMS Retriever API,或通过华为推送服务获取验证码,如果必须使用广播,需引导用户进入“设置”->“应用”->“权限管理”,开启“读取短信”和“自启动”。 - OPPO与荣耀:类似地,需要在“权限管理”中允许“读取短信”和“后台运行”,OPPO ColorOS还要求应用在“最近任务”中锁定,防止被清理。
android获取短信验证码自动填充的实战方案
针对android获取短信验证码自动填充需求,以下两种方案各有优劣。
SMS Retriever API(Google官方推荐)
- 原理:应用在后台注册一个
SmsRetriever客户端,当收到包含特定哈希前缀的短信时,系统自动将短信内容发送给应用,无需任何权限。 - 优点:无需
RECEIVE_SMS或READ_SMS权限,兼容性高,适用于Android 5.0+。 - 缺点:需要服务端配合生成短信(格式为
<#> 您的验证码是123456,哈希码),且只能获取一条验证码短信。
BroadcastReceiver手动解析
- 原理:监听
SMS_RECEIVED广播,提取短信正文,通过正则表达式匹配验证码。 - 优点:实现简单,可同时获取短信内容进行其他处理,如备份或显示。
- 缺点:需要申请权限,且受厂商限制影响较大,如果广播无法触发,则获取失败。
对比:如果应用仅需验证码自动填充,优先选择方案一;如果需要完整的短信读取功能(如短信备份),则必须使用方案二,并做好权限适配和厂商引导,使用方案二时,用户体验好,无需退出程序即可获取验证码并自动填充。
获取短信内容后的处理与优化
解析验证码的正则技巧
使用Pattern.compile("\d{4,6}")可以匹配4到6位数字验证码,但需注意排除短信中的手机号、日期等数字,建议先通过address字段过滤特定发件人(如银行、平台),提高准确性。
安全与性能注意事项
- 避免频繁查询数据库:使用ContentResolver时,添加
selection参数(如"date > ?")只查询最近一段时间,并限制limit数量。 - 及时释放资源:Cursor使用后必须关闭,防止内存泄漏。
- 加密存储:获取的短信内容不应明文保存,尤其是验证码,使用后立即清除。
- 防御性设计:对于权限被拒绝或广播被拦截的情况,提供友好的引导界面,并支持用户手动输入验证码。
在2026年,Android获取短信的核心在于平衡实时性、权限开销和厂商兼容性,对于android怎么获取短信内容这一需求,开发者应优先评估是否可以使用SMS Retriever API避免权限问题;若需要完整的短信读取能力,则必须扎实处理android读取短信权限设置,并针对小米手机android获取短信权限、华为手机获取短信验证码等常见场景做好适配,掌握这些要点,才能构建稳定、用户体验良好的短信获取功能。
问答模块
问题1:android获取短信验证码自动填充失败,可能是什么原因?
解答:常见原因包括:未正确请求RECEIVE_SMS权限;厂商系统拦截了广播;Android 14+限制了非默认短信应用的短信读取;或使用了已废弃的API,建议先检查日志,确认广播是否被触发,如果未触发,引导用户开启自启动和后台权限,如果触发但未解析成功,检查正则表达式是否匹配。

问题2:android读取短信权限设置后,仍然无法获取短信怎么办?
解答:首先确认Android版本:Android 14以上推荐使用SMS User Consent API,如果仍使用ContentResolver,确认应用是否为默认短信应用(非默认会返回空),查看厂商权限管理,是否在系统设置中额外关闭了“读取短信”权限,测试时使用真实的短信发送,避免模拟器环境。
问题3:小米手机android获取短信权限需要注意哪些细节?
解答:除了在清单和代码中声明权限外,必须在MIUI的“自启动管理”中开启应用自启动,否则广播接收器无法在后台运行,在“权限管理”中确保“读取短信”权限已开启,如果应用需要读取历史短信,也需申请READ_SMS权限,并引导用户开启,部分MIUI版本还会要求关闭“禁用应用”或“省电模式”中的限制。
如果你在实际开发中遇到了其他问题,欢迎在评论区留言交流。
参考文献
- 博客园用户. (2025). Android解析短信操作详解.
- 博客园用户. (2025). Android: 接收和发送短信.
- 掘金用户. (2026). Android 获取短信验证码并自动填充(踩坑小米、荣耀、OPPO、华为).
- 阿里云开发者社区. (2026). Android获取短信并自动填充实践.
各位小伙伴们,我刚刚为大家分享了有关android怎么获取短信的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/137153.html