You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio Verification SDK在Android 7.0/8.0无法读取SMS问题求助

解决Twilio Verification SDK在Android 7.0/8.0无法读取短信的问题

根据你描述的场景——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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:18