如何解决 API 33 中弃用的 queryIntentActivities

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

我在使用 API33 的 Android Studio 中遇到了奇怪的行为。在下面的代码中,

Intent chooser = Intent.createChooser(sharingIntent, filename);
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(chooser, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY);

我得到

queryIntentActivities(Intent,int) in PackageManager has been deprecated

在文档中,它说:此方法在 API 级别 33 中已弃用。

Use queryIntentActivities(android.content.Intent, android.content.pm.PackageManager.ResolveInfoFlags) instead.

我尝试用

Intent
更改
android.content.Intent
,但遇到了同样的问题。
PackageManager.MATCH_DEFAULT_ONLY
是可能的标志值之一,所以我不明白这个错误试图告诉我什么......

android android-studio deprecated
5个回答
24
投票

您当前的通话是:

queryIntentActivities(chooser, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY)

这里,

chooser
Intent
MATCH_DEFAULT_ONLY
int

匹配已弃用的

queryIntentActivities()
版本

在 API 级别 33 及更高版本的设备上,Google 希望您使用

queryIntentActivities()
版本,该版本将
ResolveInfoFlags
作为第二个参数
,而不是
int
。您可以 使用
ResolveInfoFlags.of()
MATCH_DEFAULT_ONLY
包装到
ResolveInfoFlags
对象中。

该方法在 API 级别 32 及更早版本的设备上不可用,因此您的选择是:

  • 坚持使用

    int
    ,尽管已弃用,或者

  • 使用

    Build.VERSION.SDK_INT
    确定 API 级别,并根据设备的 API 级别调用所需版本的
    queryIntentActivities()


11
投票
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        context.packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())
        )
    } else {
        context.packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.GET_META_DATA
        )
    }

1
投票

我认为我们可以将 PackageManager.MATCH_DEFAULT_ONLY 转换为 long。 像这样的东西:

queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong()))

0
投票

这意味着您需要传递 InfoFlag 作为第二个参数而不是 int。 在这里您可以找到标志列表,从那里您可以检查每个标志的用途,以便您可以将其用于示例 所以解决方案看起来像这样

queryIntentActivities(chooser, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY)

0
投票

在包可见性有限的情况下实现常见用例

https://developer.android.com/training/package-visibility/use-cases

在清单中添加查询

<manifest>
.....
.....
<queries>
    <!-- Browser -->
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="http" />
    </intent>
    <!-- Camera -->
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
    <!-- Gallery -->
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.PICK" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.CHOOSER" />
     </intent>

     <!--For external application-->
     <package android:name="com.whatsapp" />
</queries>
.....
.....
</manifest>

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