当接收器没有专门为系统广播注册时,应指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED 之一

Phư*_*hạm 43 android

在tuya的lib com.thingclips.smart中有1个错误,当接收器没有专门为系统广播注册时,应指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED之一,但我无法修复它。这是版本 5.1.0 。我在 Android 14 运行时遇到了这个问题。你能帮我吗?

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

Len*_*nin 54

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

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

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

context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_EXPORTED);
Run Code Online (Sandbox Code Playgroud)

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

context.registerReceiver(broadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED);
Run Code Online (Sandbox Code Playgroud)

注意:该调用需要 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 %20安全%20异常

  • 让我对您的答案添加一点补充:为了避免 API 26 限制,您可以使用 ContextCompat.registerReceiver(context, br, filter, receiveFlags)。更多详细信息请参见:https://developer.android.com/guide/components/broadcasts#context-registered-receivers (15认同)
  • 如何在 React Native Android 项目中解决这个问题 (2认同)

小智 17

还可以添加SDK版本检查

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
     registerReceiver(broadcastReceiver, intentFilter, RECEIVER_EXPORTED)
}else {
     registerReceiver(broadcastReceiver, intentFilter)
}
Run Code Online (Sandbox Code Playgroud)


jav*_*ian 14

您可以使用 ContextCompat 注册广播接收器,而无需为 Android 版本分支:

ContextCompat.registerReceiver(context, broadcastReceiver, intentFilter, ContextCompat.RECEIVER_EXPORTED)
Run Code Online (Sandbox Code Playgroud)

或者

ContextCompat.registerReceiver(context, broadcastReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED)
Run Code Online (Sandbox Code Playgroud)


Joh*_*n T 7

我在使用 Android Billing 时遇到此错误。通过更改此问题解决了:

implementation 'com.android.billingclient:billing:6.0.0'
Run Code Online (Sandbox Code Playgroud)

...对此:

implementation 'com.android.billingclient:billing:6.1.0'
Run Code Online (Sandbox Code Playgroud)