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

Android 13迁移RxBroadcast至Android 14及安全异常解决方法

RxBroadcast 迁移至 Android 14 及安全异常解决方法

Android 14 强化了广播接收器的安全管控,动态注册非系统专属的广播接收器时,必须明确指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,否则会触发安全异常。针对你提供的代码,可按以下方式处理:

解决方案

1. 使用新版 RxBroadcast 库的重载方法

确保你的 RxBroadcast 库已更新至支持 Android 14 的版本,新版本会提供带导出标记参数的fromBroadcast重载方法。修改代码如下:

IntentFilter intentFilter = new IntentFilter();
// 根据业务需求选择标记:
// RECEIVER_EXPORTED:允许其他应用触发该广播接收器
// RECEIVER_NOT_EXPORTED:仅允许自身应用触发,安全性更高,优先推荐
int exportFlag = Context.RECEIVER_NOT_EXPORTED;
subscriptions.add(RxBroadcast.fromBroadcast(getContext(), intentFilter, exportFlag)
    // 后续订阅逻辑
    .subscribe(intent -> {
        // 处理接收到的广播
    })
);

2. 旧版本库的兼容处理

若无法升级 RxBroadcast 库,可自行结合 RxJava 封装广播接收器,手动指定导出标记:

IntentFilter intentFilter = new IntentFilter();

// 构建可观察的广播流
Observable<Intent> broadcastObservable = Observable.create(emitter -> {
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            emitter.onNext(intent);
        }
    };
    // 注册时指定导出标记
    getContext().registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED);
    // 订阅取消时解绑接收器
    emitter.setCancellable(() -> getContext().unregisterReceiver(receiver));
});

// 订阅广播流
subscriptions.add(broadcastObservable.subscribe(intent -> {
    // 处理接收到的广播
}));

标记选择说明

  • RECEIVER_EXPORTED:适用于需要接收其他应用发送的广播场景,需确保广播内容不涉及敏感信息。
  • RECEIVER_NOT_EXPORTED:适用于仅内部应用接收广播的场景,能有效降低安全风险,是无跨应用需求时的首选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:12:41