2013-12-09 3 views
0

Я хочу узнать, программно, имя пакета браузера по умолчанию.Что такое браузер по умолчанию, узнать программно на Android

(И зная имя пакета, я могу, например, поместить его значок на кнопке, или запуск без запуска.)

Существует в PackageManagerresolveActivity(), но документы Google говорят: Если несколько найдено совпадающие действия и не задано значение по умолчанию, возвращает ResolveInfo, содержащий что-то еще, например, распознаватель активности.

ответ

2

Я надеюсь, что кто-то может написать что-то более элегантное. Но этот материал работает:

public static ComponentName getDefaultBrowserComponent(Context context) { 
    Intent i = new Intent() 
     .setAction(Intent.ACTION_VIEW) 
     .setData(new Uri.Builder() 
       .scheme("http") 
       .authority("x.y.z") 
       .appendQueryParameter("q", "x") 
       .build() 
       ); 
    PackageManager pm = context.getPackageManager(); 
    ResolveInfo default_ri = pm.resolveActivity(i, 0); // may be a chooser 
    ResolveInfo browser_ri = null; 
    List<ResolveInfo> rList = pm.queryIntentActivities(i, 0); 
    for (ResolveInfo ri : rList) { 
     if (ri.activityInfo.packageName.equals(default_ri.activityInfo.packageName) 
     && ri.activityInfo.name.equals(default_ri.activityInfo.name) 
     ) { 
      return ri2cn(default_ri); 
     } else if ("com.android.browser".equals(ri.activityInfo.packageName)) { 
      browser_ri = ri; 
     } 
    } 
    if (browser_ri != null) { 
     return ri2cn(browser_ri); 
    } else if (rList.size() > 0) { 
     return ri2cn(rList.get(0)); 
    } else if (default_ri == null) { 
     return null; 
    } else { 
     return ri2cn(default_ri); 
    } 
} 
private static ComponentName ri2cn(ResolveInfo ri) { 
    return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name); 
} 
Смежные вопросы