Twilio Verification SDK在Android 7.0/8.0无法读取SMS问题求助
根据你描述的场景——SDK在Android 6.0能正常触发广播回调,但7.0/8.0收到短信后PhoneVerificationReceiver完全没反应,结合Twilio SDK的工作逻辑和Android版本的权限/广播机制变化,我整理了几个关键排查方向和修复方案:
1. 适配Android 7.0+的隐式广播限制
从Android 7.0(API 24)开始,系统对隐式广播做了严格限制,即使是Twilio自定义的com.twilio.verification.current_status广播,静态注册的接收器也可能被系统拦截。
修复方案:改用动态注册广播接收器
把Manifest中的静态注册替换成在页面内动态注册,这样能绕过系统的隐式广播限制:
private lateinit var verificationReceiver: PhoneVerificationReceiver override fun onResume() { super.onResume() // 初始化接收器并动态注册 verificationReceiver = PhoneVerificationReceiver() val intentFilter = IntentFilter("com.twilio.verification.current_status") registerReceiver(verificationReceiver, intentFilter) // 保留原有的RxBus订阅逻辑 disposable.add( RxBus.listen(PhoneVerificationEvent::class.java) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ // 状态处理逻辑不变 }, { Timber.e(it) }) ) } override fun onPause() { // 页面暂停时注销接收器 unregisterReceiver(verificationReceiver) disposable.clear() super.onPause() }
记得删除AndroidManifest中对应的<receiver>声明,避免重复注册冲突。
2. 确认短信权限的动态申请(Android 6.0+强制要求)
虽然你minSdk是23,但Android 7.0+对短信权限的校验更严格,Twilio SDK需要READ_SMS和RECEIVE_SMS权限才能监听并解析短信内容。
修复方案:启动验证前主动申请权限
private val SMS_PERMISSION_REQUEST = 1001 private fun startVerificationFlow() { val requiredPermissions = arrayOf( Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS ) val hasAllPermissions = requiredPermissions.all { ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED } if (hasAllPermissions) { // 权限已授权,启动Twilio验证 initTwilioVerification() } else { ActivityCompat.requestPermissions(this, requiredPermissions, SMS_PERMISSION_REQUEST) } } // 处理权限申请结果 override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == SMS_PERMISSION_REQUEST) { if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { initTwilioVerification() } else { // 提示用户必须授权才能完成验证 } } }
3. 重新校验应用哈希签名(Android 7.0+核心要求)
你提到已经配置了哈希,但Android 7.0+对短信中的哈希校验零容错,很容易出现配置错误:
- 确认你用的是对应构建包的签名证书生成哈希:debug包用debug证书,发布包用正式证书
- 检查Twilio控制台中配置的哈希和你本地生成的完全一致(注意Base64编码的大小写,不要有多余空格或换行)
4. 升级Twilio SDK版本
你当前使用的1.0.9版本比较老旧,大概率存在Android 7.0+的适配bug。建议升级到最新稳定版(比如2.x系列),新版本会针对性修复系统版本兼容问题。
升级依赖示例:
// 替换原有的依赖 implementation 'com.twilio:verification:2.0.+' // 或指定具体最新版本号
注意:新版本API可能有变更,需要参考官方文档调整初始化和验证逻辑。
5. 调试广播发送状态
用ADB命令查看系统广播日志,确认Twilio是否真的发送了状态更新广播:
adb logcat | grep "com.twilio.verification.current_status"
如果日志中能看到广播被发送,但接收器没收到,那问题出在注册方式或权限;如果完全没看到广播,说明SDK没检测到短信,重点排查哈希签名或短信格式。
按照以上步骤逐一排查,应该能解决Android 7.0/8.0上无法读取短信的问题。
内容的提问来源于stack exchange,提问作者Fausto Ruvalcaba

