Действительно ли "shouldOverrideUrlLoading" не рекомендуется? Что я могу использовать вместо этого?

У меня есть вопрос / проблема, действительно ли "shouldOverrideUrlLoading" не рекомендуется? Если так, что я могу использовать вместо этого?

Это похоже на shouldOverrideUrlLoading устарела для Android N, и мне нужно, чтобы приложение работало с API 19 до самой последней версии Android N (бета), я использую некоторые функции, которые являются новыми в Android N (например, Data Saver), поэтому таргетинг на Marshmallow не будет помочь с этой проблемой, так как мне нужно использовать эти новые функции, вот часть кода, который я использую:

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

И это сообщение Android Studio дал мне:

Переопределяет устаревший метод в 'android.webkit.WebViewClient'. Эта проверка сообщает, где устаревший код используется в указанной области проверки.

Google ничего не говорит об этом осуждении.

Интересно, если использовать @SuppressWarnings("deprecation") Позвольте мне работать на всех устройствах, начиная с API 19 до последней Android N Beta (и его окончательной версии, когда она выйдет), я не могу протестировать его сам, я никогда не использовал его, и я должен быть уверен, что он работает, так кто-нибудь может подсказать?

Большое спасибо.

5 ответов

Решение

Версия, которую я использую, я думаю, является хорошей, поскольку она точно такая же, как и Документы для разработчиков Android, за исключением названия строки, они использовали "view", а я использовал "webview", в остальном - то же самое.

Нет.

Тот, который является новым для N Developer Preview, имеет следующую подпись метода:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

Тот, который поддерживается всеми версиями Android, включая N, имеет подпись этого метода:

public boolean shouldOverrideUrlLoading(WebView view, String url)

Итак, почему я должен сделать это, чтобы это работало на всех версиях?

Переопределите устаревший, тот, который принимает String как второй параметр.

Подробное документирование для будущих читателей:

Короткий ответ: вам нужно переопределить оба метода. shouldOverrideUrlLoading(WebView view, String url) метод устарел в API 24 и shouldOverrideUrlLoading(WebView view, WebResourceRequest request) метод добавлен в API 24. Если вы нацеливаетесь на более старые версии android, вам нужен первый метод, и если вы нацеливаетесь на 24 (или позже, если кто-то читает это в далеком будущем), желательно также переопределить последний метод,

Ниже приведен скелет того, как вы этого добьетесь:

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

Как shouldOverrideUrlLoadingВы можете придумать аналогичный подход для shouldInterceptRequest метод.

Использование

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

Начиная с 2023 года, используйте это для решения проблемы:

      private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return false;
    }
}

Реализуйте как устаревшие, так и не устаревшие методы, как показано ниже. Первый - для обработки уровня API 21 и выше, второй - для уровня ниже API 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
        }
}
Другие вопросы по тегам