Android API 34 Security Exception求助:需指定RECEIVER_EXPORTED/NOT_EXPORTED
问题解决:Android API34下广播接收器崩溃
问题根源
你遇到的崩溃是Android 14(API34)新增的广播接收器安全限制导致的:动态注册非系统专属的广播接收器时,必须明确指定该接收器是否允许接收其他应用的广播(即设置RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标志),而你当前的代码没有添加这个参数,所以触发了SecurityException。你之前修改Activity的android:exported属性是无效的,因为问题出在动态广播注册,和Activity的导出设置无关。
解决方案
修改LoginActivity中onResume方法里的广播注册代码,添加对应的标志:
情况1:该广播仅接收当前应用内部发送的消息(推荐,更安全)
@Override protected void onResume() { super.onResume(); // 添加RECEIVER_NOT_EXPORTED标志,禁止接收其他应用的广播 LoginActivity.this.registerReceiver(mReceiver, new IntentFilter("com.result.notification"), Context.RECEIVER_NOT_EXPORTED); }
情况2:需要接收其他应用发送的该广播
@Override protected void onResume() { super.onResume(); // 添加RECEIVER_EXPORTED标志,允许接收其他应用的广播 LoginActivity.this.registerReceiver(mReceiver, new IntentFilter("com.result.notification"), Context.RECEIVER_EXPORTED); }
补充说明
- 这个限制仅在API34及以上生效,所以你的应用在API33环境下能正常运行。
- 优先选择
RECEIVER_NOT_EXPORTED,除非你确实需要接收其他应用的广播,这样能提升应用的安全性。
内容的提问来源于stack exchange,提问作者mahen3d
相关产品推荐
相关产品推荐

