返回

解决Android API 34 中“必须指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED”错误

Android

API 34 中“必须指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED”错误

简介

在 Android 开发中,升级到 com.google.android.play:core:1.10.3 或更高版本时,你在 API 34 或更高版本中可能会遇到一个令人沮丧的错误:“One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts.”。不要担心,我们来深入研究一下这个问题并找出简单的解决方法。

问题根源

这个错误的根源在于广播接收器的导出状态。在 API 34 之前,广播接收器默认是导出的,这意味着它们对其他应用程序可见。然而,在 API 34 中,广播接收器默认不再导出,除非明确指定 RECEIVER_EXPORTED 标志。

解决方法

解决此错误的方法非常简单:在注册广播接收器时,你需要明确指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED 标志。这可以通过在 AndroidManifest.xml 文件中为接收器设置 android:exported 属性来完成。

要导出接收器,请使用以下属性:

<receiver android:name=".MyBroadcastReceiver" android:exported="true" ... />

要禁止导出,请使用以下属性:

<receiver android:name=".MyBroadcastReceiver" android:exported="false" ... />

确保将 android:exported 属性添加到所有需要显式导出的广播接收器中。

其他注意事项

  • RECEIVER_EXPORTED 标志允许接收器对其他应用程序可见,而 RECEIVER_NOT_EXPORTED 标志则不允许。
  • 对于仅用于系统广播的接收器,不需要指定导出,以避免潜在的安全问题。
  • 如果无法更改第三方库的版本,可以考虑将应用定位到 API 33 或更低版本。

结论

通过在 AndroidManifest.xml 文件中显式指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED 标志,你可以轻松解决 API 34 中的“必须指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED”错误。记住,导出的广播接收器对其他应用程序可见,而禁止导出的接收器则不可见。

常见问题解答

1. 什么是 RECEIVER_EXPORTED 和 RECEIVER_NOT_EXPORTED 标志?

RECEIVER_EXPORTED 标志允许广播接收器对其他应用程序可见,而 RECEIVER_NOT_EXPORTED 标志则禁止接收器导出。

2. 为什么在 API 34 中广播接收器默认不再导出?

为了提高安全性和隐私性,API 34 中广播接收器默认不再导出。

3. 什么时候需要指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED 标志?

当广播接收器不专门用于系统广播时,需要指定这些标志。

4. 如何在 AndroidManifest.xml 中指定这些标志?

使用 android:exported 属性,如下所示:

<receiver android:name=".MyBroadcastReceiver" android:exported="true" ... />

5. 如果无法更改第三方库的版本怎么办?

可以考虑将应用定位到 API 33 或更低版本。