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
相关产品推荐
相关产品推荐

