问题原因:
当targetSdkVersion>=31时,需要在AndroidManifest.xml中配置android:exported的值,该值为boolean类型。
android:exported解释:
activity 是否可由其他应用的组件启动:
- 如果设为
"true"
,那么 activity 可由任何应用访问,并且可通过其确切类名称启动。 - 如果设为
"false"
,则 activity 只能由同一应用的组件、使用同一用户 ID 的不同应用或具有特权的系统组件启动。没有 intent 过滤器时,这是默认值。
如果应用中的 activity 包含 intent 过滤器,请将此元素设置为 "true"
,以允许其他应用启动该 activity。例如,假设 activity 是应用的主要 activity,并且包含 category
android.intent.category.LAUNCHER
。
如果此元素设为 "false"
,并且应用尝试启动该 activity,系统会抛出 ActivityNotFoundException
。
此属性并非是限制 activity 向其他应用公开的唯一方式。权限还可用于限制可调用 activity 的外部实体。请参考 permission
属性。
解决方案:
总结来说就是,AndroidManifest.xml中四大组件中包含了 <intent-filter>的,全部需要加上android:exported,true或者false就根据自己的业务来定。
异常情况:
这时候就有同学该问了,为什么我明明都加上了,但是还是报这个错呢,我淋过的雨,那必须给你们撑一把伞。
几种情况
1、检查自己依赖的 Module中的AndroidManifest.xml是否都加了android:exported
2、如果第一种情况都加上了并且还是报错
那么问题就出现在我们依赖的那些库没有加android:exported
那么我们怎么知道是哪个库没有加,如何给他加上呢?跟着我的步骤一步步来
一、我们将targetSdkVersion恢复到31以下,然后重新编译一下项目
二、找到路径为app\build\intermediates\merged_manifests\debug\AndroidManifest.xml
如图所示,将该xml文件打开,直接Ctrl+F搜索<intent-filter>
三、找一找是哪个没有android:exported然后复制出来,粘贴到你自己项目的AndroidManifest.xml中,添加上android:exported后,重新将targetSdkVersion恢复到31以上编译运行。至此完美落幕,下课!