Откройте собственный браузер из приложения для Android.

У меня есть телефон Android с несколькими установленными браузерами, и я могу или не могу установить браузер по умолчанию.

Итак, мой вопрос..

  1. Из моего приложения: как принудительно открыть ссылку только в браузере Android NATIVE?
  2. Есть ли способ узнать, установлен ли браузер по умолчанию или нет?

person defactodeity    schedule 26.04.2012    source источник


Ответы (6)


Из моего приложения, как заставить открыть ссылку только в НАТИВНОМ браузере Android?

Intent intent = new Intent();
ComponentName comp = new ComponentName("com.google.android.browser","com.google.android.browser.BrowserActivity");
intent.setComponent(comp);
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.BROWSABLE");
Uri uri = Uri.parse(url);
intent.setData(uri);
try
{
    startActivity(intent);
 }
 catch (Exception e)
 {
   e.printStackTrace();
 } 

Есть ли способ узнать, установлен ли браузер по умолчанию или нет?

PackageManager packageManager = getPackageManager();

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("URL"));

List<ResolveInfo> list = packageManager.queryIntentActivities(intent, 0);

if (list.size() > 0) {
    for (ResolveInfo resolveInfo : list) {
       resolveInfo.isDefault();// will let u know if the app is set to default
    }

} else {
    //No apps available
}
person grassyburrito    schedule 26.04.2012
comment
Приведенный выше код не смог определить браузер по умолчанию. На моем устройстве я установил Opera в качестве браузера по умолчанию, но когда я запускаю этот код, я не вижу, что resolveInfo.isDefault всегда верно для любого браузера! Пожалуйста помоги. - person defactodeity; 02.05.2012

Вы должны сделать следующее для вызова собственного браузера

  intent.setComponent(new    
  componentName("com.android.browser","com.android.browser.BrowserActivity"));
person Pramod J George    schedule 22.10.2012

попробуйте что-то вроде этого.

try {
      Intent i = new Intent();
      ComponentName comp = new ComponentName("com.google.android.browser","com.google.android.browser.BrowserActivity");
      i.setComponent(comp);
      i.setAction("android.intent.action.VIEW");
      i.addCategory("android.intent.category.BROWSABLE");
      ContentURI uri = new ContentURI(url);
      i.setData(uri);
      startActivityForResult(i, 2);
      } catch (URISyntaxException e) {
                       e.printStackTrace();
      } 

для вашего второго вопроса вы можете использовать PackageManager.

получить экземпляр PackageManager

PackageManager packageManager = getPackageManager(); 

и запросите его для конкретного действия, данных и категории Intent.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("URL"));

List<ResolveInfo> list = packageManager.queryIntentActivities(intent, 0);

    for (ResolveInfo resolveInfo : list) {

       if(resolveInfo.isDefault())
        {
        //default browser
         }
    }
person N-JOY    schedule 26.04.2012
comment
Большое спасибо @N-JOY Следующий код ответил на первый вопрос. Intent ii = new Intent(); ComponentName comp = new ComponentName("com.android.browser","com.android.browser.BrowserActivity"); ii.setComponent(comp); ii.setAction("android.intent.action.VIEW"); ii.addCategory("android.intent.category.BROWSABLE"); ii.setData(Uri.parse("http://www.google.com")); startActivity(ii); Что касается второй части вопроса, есть ли способ узнать, установлен ли на телефоне браузер по умолчанию? - person defactodeity; 26.04.2012
comment
Я установил браузер по умолчанию, но resolveInfo.isDefault не работает. - person defactodeity; 02.05.2012

Наконец-то разобрался. resolveActivity работает с флагом MATCH_DEFAULT_ONLY в экземпляре PackageManager.

person aasha    schedule 03.05.2012

может возникнуть исключение ActivityNotFoundException, если имя пакета отличается от производителя. Пожалуйста, обратитесь к этому ответу, если он поможет.

https://stackoverflow.com/a/14723703/1083128

person Mia    schedule 06.02.2013

Проверьте этот код:

private final static List<ComponentName> browserComponents  = new ArrayList<ComponentName>() {{
    add(new ComponentName("com.google.android.browser", "com.google.android.browser.BrowserActivity"));
    add(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
    add(new ComponentName("com.android.chrome", "com.google.android.apps.chrome.IntentDispatcher"));
}};

public static void openInNativeBrowser(Context context, String url) {
    if (context == null || TextUtils.isEmpty(url)) {
        return;
    }

    PackageManager pm = context.getPackageManager();
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.addCategory(Intent.CATEGORY_BROWSABLE);
    intent.setData(Uri.parse(url));

    for (ComponentName cn : browserComponents) {
        intent.setComponent(cn);
        ActivityInfo ai = intent.resolveActivityInfo(pm, 0);
        if (ai != null) {
            aLog.w(TAG, "browser:  " + ai);
            context.startActivity(intent);
            return;
        } else {
            aLog.w(TAG, "can't resolve activity for " + intent);
        }
    }

    // no native browser
    intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
    if (list.size() > 0) {
        for (ResolveInfo ri : list) {
            aLog.w(TAG, ri + " : " + ri.isDefault);
        }
        context.startActivity(intent);
    } else {
        aLog.w(TAG, "no browser apps");
    }
}
person B-GangsteR    schedule 01.01.2020