`toastRefeiver` is missing `RECEIVER_EXPORTED` or `RECEIVER_NOT_EXPORTED` flag for unprotected broad

该文章已生成可运行项目,

安卓开发注册广播报错

这是报错的代码段。

 registerReceiver(toastRefeiver, new IntentFilter(ACTION_SHOW_TOAST));

原因是 在 Android 13 及以上版本中,对于未受保护的广播,在注册广播接收器时需要显式地设置 RECEIVER_EXPORTEDRECEIVER_NOT_EXPORTED 标志,以增强安全性。

正确的因该是

registerReceiver(toastReceiver, new IntentFilter(ACTION_SHOW_TOAST), Context.RECEIVER_NOT_EXPORTED);

本文章已经生成可运行项目
Android 12(API 31)及以上版本中,**注册广播接收器**时必须明确指定其导出性(exported),以防止安全漏洞。如果你在运行时遇到如下警告或崩溃: ``` usbReceiver is missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag ``` 这是因为你使用了 `registerReceiver()` 但没有指定 `RECEIVER_EXPORTED``RECEIVER_NOT_EXPORTED` 标志。 --- ## ✅ 问题原因 从 Android 12 开始,系统要求你必须明确指定广播接收器是否允许接收来自其他应用的广播。如果不指定,系统会抛出警告或直接崩溃。 --- ## ✅ 解决方案 你需要在调用 `registerReceiver()` 时,添加一个标志来指定广播接收器是否导出。 因为我们只接收我们自己发送的广播(权限请求结果广播是系统发送的),所以应该使用: ```java Context.RECEIVER_NOT_EXPORTED ``` --- ## ✅ 修改代码 将你原来的注册广播接收器的代码: ```java registerReceiver(usbReceiver, filter); ``` 修改为: ```java registerReceiver(usbReceiver, filter, Context.RECEIVER_NOT_EXPORTED); ``` --- ## ✅ 完整修改后的代码片段(Java) ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvSerialName = findViewById(R.id.SerialName); btnOpenSerial = findViewById(R.id.OpenSerial); usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); // 注册广播接收器并指定标志 IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(usbReceiver, filter, Context.RECEIVER_NOT_EXPORTED); // 添加标志 String showSSerialName = getSerialName(); btnOpenSerial.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isOpenSerial) { tvSerialName.setText(showSSerialName); tvSerialName.setTextColor(getColor(android.R.color.black)); btnOpenSerial.setText("关闭串口"); isOpenSerial = true; } else { tvSerialName.setText("未连接"); tvSerialName.setTextColor(getColor(android.R.color.darker_gray)); btnOpenSerial.setText("打开串口"); isOpenSerial = false; } } }); } ``` --- ## ✅ 总结 | 标志 | 含义 | |------|------| | `RECEIVER_EXPORTED` | 允许接收来自其他应用的广播 | | `RECEIVER_NOT_EXPORTED` | 不允许接收来自其他应用的广播 | 在我们这个场景中,广播 `ACTION_USB_PERMISSION` 是系统发送的,**只在应用内部使用**,因此使用 `RECEIVER_NOT_EXPORTED` 是最安全的选择。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷途花锦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值