解决Android API 34 中“必须指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED”错误
2024-03-10 19:05:34
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 或更低版本。