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

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。

修复步骤

  1. 静态注册(AndroidManifest.xml)
    在清单文件中给广播接收器添加android:exported属性,根据业务需求设为true或false:
<receiver
    android:name=".YourReceiver"
    android:exported="true"> <!-- 仅接收自身应用广播时设为false -->
    <intent-filter>
        <!-- 自定义意图过滤器配置 -->
    </intent-filter>
</receiver>
  1. 动态注册(代码中)
    代码里注册广播接收器时,传入对应标记参数:
// 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:57:06