问题描述: 带有ACTION_VIEW的Android API 30 getPackageManager.resolveActivity()返回null。
回答: 在Android API 30及以上版本中,如果使用getPackageManager.resolveActivity()方法来获取处理ACTION_VIEW意图的Activity时,可能会返回null。这是由于Android 11(API级别30)引入了一些限制,以增强用户隐私和安全性。
在Android 11中,应用必须在清单文件中声明其需要处理的每个URI模式,而不是依赖于隐式意图。这意味着在使用ACTION_VIEW时,必须在清单文件中明确指定应用能够处理的URI模式。
解决此问题的方法是,在应用的清单文件中,为需要处理的URI模式添加<queries>元素。例如,如果你的应用需要处理http和https协议的URI,可以添加以下代码片段到清单文件的<Application>标签内:
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="http" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
</queries>
这样做将明确告知系统,你的应用可以处理指定的URI模式,使得getPackageManager.resolveActivity()方法能够正确返回可处理该URI的Activity。
此外,为了进一步提高应用的兼容性和适应性,建议使用AndroidX库中的新API来代替旧的getPackageManager.resolveActivity()方法。新的API是PackageManager.queryIntentActivities(),它返回一个列表,其中包含了所有能够处理指定意图的Activity信息。
以下是一个示例代码,展示了如何使用PackageManager.queryIntentActivities()方法来获取能够处理ACTION_VIEW意图的Activity:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.example.com"));
List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0);
if (!activities.isEmpty()) {
// 找到了能够处理该意图的Activity
ResolveInfo resolvedActivity = activities.get(0);
// 处理resolvedActivity
} else {
// 没有找到能够处理该意图的Activity
}
在上述代码中,我们首先创建了一个ACTION_VIEW意图,并设置了要访问的URL。然后,使用PackageManager.queryIntentActivities()方法来获取能够处理该意图的Activity列表。如果列表不为空,我们可以从中取出第一个ResolveInfo对象,以进一步处理该Activity。
综上所述,通过在应用的清单文件中声明<queries>元素,并使用PackageManager.queryIntentActivities()方法,可以解决Android API 30上使用getPackageManager.resolveActivity()方法返回null的问题。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云