WebView链接点击打开默认浏览器

131

我现在有一个应用程序,它加载了一个Webview,在这个应用程序中所有的点击都是在应用程序内部进行的。我想要做的是,当应用程序内某个链接被点击时,比如http://www.google.com,它会打开默认浏览器。如果有任何想法,请告诉我!

7个回答

217
我今天也需要做同样的事情,我在StackOverflow上找到了一个非常有用的答案,并在这里分享,以防其他人需要。

来源 (by sven)

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) {
            view.getContext().startActivity(
                new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        } else {
            return false;
        }
    }
});

8
请注意,如果URL是相对路径(不以“http://”开头),则它将在应用程序内打开。为了避免这种情况,始终返回true并使相对URL链接无效。 - Johan S
3
您应该检查前缀中的其他协议,例如rtsp、https等。如果链接是用来打开媒体的,应该将其重定向到设备的媒体播放器。如果没有协议前缀,则需要确定并提供一个。 - Abhinav Saxena
嘿,谢谢你。我有一个问题,当我从启动的活动返回时,包含webview的调用活动会被关闭吗?如何确保包含webview的活动在后退导航时保持打开状态?编辑:没事了,我把noHistory设置为true了,谢谢! - Atieh
删除它没有帮助。 - Atieh
5
注意,在API 24中,shouldOverrideUrlLoading(WebView view, String url)已经被弃用。请参考这个答案 - Mateus Gondim
显示剩余2条评论

40
WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl(https://whatoplay.com/);

您不必包含此代码。

// webview.setWebViewClient(new WebViewClient());

改用以下代码。

webview.setWebViewClient(new WebViewClient()
{
  public boolean shouldOverrideUrlLoading(WebView view, String url)
  {
    String url2="https://whatoplay.com/";
     // all links  with in ur site will be open inside the webview 
     //links that start ur domain example(http://www.example.com/)
    if (url != null && url.startsWith(url2)){
      return false;
    } 
     // all links that points outside the site will be open in a normal android browser
    else
    {
      view.getContext().startActivity(
      new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
      return true;
    }
  }
});

14
你只需要添加以下这行代码。
yourWebViewName.setWebViewClient(new WebViewClient());

查看此处获取官方文档。


11

你可以使用Intent来实现这个:

Intent browserIntent = new Intent("android.intent.action.VIEW", Uri.parse("your Url"));
startActivity(browserIntent);

11
你应该使用Intent.ACTION_VIEW。 - rajh2504

6
您可以使用Intent来实现此功能:
Uri uriUrl = Uri.parse("http://www.google.com/"); 
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);  
startActivity(launchBrowser);  

3

由于这是关于WebView外部重定向的热门问题之一,因此这里提供了一个Kotlin的“现代”解决方案:

webView.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(
            view: WebView?,
            request: WebResourceRequest?
        ): Boolean {
            val url = request?.url ?: return false
            //you can do checks here e.g. url.host equals to target one
            startActivity(Intent(Intent.ACTION_VIEW, url))
            return true
        }
    }

0

现在public boolean shouldOverrideUrlLoading(WebView view, String url)已被弃用,而使用public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)代替,您可以在Java中使用以下代码:

private class MyWebViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (Objects.equals(request.getUrl().toString(), "http://www.google.com/")) {
                Uri uri = request.getUrl();
                startActivity(new Intent(Intent.ACTION_VIEW, uri));
                return true;
            }
            else {
                return false;
            }
        }
    }

只需将http://www.google.com/替换为您想在Web浏览器中打开的URL,而不是Web视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接