Android获取手机安装的浏览器列表
2024-10-21 06:13:21
最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下:
public static List<ResolveInfo> getBrowserList(Context context) {
PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http://www.baidu.com/")); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY); return activities;
}
运行结果如下:
com.android.browser
com.tencent.mtt
com.android.chrome
com.taobao.taobao
结果不知道怎么淘宝客户端就被当作browser添加进来了,后来发现原来淘宝客户端也添加了Intent.CATEGORY_BROWSABLE这个category过滤,但是使用
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("http://www.baidu.com/"));
ComponentName name = new ComponentName("android",
"com.android.internal.app.ResolverActivity");
intent.setComponent(name);
context.startActivity(intent);
这样调起系统选择的浏览器的界面就没有出现淘宝客户端,这让我感觉很意外,于是看了com.android.internal.app.ResolverActivity的代码,发现有这样一段代码:
// Only display the first matches that are either of equal
// priority or have asked to be default options.
ResolveInfo r0 = currentResolveList.get(0);
for (int i=1; i<N; i++) {
ResolveInfo ri = currentResolveList.get(i);
if (r0.priority != ri.priority ||
r0.isDefault != ri.isDefault) {
while (i < N) {
if (mOrigResolveList == currentResolveList) {
mOrigResolveList = new ArrayList<ResolveInfo>(mOrigResolveList);
}
currentResolveList.remove(i);
N--;
}
}
}
于是将获取浏览器列表的逻辑改成了如下:
public static List<ResolveInfo> getBrowserList(Context context) {
PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http://www.baidu.com/")); List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY); ResolveInfo r0 = activities.get(0); Iterator<ResolveInfo> activity_iter = activities.iterator();
while (activity_iter.hasNext()) {
ResolveInfo resolveInfo = activity_iter.next(); if (r0.priority != resolveInfo.priority ||
r0.isDefault != resolveInfo.isDefault) {
activities.remove(resolveInfo);
}
} return activities;
}
运行得到的结果如下:
com.android.browser
com.tencent.mtt
com.android.chrome
总结:第一个是获取到的是最匹配查询条件的系统软件,所有app的优先级与其相同的即为所要获取的列表项。
最新文章
- Windows请求连接 Vmware+Ubuntu14被拒绝 的幽怨诉说
- 方便!C++ builder快捷键大全
- app基本信息
- markdown 基本语法
- 宏ut_mem_block_t
- oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)
- 将Apache添加为Linux的服务 实现自启动(转)
- Java书籍推荐
- C# 中的常用正则表达式总结
- java 网络编程Socket编程
- Oracle 重建控制文件
- 【Java面试题】19 final,finally和finalize的区别
- Netty WebSocket 开发
- Matlab 学习视频集合
- [development][security][suricata] suricata 使用与调研
- CA证书和TLS介绍
- 浅谈 String 的 hashCode() 方法
- linux下导入导出数据库
- JS编写简单的弹窗插件(含有demo和源码)
- 【bzoj2001】 Hnoi2010—City 城市建设
热门文章
- pycharm和webstorm永久激活方法
- redis cluster 集群部署
- EntityFramework CodeFirst 数据库迁移
- Docker容器日志查看与清理(亲测有效)
- Android中的CardView使用
- Django From表单定制
- 初识backbone.js
- VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
- 数据挖掘:基于Spark+HanLP实现影视评论关键词抽取(1)
- java开发中的设计模式