Open the native browser from an android app

后端 未结 6 1852
孤街浪徒
孤街浪徒 2020-12-30 11:26

I have an android phone with multiple browsers installed and I might or might not set a browser to default.

So, my question is..

  1. From my App, How do I
相关标签:
6条回答
  • 2020-12-30 11:48

    try something like this.

    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();
          } 
    

    for your second question you can use PackageManager.

    get instance of PackageManager

    PackageManager packageManager = getPackageManager(); 
    

    and query it for specific action, data and category of 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
             }
        }
    
    0 讨论(0)
  • 2020-12-30 11:51

    From my App, How do I force open a link only in the NATIVE android browser?

    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();
     } 
    

    Is there a way I can know if there is a browser set to default or not?

    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
    }
    
    0 讨论(0)
  • 2020-12-30 11:58

    Check this code:

    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");
        }
    }
    
    0 讨论(0)
  • 2020-12-30 12:06

    You have to make the following for calling the native browser

      intent.setComponent(new    
      componentName("com.android.browser","com.android.browser.BrowserActivity"));
    
    0 讨论(0)
  • 2020-12-30 12:11

    it might occur ActivityNotFoundException while the package name is different by manufacturer. Please refer to this answer, wish it would help.

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

    0 讨论(0)
  • 2020-12-30 12:13

    Finally figured it out. resolveActivity works with MATCH_DEFAULT_ONLY flag on PackageManager instance..

    0 讨论(0)
提交回复
热议问题