Is `shouldOverrideUrlLoading` really deprecated? What can I use instead? Is `shouldOverrideUrlLoading` really deprecated? What can I use instead? android android

Is `shouldOverrideUrlLoading` really deprecated? What can I use instead?


Documenting in detail for future readers:

The short answer is you need to override both the methods. The shouldOverrideUrlLoading(WebView view, String url) method is deprecated in API 24 and the shouldOverrideUrlLoading(WebView view, WebResourceRequest request) method is added in API 24. If you are targeting older versions of android, you need the former method, and if you are targeting 24 (or later, if someone is reading this in distant future) it's advisable to override the latter method as well.

The below is the skeleton on how you would accomplish this:

class CustomWebViewClient extends WebViewClient {    @SuppressWarnings("deprecation")    @Override    public boolean shouldOverrideUrlLoading(WebView view, String url) {        final Uri uri = Uri.parse(url);        return handleUri(uri);    }    @TargetApi(Build.VERSION_CODES.N)    @Override    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {        final Uri uri = request.getUrl();        return handleUri(uri);    }    private boolean handleUri(final Uri uri) {        Log.i(TAG, "Uri =" + uri);        final String host = uri.getHost();        final String scheme = uri.getScheme();        // Based on some condition you need to determine if you are going to load the url         // in your web view itself or in a browser.         // You can use `host` or `scheme` or any part of the `uri` to decide.        if (/* any condition */) {            // Returning false means that you are going to load this url in the webView itself            return false;        } else {            // Returning true means that you need to handle what to do with the url            // e.g. open web page in a Browser            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);            startActivity(intent);            return true;        }    }}

Just like shouldOverrideUrlLoading, you can come up with a similar approach for shouldInterceptRequest method.


The version I'm using I think is the good one, since is the exact same as the Android Developer Docs, except for the name of the string, they used "view" and I used "webview", for the rest is the same

No, it is not.

The one that is new to the N Developer Preview has this method signature:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

The one that is supported by all Android versions, including N, has this method signature:

public boolean shouldOverrideUrlLoading(WebView view, String url)

So why should I do to make it work on all versions?

Override the deprecated one, the one that takes a String as the second parameter.


Use

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {    return shouldOverrideUrlLoading(view, request.getUrl().toString());}