首先說一下開發需求,需要使用主流的瀏覽器打開網頁,比如QQ瀏覽器,UC瀏覽器,opera瀏覽器,如果此手機裏面有安裝上述瀏覽器,則使用上述的瀏覽器打開網頁,無需彈出瀏覽器選擇項,如果這幾種都有安裝則按照優先順序使用最優先的,如果上述幾種都沒有則使用默認瀏覽器打開。
衆所周知,android打開網頁是有對應的Intent Action的“android.intent.action.VIEW”,通過這種方式打開url會彈出一個選擇瀏覽器選項,讓你選擇對應的瀏覽器來打開,根本不能滿足需求。後來一想Intent不是可以設置activity的包名+類名,我設置好action再設置好包名+類名應該能定位到對應的瀏覽器,就不需要選擇了。通過在網上下了幾個版本的瀏覽器來看,包名倒還好基本沒變,但是類名的話基本上不同版本的類名也不盡相同,我不可能窮舉出每一個可能出現的類名。難題出來了,最好有方法能夠通過包名直接找到對應的default activity的類名就好,我記得activityManager不是有個方法可以找到包名的LaunchIntent,那麼我想能不能通過Intent來找到類名呢,找了下度娘果然有類似的方法Intent.resolveActivity就可以找到launch activity,問題迎刃而解。有了思想,轉化成代碼就不難了。
理下流程
1.枚舉對應瀏覽器包名到數組中
2.數組循環根據包名找到對應的LaunchIntent
3.通過LaunchIntent找到對應的launch activity的包名
4.Intent通過設置activity的包名+類名
函數如下:
public void openUrl(String url){
String[] browser = { "com.tencent.mtt", "com.UCMobile", "com.uc.browser", "com.oupeng.browser", "com.oupeng.mini.android", "com.android.browser" };
Intent intent = null;
for (String br : browser) {
if (KpshUtils.getAppIsInstall(kActivity, br)) {
String clsName = null;
try {
PackageManager pm = kActivity.getApplicationContext().getPackageManager();
Intent intent1 = pm.getLaunchIntentForPackage(br);
ComponentName act = intent1.resolveActivity(pm);
clsName = act.getClassName();
KpshLog.d(KpshActivity.class, "clsName = " + clsName);
} catch (Exception e) {
// TODO Auto-generated catch block
KpshLog.e(e);
}
if (clsName == null) {
break;
}
intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
intent.setClassName(br, clsName);
break;
}
}
if (intent == null) {
intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
}
kActivity.startActivity(intent);
}