我有一个仅在 API 33 上发生的错误。有什么变化吗?我的意思是,事情确实发生了变化,但我做了所有必要的更新。我错过了吗?
我有两个应用程序:A 和 B。我们称它们为
com.example.a
和 com.example.b
。他们需要互相发动。从 API 33 开始,当应用程序 A 尝试启动应用程序 B 时,我得到:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.b/com.example.b.DefaultLaunchActivity}; have you declared this activity in your AndroidManifest.xml, or does your intent not match its declared <intent-filter>?
DefaultLaunchActivity
在应用程序 B 的清单中定义如下:
<activity
android:name="com.example.b.DefaultLaunchActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我还在应用程序 A 的清单中添加了以下内容(从 API 31 开始需要):
<queries>
<package android:name="com.example.b" />
</queries>
最后,应用程序 A 获取应用程序 B 的启动 Intent,如下所示:
val intent = application.packageManager.getLaunchIntentForPackage("com.example.b")?.apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
添加
Intent.FLAG_ACTIVITY_REQUIRE_NON_BROWSER
没有帮助。当应用程序 B 尝试启动应用程序 A 时,会出现相同的错误。
需要明确的是,上面的代码适用于 API 32,但不适用于 API 33。发生了什么变化?
是的,很多事情都改变了。
您必须在
manifest
文件包中明确定义您要调用的应用程序,例如:
<queries>
<package android:name="com.google.android.apps.translate"/>
</queries>
它是在 Android 11 (API 30) 中引入的。观察到的行为可能会被解释为 API 30 中引入的行为,但自 API 33 起强制执行。也可能有其他原因。需要更多的研究来找出根本原因。
参考。 Android 文档:行为更改:针对 Android 11 的应用
更新 我注意到您已经使用了
queries
属性,因此问题原因出在其他地方