Flutter项目点击登录API按钮后模拟器崩溃,触发SecurityException
问题描述
调用登录API获取OTP时,点击登录按钮后应用直接闪退,预期流程为:跳转到OTP页面,提交验证码后进入首页。
错误日志
onCancelled at PHASE_CLIENT_ANIMATION_CANCEL W/WindowOnBackDispatcher( 4588): sendCancelIfRunning: isInProgress=falsecallback=ImeCallback=ImeOnBackInvokedCallback@205512508 Callback=android.window.IOnBackInvokedCallback$Stub$Proxy@165a0d4 D/AndroidRuntime( 4588): Shutting down VM E/AndroidRuntime( 4588): FATAL EXCEPTION: main E/AndroidRuntime( 4588): Process: com.slaylewks, PID: 4588 E/AndroidRuntime( 4588): java.lang.SecurityException: com.slaylewks: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
解决方法
原因
该错误是Android 12(API 31)及以上版本的强制安全规则导致:注册广播接收器时,若不是仅接收系统广播,必须显式声明RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,否则触发SecurityException。
修复步骤
- 静态注册(AndroidManifest.xml)
在清单文件中给广播接收器添加android:exported属性,根据业务需求设为true或false:
<receiver android:name=".YourReceiver" android:exported="true"> <!-- 仅接收自身应用广播时设为false --> <intent-filter> <!-- 自定义意图过滤器配置 --> </intent-filter> </receiver>
- 动态注册(代码中)
代码里注册广播接收器时,传入对应标记参数:
// Kotlin示例 val receiver = YourReceiver() val intentFilter = IntentFilter("your.custom.action") registerReceiver(receiver, intentFilter, Context.RECEIVER_EXPORTED) // 或RECEIVER_NOT_EXPORTED
// Java示例 YourReceiver receiver = new YourReceiver(); IntentFilter intentFilter = new IntentFilter("your.custom.action"); registerReceiver(receiver, intentFilter, Context.RECEIVER_EXPORTED); // 或RECEIVER_NOT_EXPORTED
注意事项
- 需要接收外部应用广播时用
RECEIVER_EXPORTED,仅内部使用时用RECEIVER_NOT_EXPORTED,后者安全性更高。 - 若项目编译SDK低于31,建议升级至API 31及以上版本,适配该安全规则。
内容的提问来源于stack exchange,提问作者Balamurugesan A
相关产品推荐
相关产品推荐

