One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

回答 2 浏览 6104 2023-10-05

在tuya的lib com.thingclips.smart中有1个错误,One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts,但我无法修复它。这是版本 5.1.0 。 我在 Android 14 运行时遇到了这个问题。你能帮我吗?

+我找到了最新版本5.1.0,但它没有解决问题。 + Tuya库在 Android 14 上也没有提及这一点。

Phương Nam Phạm 提问于2023-10-05
2 个回答
#1楼 已采纳
得票数 16

正如 Google I/O 2023 上所讨论的,使用 RECEIVER_EXPORTED / RECEIVER_NOT_EXPORTED 标志有意注册接收器是作为 Android 13 的一部分引入的,现在是在 Android 14 或更高版本 (U+) 上运行的应用的要求。

如果不实现这一点,系统将抛出安全异常。

要允许广播接收器接收来自其他应用程序的广播,请使用以下代码注册接收器:

context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_EXPORTED);

要注册不接收来自其他应用程序(包括系统应用程序)的广播的广播接收器,请使用以下代码注册接收器:

context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED);

注意:该调用需要 minSdkVersion 至少为 26 (Android 8)

检查 https://www.delasign.com/blog/android-studio-kotlin-broadcast-recievers-export-or-not/#:~:text=As%20discussed%20at%20Google%20I,will%20throw%20a%20security%20exception.

Lenin 提问于2023-10-11
让我对您的答案添加一点补充:为了避免 API 26 限制,您可以使用 ContextCompat.registerReceiver(context, br, filter, receiveFlags)。更多详细信息请参见: developer.android.com/guide/components/…DmitryKanunnikoff 2023-10-24
我正在使用 LocalBroadcastManager.getInstance(getContext()).registerReceiver(eventsReceiver,filter);并且它没有要传递的标志。包 androidx.localbroadcastmanager.content;sejn 2023-10-26
#2楼
得票数 0

还可以添加SDK版本检查

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
     registerReceiver(broadcastReceiver, intentFilter, RECEIVER_EXPORTED)
}else {
     registerReceiver(broadcastReceiver, intentFilter)
}
Mohd. Jafar Iqbal khan 提问于2023-11-22
标签