周一入职的,本来以为刚进公司都是先打几天酱油的,没想到是每个人都分配了很紧急的任务,都需要完成新功能。能说是倒霉吗。。
要做一个设置默认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页面。、
可以由以下代码实现:
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