andriod设置默认APP

周一入职的,本来以为刚进公司都是先打几天酱油的,没想到是每个人都分配了很紧急的任务,都需要完成新功能。能说是倒霉吗。。

       要做一个设置默认app的功能,由于公司做的是浏览器,需要做设置浏览器为默认浏览器的功能。这是以前没做过的功能。现将完成的过程记录下来

       1. 查找相关资料

        从 http://blog.csdn.net/leilu2008/article/details/8774112 得到android修改默认浏览器的方法,该方法需要

            权限,并且需要系统签名等。该权限等级比           较高,我们的应用无法直接使用。

      查看其他的app(如百度浏览器)的使用后,发现他们是分两步来实现这个功能:

1.先找出系统中默认打开程序,如果百度浏览器已经是默认浏览器,则不用设置为默认浏览器了。

2. 如果百度浏览器不是默认的:  

          a.已经设置其他浏览器为默认浏览器,则需要先删除其他浏览器的默认设置。在执行b。

          b.没有设置默认浏览器,弹出一个对话框,对话框中包含所有浏览器,指导用户选择百度浏览                        器,并选择"始终", 这时候系统会设置百度为默认浏览器,而不需要SET_PREFERRED_APPLICATIONS

             权限。

         2. 有了思路以后就开始干活了。

             实现的过程如下:

             a. 当用户点击设置为默认浏览器的时候,如果已经是默认浏览器器,则提示用户不需要设置。

             b. 如果已经设置其他的浏览器为默认浏览器,则需要先清除默认设置,即先跳到对应的app info页面。、


                                             andriod设置默认APP_第1张图片 

           可以由以下代码实现:

        Intent showSettings = new Intent();
        showSettings.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uriAppSettings = Uri.fromParts("package", packageName, null);
        showSettings.setData(uriAppSettings);
        startActivity(showSettings);

            packageName 由ComponentName.getPackageName()取得。

         c.此时没有设置任何默认的浏览器,需要弹出能够让用户选择的对话框,我们构造一个http请求来选择用所有浏          览器打开即可

        String str1 = "android.intent.category.DEFAULT";
        String str2 = "android.intent.category.BROWSABLE";
        String str3 = "android.intent.action.VIEW";

        IntentFilter filter = new IntentFilter(str3);
        filter.addCategory(str1);
        filter.addCategory(str2);
        filter.addDataScheme("http");

        Intent intent = new Intent(str3);
        intent.addCategory(str2);
        intent.addCategory(str1);
        Uri uri = Uri.parse("http://www.baidu.com");
        intent.setDataAndType(uri, null);

        startActivity(intent);

           此时,会弹出让用户选择浏览器的对话框,用户选择正确的浏览器,并选择“始终”后,会将正确的浏览器设置              为默认浏览器。


     附:获取默认浏览器,返回默认浏览器列表

    private static List getPreferredActivities(Context context) {
        String str1 = "android.intent.category.DEFAULT";
        String str2 = "android.intent.category.BROWSABLE";
        String str3 = "android.intent.action.VIEW";

        IntentFilter filter = new IntentFilter(str3);
        filter.addCategory(str1);
        filter.addCategory(str2);
        filter.addDataScheme("http");

        List filters = new ArrayList();
        filters.add(filter);

        List activities = new ArrayList();
        PackageManager packageManager = (PackageManager) context.getPackageManager();

        // You can use name of your package here as third argument
        packageManager.getPreferredActivities(filters, activities, null);

        return activities;
    }

上面的做法在三星、小米、Nuxus5等手机上都出现问题了,三星的比较严重,getPreferredActivities返回了一大堆东西,不管有没有设置为默认的浏览器。经过两天的修改,改为如下才成:

     private static String getPreferredActivity(Context context){


        Uri uri = Uri.parse(String.format(Constants.URL_SEARCH_BAIDU, "KKBrowser"));
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.setDataAndType(uri, "text/html");
        ResolveInfo defaultLauncher= context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
        return defaultLauncher.activityInfo.packageName;
    }
这才返回正确的默认设置。

然后判断是否为默认浏览器:

根据getPreferredActivity()的返回结果,如果

if (getPreferredActivity(context).equals("android")) {
    // No default selected
    ...

} else if (getPreferredActivity(context).equals(getPackageName())) { // We are default ... } else { // Someone else is default ... }

// We are default ... } else { // Someone else is default ... }


          然后是判断我们的浏览器是不是默认的
    public static boolean isDefaultBrowser(Context context){
        List componentNameList = getPreferredActivities(context);
        final String myPackageName = context.getPackageName();
        for (ComponentName componentName: componentNameList){
            if(myPackageName.equals(componentName.getPackageName())){
                return true;
            }
        }


        return false;
    }

    基本的功能算是完成,细节在优化,唉,继续的干活。


参考:

http://stackoverflow.com/questions/10831870/clear-default-android-application/10833919#10833919


             

你可能感兴趣的:(Android学习)