Android V 广播注册和配置注意事项问题

news2024/9/20 1:35:57

现象

在Android V平台上,应用注册非Protected广播时,如果没有加导出flag会抛出异常导致进程crash。

E/AndroidRuntime: FATAL EXCEPTION: main

        java.lang.SecurityException: com.demo.myapplication: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

                at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)

官方的protected-broadcast参考

AndroidManifest.xml - OpenGrok cross reference for /frameworks/base/core/res/AndroidManifest.xml (aospxref.com)

平台规则

在Android 13 或更高版本为目标平台的应用内,在调用registerReceiver()时必须指定导出行为(exported true or false),如果未指定导出行为,可能会导致应用崩溃。

android:exported="true"

参考:广播概览  |  Background work  |  Android Developers

代码实现

接收广播

应用可以通过两种方式接收广播:通过清单声明的接收器 和上下文注册的接收器

1、【静态】声明广播接收器法

1、指定 <receiver> 元素。

<!-- If this receiver listens for broadcasts sent from the system or from
     other apps, even other apps that you own, set android:exported to "true". -->
<receiver android:name=".MyBroadcastReceiver" android:exported="false">
    <intent-filter>
        <action android:name="APP_SPECIFIC_BROADCAST" />
    </intent-filter>
</receiver>

intent 过滤器指定您的接收器所订阅的广播操作。 

2、创建 BroadcastReceiver 子类并实现 onReceive(Context, Intent)。通过 以下示例中的广播接收器会记录日志并显示内容 以下内容:

public class MyBroadcastReceiver extends BroadcastReceiver {
        private static final String TAG = "MyBroadcastReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            StringBuilder sb = new StringBuilder();
            sb.append("Action: " + intent.getAction() + "\n");
            sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
            String log = sb.toString();
            Log.d(TAG, log);

            ActivityNameBinding binding =
                    ActivityNameBinding.inflate(layoutInflater);
            val view = binding.root;
            setContentView(view);

            Snackbar.make(view, log, Snackbar.LENGTH_LONG).show();
        }
    }

系统软件包管理器会在应用安装时注册接收器。 然后,接收器将成为应用的单独入口点,这意味着 确保系统可以启动应用并传递广播(如果应用未 。

系统会创建一个新的 BroadcastReceiver 组件 对象来处理它接收的每个广播。仅此对象有效 在调用 onReceive(Context, Intent) 期间有效。将代码添加到 返回时,系统会将该组件 活动状态。

2、【动态】上下文注册的接收器(常用)

上下文注册的接收器可以接收广播,前提是它们的注册 上下文有效。例如,如果您在一个 Activity 上下文,只要 activity 不被销毁,您就会收到广播。如果您 注册到应用上下文,那么,只要应用 正在运行。

先创建 BroadcastReceiver和IntentFilter,再通过调用registerReceiver()方法来注册接收器。
 

RECEIVER_EXPORTED 导出flag定义

源码:

Context.java - OpenGrok cross reference for /frameworks/base/core/java/android/content/Context.java (aospxref.com)

    /**
     * <p>For apps targeting {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE},
     * either {@link #RECEIVER_EXPORTED} or {@link #RECEIVER_NOT_EXPORTED} must be
     * specified if the receiver is not being registered for <a
     * href="{@docRoot}guide/components/broadcasts#system-broadcasts">system broadcasts</a>
     * or a {@link SecurityException} will be thrown. See {@link
     * #registerReceiver(BroadcastReceiver, IntentFilter, int)} to register a receiver with
     * flags.
     */


    /**
     * Flag for {@link #registerReceiver}: The receiver can receive broadcasts from other Apps.
     * Has the same behavior as marking a statically registered receiver with "exported=true"
     */
    public static final int RECEIVER_EXPORTED = 0x2;
    /**
     * @deprecated Use {@link #RECEIVER_NOT_EXPORTED} or {@link #RECEIVER_EXPORTED} instead.
     * @hide
     */
    @Deprecated
    @TestApi
    public static final int RECEIVER_EXPORTED_UNAUDITED = RECEIVER_EXPORTED;

    /**
     * Flag for {@link #registerReceiver}: The receiver cannot receive broadcasts from other Apps.
     * Has the same behavior as marking a statically registered receiver with "exported=false"
     */
    public static final int RECEIVER_NOT_EXPORTED = 0x4;

整改方案※

运行时注册的广播接收器必须指定导出行为。

1、查看服务或应用内是否注册动态广播,且该广播属于非Procted系统广播

protected-broadcast

2、按照监听情况,在调用registerReceiver时添加标志位参数RECEIVER_EXPORTED 或RECEIVER_NOT_EXPORTED

//RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED

BroadcastReceiver br = new MyBroadcastReceiver();

//系统广播
//写法1
//IntentFilter filter = new IntentFilter();
//filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);

//写法2
//IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
//registerReceiver(mSimStateReceiver, intentFilter);

//写法3:自定义
IntentFilter filter = new IntentFilter("com.demo.myintentfilter");
boolean isListenBroadcaseFromOtherAps = false;

int receiverFlags;
if (isListenBroadcaseFromOtherAps) {
    receiverFlags = RECEIVER_EXPORTED;
} else {
    receiverFlags = RECEIVER_NOT_EXPORTED;
}

ContextCompat.registerReceiver(context, br, filter, receiverFlags)

源码kotlin参考:

 源码Java参考:

ScreenshotHelper.java - OpenGrok cross reference for /frameworks/base/core/java/com/android/internal/util/ScreenshotHelper.java (aospxref.com)

    public ScreenshotHelper(Context context) {
        mContext = context;
        IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED);
        mContext.registerReceiver(mBroadcastReceiver, filter, Context.RECEIVER_EXPORTED);
    }

如上参考:Android 14 之 动态注册Broadcast必须声明exported属性以 Android 14 为目标并动态 - 掘金 (juejin.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运维监控】Prometheus+grafana监控zookeeper运行情况

本示例通过zookeeper自带的监控信息暴露出来&#xff0c;然后将数据收集到prometheus中&#xff0c;最后通过grafana的dashboard导入模板进行可视化。本示例分为三个部分&#xff0c;即prometheus、grafana部署和最后的集成。说明&#xff1a;本示例中的部署环境没有要求&#…

BC173 牛牛逆序输出(c 语言)

1.// 描述 //牛牛在尝试把一个整数逆序地输出。 //输入描述&#xff1a; //输入一个正整数 n。保证个位数不是 0 //输出描述&#xff1a; //逆序输出这个正整数。 //2345 //5432 2.我们先输入n,然后我们进行取余&#xff0c;然后将余数存储起来在arr中&#xff0c;然后除10。…

用 Python 和 Tkinter 做游戏?5分钟打造Python贪吃蛇游戏

大家好&#xff01;贪吃蛇游戏是一款经典的休闲游戏&#xff0c;相信大家都不陌生。 今天&#xff0c;我们将用 Python 的 Tkinter 库快速创建一个贪吃蛇游戏。你不需要成为一个编程专家&#xff0c;只需跟着本文的步骤走&#xff0c;你就可以亲手制作属于自己的贪吃蛇游戏&am…

TikTok Shop9.9大促爆单忙不过来?EasyBoss ERP给你全方位的助力!

又是一年9.9大促&#xff0c;想必大多数Shopee/TikTok本土卖家的店铺订单量都远超日常了吧&#xff1f; 图源&#xff1a;网络 爆单是件大好事&#xff0c;但背后却是店铺运营的一场硬仗。因为出单后&#xff0c;多店铺的订单处理、仓库发货、售后、数据分析等环节都有大量的工…

QEMU虚拟机

vmware中创建虚拟机 创建虚拟磁盘 qemu-img create -f qcow2 sda.qcow2 100G qemu-img create -f qcow2 sdb.qcow2 100G创建桥接口 brctl addbr br0 brctl addif br0 ens36 brctl stp br0 on ifconfig ens36 0 dhclient br0brctl addbr br1 brctl addif br1 ens37 brctl stp …

信息安全工程师(3)TCP/IP协议簇

前言 TCP/IP协议簇是Internet的基础&#xff0c;也是当今最流行的组网形式。它不仅仅指的是TCP和IP两个协议&#xff0c;而是由一系列协议组成的协议簇&#xff0c;这些协议共同支持着互联网上的数据传输和通信。以下是对TCP/IP协议簇的详细概述&#xff1a; 一、组成 TCP/IP协…

什么是期权对冲?

今天期权懂带你了解什么是期权对冲&#xff1f;期权对冲的选择取决于投资者的市场预期和风险承受能力&#xff0c;通过合理使用期权对冲策略&#xff0c;可以有效减少风险并优化投资组合的表现。 期权对冲是什么&#xff1f; 期权是一种支持双向交易的投资产品&#xff0c;期…

【Go】Go语言中的基本数据类型与类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

报告 | 中国信通院《大模型落地路线图研究报告(2024年)》(附下载)

前言 近年来&#xff0c;以大模型为代表的新一代人工智能技术加速迭代&#xff0c;向着更为智能化、通用化、普惠化的方向迈进&#xff0c;成为新一轮科技和产业变革的重要驱动力。然而&#xff0c;当前大模型发展仍存在工程实践复杂、技术选型困难、能力评估不全面等问题&…

基于 TDMQ for Apache Pulsar 的跨地域复制实践

导语 自2024年9月6日起&#xff0c;TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能&#xff0c;消息级复制解决用户全球地域的数据统一归档问题&#xff0c;元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…

FCP-D 报表交付认证考试题

学习目标 帆软 基础知识&#xff1a;通过系统学习&#xff0c;了解帆软BI的基本概念、架构和功能。深入理解报表设计、数据集成和分析等关键模块&#xff0c;为将来的实际应用奠定坚实基础。 报表设计与定制学习如何设计各类报表&#xff0c;包括但不限于表格、图表、仪表盘等。…

springboot luttuc redis 集成protobuf,手动序列化反序列化

前置需知&#xff1a; 1.本文章和网上大部分博客配置不太一样&#xff0c;各位看官要分析一下自己的需求。集成protobuf 本文章主要是手动调用protobuf的序列化方法&#xff0c;而不是交由springboot 去做&#xff0c;会偏向原生java 使用方式 2.由于为了和公司其他的项目达成…

QQueue调用dequeue闪退解决方法

QQueue调用dequeque闪退的解决方法 先看一下Qt帮助文档里面的说明 这个函数假设队列不是空的。 那么我们在调用之前&#xff0c;需要先判断队列是不是空的&#xff0c;如果不是空的&#xff0c;就调用该函数。 if (!queue.isEmpty()) {QString info queue.dequeue(); }这样…

【RabbitMQ 项目】Muduo 库快速上手

Muduo 库快速上手 一.Muduo 库简介二.五个常用类介绍三.结合 Protobuf 定制的应用层协议 一.Muduo 库简介 一句话概括&#xff0c;Muduo 库是基于非阻塞 IO 和事件驱动的 C 高并发 TCP 网络编程库。使用主从 Reactor 模型&#xff0c;使用的线程模型是是 one thread one loop R…

JWT令牌——详解

目录 一、JWT是什么&#xff1f; 二、JWT的组成 三、JWT应用场景 四、生成和校验JWT令牌 五、具体应用 一、JWT是什么&#xff1f; 在当今的Web开发中&#xff0c;安全认证和授权变得尤为重要。JWT&#xff08;JSON Web Tokens&#xff09;是一种开放标准&#xff08;RFC …

大厂中秋福利哪家强?字节发被子,京东联名三星堆!网友:最强的还是我们......

又是一年中秋佳节&#xff0c;大家公司发的中秋福利都拿到手了嘛&#xff1f; 从上周开始&#xff0c;各社交网络平台上就有人陆续晒出了公司发放的中秋礼盒。 其中&#xff0c;财大气粗的互联网大厂的礼盒尤为精致亮眼。 今天&#xff0c;小码就带大家一起来看看大厂那些让人…

在线机房迁移之“玩转TiDB迁移”

作者&#xff1a; 代晓磊_Mars 原文来源&#xff1a; https://tidb.net/blog/02df4029 要想搞定在线机房迁移之TiDB数据库迁移&#xff0c;看完本文基本上所有的迁移方案你都可以搞定了&#xff08;数据库迁移方案和流程大同小异&#xff09;。本文给了3种TiDB在线迁移的场景…

四款音频剪辑软件免费使用,你更pick哪一个?

视频剪辑知随着软件的不断更新&#xff0c;入门门槛和操作难度也随之变得越来越低&#xff0c;但是依然有不少人不知道剪辑视频要用什么工具&#xff0c;作为一个视频剪辑爱好者&#xff0c;我尝试过不少编辑软件&#xff0c;今天就来跟大家分享一下四款视频剪辑软件在实际使用…

我与Linux的爱恋:yum和vim以及gcc、gdb、git的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 ​1.Linux软件包管理器yum2.Linux开发工具3.Linux编译器 vimvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集vim操作总结批量化注释批量化去注释简…

Oracle反向键索引Reverse Key Index

Oracle反向键索引&#xff08;Reverse Key Index&#xff09;是一种特殊的B-Tree索引&#xff0c;它在创建索引时对索引列的键值进行字节反转。这种索引的主要设计目的是为了解决在多实例环境&#xff08;如Oracle RAC&#xff09;中由于索引键值顺序插入导致的索引块争用问题。…