在Android Webview中用浏览器打开外部链接

55

我有这段代码,但它并不能按预期工作,它一直在WebView中打开链接,我想要的是不属于我的网站的链接在您的默认浏览器中打开。有什么想法吗?谢谢。

private class CustomWebViewClient extends WebViewClient {
        @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
              if(url.contains("message2space.es.vu")){
                view.loadUrl(url);
                return true;
            }else{
                return super.shouldOverrideUrlLoading(view, url);
            }

            }
        }
4个回答

104
问题是你需要发送一个Intent到默认的网页浏览器打开链接。你现在所做的只是调用Webview中的不同方法来处理链接。每当你想让另一个应用程序来处理某些东西时,你需要使用Intents。请尝试使用以下代码。
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    final String url = request.getUrl().toString();
    if (url.contains("message2space.es.vu")) {
        view.loadUrl(url);
    } else {
        Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
        startActivity(intent);
    }
    return true;
}

我们能在 WebView 链接上拥有长按监听器吗? - TheOnlyAnil
现在我已经完成了这个。但是应用程序崩溃了,因为出现了ActivityNotFoundException异常。 - superUser
1
@superUser 你应该开启自己的问题。 - onit
@TheOnlyAnil 你应该开一个新问题。 - onit
2
shouldOverrideUrlLoading已被弃用。 - Meet Vora

32

自 API 级别 24 开始,shouldOverrideUrlLoading(WebView view, String url)已被弃用。

最新解决方案:

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
            view.getContext().startActivity(intent);
            return true;
        }
    });

太棒了,这运行得很流畅。这真的很简单,因为它不涉及覆盖“WebView”。也许@Jaumesv可以将其设置为新的接受答案,并将其置于顶部清晰固定... - sunadorer
4
Request.getUrl()需要最低SDK版本为21。 - Sergio

10
 webView.setWebViewClient(new WebViewClient()   {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

                if((String.valueOf(request.getUrl())).contains("paramedya.com.tr")) {
                    view.loadUrl(String.valueOf(request.getUrl()));
                } else {
                    Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
                    view.getContext().startActivity(intent);
                }

                return true;
            }
        });

6

这里有一个非常简单和精炼的解决方案

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    context.startActivity(i);
    return true;
}

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