我在使用 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
是可能的标志值之一,所以我不明白这个错误试图告诉我什么......
您当前的通话是:
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()
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
)
}
我认为我们可以将 PackageManager.MATCH_DEFAULT_ONLY 转换为 long。 像这样的东西:
queryIntentActivities(intent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong()))
这意味着您需要传递 InfoFlag 作为第二个参数而不是 int。 在这里您可以找到标志列表,从那里您可以检查每个标志的用途,以便您可以将其用于示例 所以解决方案看起来像这样
queryIntentActivities(chooser, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY)
在包可见性有限的情况下实现常见用例
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>