57

I have this code, but not because it works, it keeps opening in webview and what I want is that the links do not belong to my website open in your default browser. Any idea? thanks

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 Answers 4

107

The problem is you need to send an Intent to the default web browser to open the link. What you are doing is just calling a different method in your Webview to handle the link. Whenever you want another app to handle something you need to use Intents. Try this code instead.

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    final String url = request.getUrl().toString();
    if (url.contains("message2space.es.vu")) {
        return false;
    }
    Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
    startActivity(intent);
    return true;
}
Sign up to request clarification or add additional context in comments.

5 Comments

Can we have long click listener on webview links?
Now i ve done this. However the app crashes because some ActivityNotFoundException.
@superUser You should open up your own question.
@TheOnlyAnil You should open up your own question.
shouldOverrideUrlLoading is deprecated.
33

Since API level 24 shouldOverrideUrlLoading(WebView view, String url) is deprecated.

Up to date solution:

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

2 Comments

great, this works like charm. This is really simple since it doesn't involve overwriting WebView. Maybe @Jaumesv can make it the new excepted answer to pin it clearly to the top...
Request.getUrl() has min SDK 21 requirements.
12
 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;
            }
        });

Comments

6

Here is very sweet and short solution

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.