API 33 中启动另一个应用程序的权限是否发生了变化?

问题描述 投票:0回答:1

我有一个仅在 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。发生了什么变化?

android android-intent android-activity android-api-33
1个回答
0
投票

是的,很多事情都改变了。

您必须在

manifest
文件包中明确定义您要调用的应用程序,例如:

    <queries>
        <package android:name="com.google.android.apps.translate"/>
    </queries>

它是在 Android 11 (API 30) 中引入的。观察到的行为可能可以解释它是在 API 30 中引入的,但自 API 33 起强制执行。需要更多的研究来找出根本原因。

参考。 Android 文档:查询 参考。 Android 文档:行为更改:针对 Android 11 的应用

© www.soinside.com 2019 - 2024. All rights reserved.