电信A库要求android系统中有多个Browser时,开机自动设置一个默认浏览器,而不用弹出选择框让用户手动选择。

  监听开机广播Intent.ACTION_BOOT_COMPLETED, 用PackageManager调用addPreferredActivity来设置默认Browser。因为要有系统权限才能设置成功,所以在Package/apps/Settings模块中添加代码实现。(系统通过校验发起调用PackageManager.addPreferredActivity程序的Uid来判断是否有权限)

 public class BootCompletedReceiver extends BroadcastReceiver {

     private final static String PKG_NAME = "com.android.browser";
private final static String CLASS_NAME = "com.android.browser.BrowserActivity"; private final static String[] SCHEME = new String[] { "http", "https", "about", "javascript", }; @Override
public void onReceive(Context c, Intent paramIntent) {
try {
Log.d("antoon", paramIntent.getAction());
setDefaultBrowser(c);
} catch (Exception e) {
e.printStackTrace();
}
} private void setDefaultBrowser(Context c) { long start = System.currentTimeMillis(); Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://"));//这里如果配置 “file://” pm.queryIntentActivities得到的list为空,不知为何 final int flags = PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_RESOLVED_FILTER; PackageManager pm = c.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, flags); final int N = list == null ? 0 : list.size();
if (N == 0)
return; int bestmatch = 0;
int uid = -1;
ComponentName matchComponentName = null;
ComponentName[] set = new ComponentName[N]; ComponentName defaultComponentName = new ComponentName(PKG_NAME, CLASS_NAME);
for (int i = 0; i < N; i++) {
ResolveInfo r = list.get(i);
ComponentName cp = new ComponentName(r.activityInfo.packageName, r.activityInfo.name);
set[i] = cp;
if (cp.equals(defaultComponentName)) {
bestmatch = r.match;
matchComponentName = cp;
uid = r.activityInfo.applicationInfo.uid;
}
Log.d("antoon", i + " -- " + cp);
} if (matchComponentName == null) {
Log.d("antoon", "matchComponentName is null");
matchComponentName = set[0];
bestmatch = list.get(0).match;
} Log.d("antoon", "bestmatch = " + bestmatch + " matchComponentName = "
+ matchComponentName); // List<IntentFilter> filterList = filterList();
62 //for (IntentFilter filter : filterList) {
63 // pm.addPreferredActivity(filter, bestmatch, set, matchComponentName);//用下面的方法也可以,系统权限的校验就是根据CallingUserId来判断
64 // pm.addPreferredActivity(filter, bestmatch, set, matchComponentName, android.os.UserHandle.getCallingUserId());
65 //}
       pm.addPreferredActivity(getFilterViewHttp(), bestmatch, set, matchComponentName, android.os.UserHandle.getCallingUserId());
Log.d("antoon", "used time :" + (System.currentTimeMillis() - start)+"ms");
}       /*没必要针对每个scheme创建filter,在一个filter中加入所有scheme就可以,与Browser中AndroidManifest.xml中的配置对应。
      public List<IntentFilter> filterList() {
70   ArrayList<IntentFilter> list = new ArrayList<IntentFilter>();
71   for (String sche : SCHEME) {
72   IntentFilter filter = new IntentFilter();
73   filter.addAction(Intent.ACTION_VIEW);
74   filter.addCategory(Intent.CATEGORY_BROWSABLE);
75   filter.addCategory(Intent.CATEGORY_DEFAULT);
76   filter.addDataScheme(sche);
77   list.add(filter);
78   }
79   return list;
80   }
      */
    
     public IntentFilter getFilterViewHttp() {

            IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_VIEW);
filter.addCategory(Intent.CATEGORY_BROWSABLE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addDataScheme("http"); return filter;
}
 }
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <receiver android:name=".BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

看看系统Browser的配置

    <activity
android:name="BrowserActivity"
android:alwaysRetainTaskState="true"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
android:label="@string/application_name"
android:launchMode="singleTask"
android:theme="@style/BrowserTheme"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.speech.action.VOICE_SEARCH_RESULTS" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!--
For these schemes were not particular MIME type has been
supplied, we are a good candidate.
-->
<intent-filter>
<action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="about" />
<data android:scheme="javascript" />
</intent-filter>
<!--
For these schemes where any of these particular MIME types
have been supplied, we are a good candidate.
-->
<intent-filter>
<action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="inline" />
<data android:mimeType="text/html" />
<data android:mimeType="text/plain" />
<data android:mimeType="application/xhtml+xml" />
<data android:mimeType="application/vnd.wap.xhtml+xml" />
</intent-filter>
<!-- For viewing saved web archives. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="file" />
<data android:mimeType="application/x-webarchive-xml" />
</intent-filter>
<!-- Accept inbound NFC URLs at a low priority -->
<intent-filter android:priority="-101" >
<action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
<!-- We are also the main entry point of the browser. -->
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.APP_BROWSER" />
</intent-filter>
<!--
The maps app is a much better experience, so it's not
worth having this at all... especially for a demo!
<intent-filter android:label="Map In Browser">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/postal-address" />
</intent-filter>
-->
<intent-filter>
<action android:name="android.intent.action.WEB_SEARCH" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.WEB_SEARCH" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="" />
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_SEARCH" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> <meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>

参考:http://www.apkbus.com/forum.php?mod=viewthread&tid=225694&page=1#pid3159981

设置默认Browser的更多相关文章

  1. [saiku] 简化/汉化/设置默认页

    上一篇分析了schema文件 [ http://www.cnblogs.com/avivaye/p/4877832.html] 在安装完毕Saiku后,由于是社区版本,所以界面上存在很多升级为商业版的 ...

  2. Ueditor设置默认字体、字号、行间距,添加字体种类(转)

    Ueditor默认字体.字号.行间距的修改: ueditor默认字号是16号,默认字体为sans-serif,默认行间距为5px,如下图所示: 首先,修改ueditor.all.js文件中如上图红框中 ...

  3. datepickerx设置默认日期

    datepicher插件是jQuery UI的一个插件,它提供一个日期弹出窗口(或直接显示在页面),供用户选择日期.在Web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的inp ...

  4. .NET DateTime类型变量作为参数时设置默认值

    一个小的 Tips. .NET 中函数参数的默认值需要是编译时常量.如果参数是引用类型,可以设置Null,如果是值类型,可以设置相应的编译时常量,如整型可以用整数,但对于DateTime(结构体,值类 ...

  5. ng-option指令使用记录,设置默认值需要注意

    ng-options一般有以下用法: 数组作为数据源: label for value in array select as label for value in array label group ...

  6. IIS设置默认主页无效

    服务器系统:Windows server 2008 R2 IIS版本:7.5 IIS中部署一个dotnet framework 3.5的网站应用程序,设置"默认文档"为:index ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  8. EF Core1.0 CodeFirst为Modell设置默认值!

    当我们使用CodeFirst时,有时候需要设置默认值! 如下 ; public string AdminName {get; set;} = "admin"; public boo ...

  9. cefsharp设置默认语言

    cefsharp是不错的浏览器内核封装版本之一,默认语言是en-US,这个一直困扰着项目,项目好多处需修改,后来经多次尝试,才发现,原来设置默认语言这么简单. CefSharp.Settings se ...

随机推荐

  1. Android学习路-Android Studio的工程目录

    说明:下图为一个app的工程目录,如果在res下随便建立文件夹(比如test等名字)是不会显示在工程内的

  2. PHPActiveRecord 学习三

    #事务处理 注意事务 数据库要用InnoDB引擎 $c1 = User::connection(); try { //开启事务 $c1->transaction(); //sql语句 $sql ...

  3. 截图软件FastStone

    屏幕截图软件(FastStone Capture) 好用,可以粘贴 / 复制. 可以做页面设计,有屏幕标尺,取色器.

  4. Android笔记:ContextMenu

    ContextMenu,称为上下文菜单,也就是长按界面不放,弹出的菜单.使用ContextMenu有三个步骤: (1)调用registerForContextMenu()方法,为视图注册上下文菜单: ...

  5. pycharm的安装(图文)

    pycharm的安装, PyCharm是一种 IDE,可以在里面对python代码调试.语法高亮.Project管理.跳转.智能提示.自动完成.单元测试.版本控制.pycharm提供了一些高级功能,以 ...

  6. pta l2-6(树的遍历)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 题意:给出一个二叉树的结点数目n, ...

  7. vue 给v-html中的元素设置样式

    解决方案:写样式的时候添加>>>

  8. robotium—只有apk文件的测试

    把ppt的内容总结一下,并把问题说明一下: 把基本步骤搞出来,用notepad的程序吧,直接安装apk,就当做是不知道源码就好啦! 直接用自己的手机上就行啦!! 一.重签名: 步骤: 1.直接运行re ...

  9. Netty---入门程序,搭建Websocket 服务器

    Netty 常用的场景: 1.充当HTTP 服务器,但Netty 并没有遵循servlet 的标准,反而实现了自己的一套标准进行Http 服务: 2,RPC 远程调用,在分布式系统中常用的框架 3.S ...

  10. linux详解sudoers

    sudo使用 Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个.出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限 ...