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

Android 14接收OTP时因RECEIVER配置触发SecurityException崩溃求助

问题解决:Android 14下OTP页面崩溃的SecurityException问题

环境配置

  • Dart版本:>=2.19.4 <3.0.0
  • 依赖库:
    • firebase_core: ^2.15.1
    • firebase_messaging: ^14.6.6
    • flutter_local_notifications: ^15.1.0+1

问题详情

应用在OTP验证页面崩溃,抛出异常:

java.lang.SecurityException: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

仅在Android 14设备出现该问题,Android 12(Go版)无异常。已在AndroidManifest.xml中设置android:exported="true",升级firebase_core和firebase_messaging版本后问题仍未解决。

解决方案

1. 处理动态注册的广播接收器

Android 14强制要求所有动态注册的广播接收器必须明确指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,静态注册的android:exported属性不覆盖此规则。如果OTP验证流程中存在动态注册的接收器(比如监听短信验证码的广播),需修改注册代码:

示例(Kotlin):

val smsReceiver = SmsReceiver()
val intentFilter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
// 根据需求选择:接收器需接收其他应用广播则用RECEIVER_EXPORTED,否则用RECEIVER_NOT_EXPORTED
context.registerReceiver(smsReceiver, intentFilter, Context.RECEIVER_EXPORTED)

2. 排查依赖库的隐性动态注册

若崩溃由依赖库内部动态注册接收器导致:

  • 升级flutter_local_notifications至最新稳定版(v15.x后续版本已适配Android 14广播要求)
  • 检查是否有第三方OTP相关插件未适配Android 14,替换为适配版本或手动接管广播注册逻辑

3. 确认静态注册接收器的完整性

即使已设置android:exported="true",仍需检查所有静态注册的接收器,确保无遗漏未指定该属性的情况:

<receiver
    android:name=".SmsReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

4. 验证修复效果

修改完成后,在Android 14设备上重新测试OTP验证流程,确认崩溃不再发生。


内容的提问来源于stack exchange,提问作者user1461451

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:53:28