1 简介:
在Android设备上,在打开网页时,可以使用指定的浏览器来打开。本篇描述了这个功能的实现方法。
2 原理
我们知道,在Android应用开发时,可以由一个Activity跳转到另外的Activity,是通过intent来设置跳转的参数的。同时,Android系统中也提供了Intent过滤器IntentFilter,来过滤指定参数的intent。常用的过滤器目标属性值有:
android.intent.category.DEFAULT:默认值
android.intent.category.BROWSABLE:浏览器
android.intent.action.VIEW:视图
通过设置这些属性,再结合Android SDK其它组件(主要是ComponentName),就可以实现用指定的浏览器打开网页的功能了。
3 代码
详细代码如下:
工具类BrowserUtils.java:
public class BrowserUtils {
private static String Intent_Default = "android.intent.category.DEFAULT";
private static String Intent_Browxer = "android.intent.category.BROWSABLE";
private static String Intent_View = "android.intent.action.VIEW";
//默认浏览器,用UC
private static String Default_Browser_App = "com.UCMobile";
private static String Default_Browser_Activity = "com.UCMobile.main.UCMobile";
public static void initBrowserForContext(Context context) {
PackageManager packageManager = context.getPackageManager();
//设置过滤器
IntentFilter filter = new IntentFilter(Intent_View);
filter.addCategory(Intent_Default);
filter.addCategory(Intent_Browxer);
filter.addDataScheme("http");
//设置浏览页面用的Activity
ComponentName component=new ComponentName(Default_Browser_App, Default_Browser_Activity);
//创建intent
Intent intent = new Intent(Intent_View);
intent.addCategory(Intent_Browxer);
intent.addCategory(Intent_Default);
Uri uri = Uri.parse("http://");
intent.setDataAndType(uri,null);
//找出手机当前安装的所有浏览器程序
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent,PackageManager.GET_INTENT_FILTERS);
int listSize = resolveInfoList.size();
ComponentName[] componentNames = new ComponentName[listSize];
for (int i = 0; i< listSize;i++) {
ActivityInfo info = resolveInfoList.get(i).activityInfo;
String pkgName = info.packageName;
String className = info.name;
//清除之前的默认设置
packageManager.clearPackagePreferredActivities(pkgName);
ComponentName newComponentName = new ComponentName(pkgName,className);
componentNames[i] = newComponentName;
packageManager.addPreferredActivity(filter,IntentFilter.MATCH_CATEGORY_SCHEME,componentNames,newComponentName);
}
}
}
说明:
(1)可以使用 ComponentName来设置一个Acitivity的属性;
(2)packageManager.queryIntentActivities:可以找出指定条件的Activity列表。
另外,需要进行权限申请:
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"
代码的调用:
在你的Activity中,就可以这样使用了:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BrowserUtils.initBrowserForContext(this);
}
}