web-dev-qa-db-fra.com

Est-ce que `shouldOverrideUrlLoading` est vraiment obsolète? Que puis-je utiliser à la place?

Est-ce que "shouldOverrideUrlLoading" est vraiment obsolète? Si oui, que puis-je utiliser à la place?

Il semble que shouldOverrideUrlLoading soit obsolète et qu'il cible Android N et que je dois faire fonctionner une application depuis l'API 19 jusqu'au dernier dernier droit. Maintenant, qui est Android N (version bêta), j'utilise certaines fonctionnalités nouvelles de Android N (comme Data Saver). Par conséquent, le ciblage de Marshmallow ne résoudra pas le problème, car je dois utiliser ces nouvelles fonctionnalités. , voici la partie du code que j'utilise:

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

Et voici le message Android que Studio m'a donné:

Remplace la méthode obsolète dans 'Android.webkit.WebViewClient' Cette inspection indique où du code obsolète est utilisé dans l'étendue d'inspection spécifiée.

Google ne dit rien à propos de cette dépréciation .

Je me demande si l’utilisation de @SuppressWarnings("deprecation") me permettra de travailler sur tous les appareils depuis l’API 19 jusqu’au dernier bêta Android N (et sa version finale au moment de sa publication). Je ne peux pas le tester moi-même. jamais utilisé cela et je dois être sûr que cela fonctionne, alors tout le monde peut le savoir?

118
Minion

Je pense que la version que j’utilise est la bonne, puisqu’elle est identique à la Android Developer Docs, sauf le nom de la chaîne, ils ont utilisé "view" et j’ai utilisé "webview", pour le reste c'est pareil

Non ce n'est pas.

Celui qui est nouveau dans l'aperçu du développeur N a cette signature de méthode:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

Celui qui est pris en charge par toutes les versions de Android, y compris N, a cette signature de méthode:

public boolean shouldOverrideUrlLoading(WebView view, String url)

Alors, pourquoi devrais-je faire pour que cela fonctionne sur toutes les versions?

Remplacez le paramètre obsolète, celui qui prend un paramètre String.

82
CommonsWare

Documenter en détail pour les futurs lecteurs:

La réponse courte est que vous devez remplacer les deux méthodes. La méthode shouldOverrideUrlLoading(WebView view, String url) est obsolète dans l'API 24 et la méthode shouldOverrideUrlLoading(WebView view, WebResourceRequest request) est ajoutée à l'API 24. Si vous ciblez d'anciennes versions d'Android, vous besoin l'ancienne méthode, et si vous ciblez 24 (ou plus tard, si quelqu'un lit ceci dans un futur lointain), il est également conseillé de remplacer cette dernière méthode.

Ci-dessous, le squelette expliquant comment vous y parviendrez:

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

Tout comme shouldOverrideUrlLoading, vous pouvez proposer une approche similaire pour la méthode shouldInterceptRequest.

173
Henry

Utilisation

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    view.loadUrl(request.getUrl().toString());
    return true;
}
14
saleem kalro

Implémentez les méthodes obsolètes et non obsolètes comme ci-dessous. La première consiste à gérer les API de niveau 21 et supérieur, la seconde est inférieure à celle des API de niveau 21.

webViewClient = object : WebViewClient() {
.
.
        @RequiresApi(Build.VERSION_CODES.Lollipop)
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            parseUri(request?.url)
            return true
        }

        @SuppressWarnings("deprecation")
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            parseUri(Uri.parse(url))
            return true
        }
}
0
emr