如何解决 API 33 中已弃用的 queryIntentActivities

Lui*_*rit 21 android deprecated android-studio

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

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

我正进入(状态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是可能的标志值之一,所以我不明白这个错误试图告诉我什么......

Com*_*are 30

您当前的通话是:

queryIntentActivities(chooser, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY)
Run Code Online (Sandbox Code Playgroud)

这里,chooser是一个Intent,并且MATCH_DEFAULT_ONLY是一个int

这与已弃用的queryIntentActivities()版本相匹配。

在 API 级别 33 及更高版本的设备上,Google 希望您使用将 a作为第二个参数的版本queryIntentActivities()ResolveInfoFlags,而不是int。您可以使用ResolveInfoFlags.of()包装MATCH_DEFAULT_ONLY到一个ResolveInfoFlags对象中。

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

  • 坚持使用那个int,尽管不赞成,或者

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


小智 15

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
        )
    }
Run Code Online (Sandbox Code Playgroud)