【发布时间】:2013-12-09 09:54:33
【问题描述】:
我想以编程方式找出默认浏览器的包名。
(如果知道包名,我可以将其图标放在按钮上,或者在没有启动器的情况下启动。)
PackageManager 中有 resolveActivity(),但 Google 文档说:如果找到多个匹配的活动并且没有默认设置,则返回包含其他内容的 ResolveInfo,例如活动解析器。 em>
【问题讨论】:
我想以编程方式找出默认浏览器的包名。
(如果知道包名,我可以将其图标放在按钮上,或者在没有启动器的情况下启动。)
PackageManager 中有 resolveActivity(),但 Google 文档说:如果找到多个匹配的活动并且没有默认设置,则返回包含其他内容的 ResolveInfo,例如活动解析器。 em>
【问题讨论】:
我希望有人能写出更优雅的东西。但这东西有效:
public static ComponentName getDefaultBrowserComponent(Context context) {
Intent i = new Intent()
.setAction(Intent.ACTION_VIEW)
.setData(new Uri.Builder()
.scheme("http")
.authority("x.y.z")
.appendQueryParameter("q", "x")
.build()
);
PackageManager pm = context.getPackageManager();
ResolveInfo default_ri = pm.resolveActivity(i, 0); // may be a chooser
ResolveInfo browser_ri = null;
List<ResolveInfo> rList = pm.queryIntentActivities(i, 0);
for (ResolveInfo ri : rList) {
if (ri.activityInfo.packageName.equals(default_ri.activityInfo.packageName)
&& ri.activityInfo.name.equals(default_ri.activityInfo.name)
) {
return ri2cn(default_ri);
} else if ("com.android.browser".equals(ri.activityInfo.packageName)) {
browser_ri = ri;
}
}
if (browser_ri != null) {
return ri2cn(browser_ri);
} else if (rList.size() > 0) {
return ri2cn(rList.get(0));
} else if (default_ri == null) {
return null;
} else {
return ri2cn(default_ri);
}
}
private static ComponentName ri2cn(ResolveInfo ri) {
return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
}
【讨论】: