Android源代码中设置默认浏览器

来源:互联网 发布:元素周期表 知乎 编辑:程序博客网 时间:2024/06/13 13:37


Android 6.0 之前

当系统存在多个浏览器时,如何预置某个浏览器为系统默认的浏览器?

以设定UC浏览器为默认浏览器:

设计思路:第一次开机默认选择UC浏览器来打开网页,而且用户也是可以清除该默认选择的浏览器的,如果用户清除默认的浏览器设置,那么我们也保留用户的选择,直到reset机器。

具体方法:

1.在PackageManagerService中的够找函数结尾添加:setDefaultBrowser();

2.setDefaultBrowser()的具体实现

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private final void setDefaultBrowser(){  
  2.   
  3.                    Log.d("debug_default","setDefaultBrowser is called.");  
  4.   
  5.                    if(!isFirstBoot()) {  
  6.   
  7.                             Log.d("debug_default","not first boot, return");  
  8.   
  9.                             return;  
  10.   
  11.                             }  
  12.   
  13.                     
  14.   
  15.                    String str1 = "android.intent.category.DEFAULT";  
  16.   
  17.                    String str2 = "android.intent.category.BROWSABLE";  
  18.   
  19.                    String str3 = "android.intent.action.VIEW";  
  20.   
  21.                    //intent filter  
  22.   
  23.                    IntentFilter filter = new IntentFilter(str3);  
  24.   
  25.                    filter.addCategory(str1);  
  26.   
  27.                    filter.addCategory(str2);  
  28.   
  29.                    filter.addDataScheme("http");  
  30.   
  31.           
  32.   
  33.                    //intent  
  34.   
  35.                    Intent intent = new Intent(str3);  
  36.   
  37.                    intent.addCategory(str2);  
  38.   
  39.                    intent.addCategory(str1);  
  40.   
  41.                    Uri uri = Uri.parse("http://");  
  42.   
  43.                    intent.setDataAndType(uri, null);  
  44.   
  45.                     
  46.   
  47.                    //set UC,if your want set other browser as default, modify below code, add package name and activiy name  
  48.   
  49.                    ComponentName component = new ComponentName("com.UCMobile","com.UCMobile.main.UCMobile");  
  50.   
  51.                     
  52.   
  53.                    //find all browsers  
  54.   
  55.                    List<ResolveInfo> resolveInfoList = queryIntentActivities(intent,intent.getType(),PackageManager.GET_INTENT_FILTERS);  
  56.   
  57.                    int size = resolveInfoList.size();  
  58.   
  59.                    ComponentName[] arrayOfComponentName = new ComponentName[size];  
  60.   
  61.                    //make sure the default browser in phone  
  62.   
  63.                    boolean no_UC = true;  
  64.   
  65.                    for (int i = 0; i < size; i++)  
  66.   
  67.                    {  
  68.   
  69.                             ActivityInfo activityInfo = resolveInfoList.get(i).activityInfo;  
  70.   
  71.                             String packageName = activityInfo.packageName;  
  72.   
  73.                             String className = activityInfo.name;  
  74.   
  75.                             //if your want set other browser as default, modify below package name  
  76.   
  77.                             if (packageName.equals("com.UCMobile")) no_UC = false;  
  78.   
  79.                              
  80.   
  81.                             ComponentName componentName = new ComponentName(packageName, className);  
  82.   
  83.                             arrayOfComponentName[i] = componentName;  
  84.   
  85.                    }  
  86.   
  87.                    if (no_UC){  
  88.   
  89.                             Log.d("debug_default","no uc package");  
  90.   
  91.                             return;  
  92.   
  93.                             }else{  
  94.   
  95.                             Log.d("debug_default","uc package is in, set it as Preferred.");  
  96.   
  97.                             }  
  98.   
  99.           
  100.   
  101.                    //set default  
  102.   
  103.                    addPreferredActivity2(filter,IntentFilter.MATCH_CATEGORY_SCHEME, arrayOfComponentName,component);  
  104.   
  105.                    Log.d("debug_default","add UC to PreferredActivity");  
  106.   
  107.           
  108.   
  109.                    }  

3.增加addPreferredActivity2接口(还是在PackageManagerService.java中):

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void addPreferredActivity2(IntentFilter filter, int match,  
  2.   
  3.             ComponentName[] set, ComponentName activity) {  
  4.   
  5.         Log.d("debug_default","addPreferredActivity2 is called.");  
  6.   
  7.         // writer  
  8.   
  9.         synchronized (mPackages) {             
  10.   
  11.             Slog.i(TAG, "Adding preferred activity " + activity + ":");  
  12.   
  13.             filter.dump(new LogPrinter(Log.INFO, TAG), "  ");  
  14.   
  15.             mSettings.mPreferredActivities.addFilter(  
  16.   
  17.                     new PreferredActivity(filter, match, set, activity));  
  18.   
  19.             scheduleWriteSettingsLocked();              
  20.   
  21.         }  
  22.   
  23.     }  
  24.   
  25.            

上面是设置UC 为默认浏览器的方法,如果要设置其他浏览器为系统默认,需要修改两个地方:

1.ComponentName component = new ComponentName(packageName“,“ActivityName");

2.if (packageName.equals("packageName")) no_UC = false;

其它都不变。

packageName代表要设置为默认浏览器的那个browser对应的包名,activityName代表要设置为默认浏览器的那个浏览器对应的类名。


红色标注的API,在Android新版本上由于支持multi-user的缘故,所以接口定义发生改变,有两处需要修改(上面红色标记的语句):

1, List<ResolveInfo> resolveInfoList = queryIntentActivities(intent,intent.getType(),PackageManager.GET_INTENT_FILTERS);

修改成:

List<ResolveInfo> resolveInfoList = queryIntentActivities(intent,intent.getType(),PackageManager.GET_INTENT_FILTERS, 0);

 

2,mSettings.mPreferredActivities.addFilter(

                   new PreferredActivity(filter, match, set, activity));

            scheduleWriteSettingsLocked();   

修改成

mSettings.editPreferredActivitiesLPw(0).addFilter(

                   new PreferredActivity(filter, match, set, activity));

           mSettings.writePackageRestrictionsLPr(0);


Android 6.0

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. frameworks/base/core/res/res/values/config.xml  
  2.    
  3. <string name="default_browser" translatable="false">com.android.chrome</string>  


原文来自:

http://blog.csdn.net/demon_xiaochunjie/article/details/52688317

0 0
原创粉丝点击