在 Android 上获取首选/默认应用
Posted
技术标签:
【中文标题】在 Android 上获取首选/默认应用【英文标题】:Get Preferred/Default app on Android 【发布时间】:2012-01-27 10:12:35 【问题描述】:我正在尝试获取给定Intent
的默认/首选应用程序。例如,当用户安装第二个 Web 浏览器,然后尝试打开一个 URL 时,他或她将看到如下对话框:
如果用户随后选择了默认情况下用于此操作选项,则在按下 URL 时对话框将不再打开。
我正在开发一个应该知道这个默认或首选应用程序/操作的应用程序。我该怎么做呢?我目前正在使用下面的代码,但 getPreferredPackage
没有返回任何内容:
Intent i = (new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com"));
PackageManager pm = context.getPackageManager();
final List<ResolveInfo> list = pm.queryIntentActivities(i, 0);
IntentFilter ifilter = new IntentFilter(i.getAction());
if (i.getCategories() != null)
for(String category : i.getCategories())
ifilter.addCategory(category);
List<IntentFilter> filters = new ArrayList<IntentFilter>();
filters.add(ifilter);
List<ComponentName> preferredActivities = new ArrayList<ComponentName>();
pm.getPreferredActivities(filters, preferredActivities, null);
for (ComponentName activity : preferredActivities)
for (ResolveInfo rinfo : list)
if (rinfo.activityInfo.applicationInfo.packageName.equals(activity.getPackageName()))
try
final PackageInfo pi = pm.getPackageInfo(activity.getPackageName(), 0);
Toast.makeText(context, pm.getApplicationLabel(pi.applicationInfo), Toast.LENGTH_SHORT).show();
catch (NameNotFoundException e)
e.printStackTrace();
我做错了什么?这甚至是正确的方法吗?
【问题讨论】:
我可能已经找到了解决方案。我正在将resolveinfo与packageinfo进行比较...我会先尝试一下,如果可行,则删除此问题。 我没有找到答案,但我确实更改了上面的代码以反映我的发现(但经过测试,它仍然不起作用)。 【参考方案1】:好吧,结果证明解决方案比我做的要简单得多(尽管文档记录很差)。以下代码是我的解决方案:
Intent i = (new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com"));
PackageManager pm = context.getPackageManager();
final ResolveInfo mInfo = pm.resolveActivity(i, 0);
Toast.makeText(context, pm.getApplicationLabel(mInfo.activityInfo.applicationInfo), Toast.LENGTH_LONG).show();
【讨论】:
如果给定的意图没有默认应用怎么办?你怎么知道的? Google 文档说 resolveActivity():如果找到多个匹配的活动并且没有默认设置,则返回包含 其他内容的 ResolveInfo,例如活动解析器。 如果这个 Intent 没有默认活动,我得到的是这样的。 ResolveInfo40df0c50 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0【参考方案2】:下面的方法launchUrlInDefaultBrowser
会启动一个URL,而不向用户显示任何选择查询。首先,它会尝试找到用户的默认浏览器应用程序并使用它启动 URL。其次,如果没有默认应用程序,它会列出所有能够启动 URL 的活动并选择第一个。如果启动了活动,则该方法返回 true;否则为假。
boolean launchUrlInDefaultBrowser(Context context, String url)
final Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
browserIntent.setData(Uri.parse(url));
// 1: Try to find the default browser and launch the URL with it
final ResolveInfo defaultResolution = context.getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (defaultResolution != null)
final ActivityInfo activity = defaultResolution.activityInfo;
if (!activity.name.equals("com.android.internal.app.ResolverActivity"))
browserIntent.setClassName(activity.applicationInfo.packageName, activity.name);
context.startActivity(launchIntent);
return true;
// 2: Try to find anything that we can launch the URL with. Pick up the first one that can.
final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (!resolveInfoList.isEmpty())
browserIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name);
context.startActivity(browserIntent);
return true;
return false;
请注意,OEM 可能有自己的 ResolverActivity 实现。例如。华为有com.huawei.android.internal.app.HwResolverActivity。
【讨论】:
【参考方案3】:在 Kitkat AOSP 中,getPreferredPackages() 总是返回空列表。源码如下
public List<PackageInfo> getPreferredPackages(int flags)
return new ArrayList<PackageInfo>();
【讨论】:
你的参考资料在哪里? 如果您发布一个链接供您参考,那就太好了。 从source.android.com/source/downloading.html下载源代码。检查包管理器以上是关于在 Android 上获取首选/默认应用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 应用程序中启用 TLS 1.2 支持(在 Android 4.1 JB 上运行)
Kotlin 编程语言成为其 Android 应用程序开发人员的首选语言