Действительно ли "shouldOverrideUrlLoading" устарело? Если да, то что я могу использовать вместо этого?
Похоже, таргетинг на Android NshouldOverrideUrlLoading
устарел, и мне нужно, чтобы приложение работало с 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 (и ее финальной версии, когда она будет выпущена), я не могу протестировать ее сам, я никогда не использовал это, и мне нужно быть уверенным что это работает, так что кто-нибудь может сказать?
Ответы:
Нет это не так.
Тот, который является новым для N Developer Preview, имеет такую сигнатуру метода:
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
Тот, который поддерживается всеми версиями Android, включая N, имеет такую сигнатуру метода:
public boolean shouldOverrideUrlLoading(WebView view, String url)
Замените устаревший, тот, который принимает в
String
качестве второго параметра.источник
String
. Например, этот образец приложения , скомпилированный с использованием API уровня 19, отлично работает, например, на Nexus 5 под управлением Android 6.0String
качестве второго параметра. Например, пример приложения, с которым я связался, которое переопределяет устаревший обратный вызов, отлично работает на Nexus 6, на котором запущена N Developer Preview 1.getUrl()
потому что новый метод будет вызываться только 24+Подробное документирование для будущих читателей:
Короткий ответ: вам нужно переопределить оба метода. Этот
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
метода.источник
@RequiresApi
вместо @TargetApi для будущего использованияshouldInterceptRequest
, заключается в том, что на устройствах Android N + они оба вызываются, и вы будете обрабатывать каждый uri дважды! Чтобы исправить это, я добавилBuild.VERSION.SDK_INT < Build.VERSION_CODES.N
условие в устаревшую версию.super. shouldOverrideUrlLoading(view,request)
добавите нерекомендуемый метод, то да, будут вызываться как нерекомендуемый, так и устаревший метод. Это связано с тем, что реализация нерекомендуемого метода по умолчанию заключается в внутреннем вызове устаревшего метода. Просто взгляните на файлWebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
. Поэтому убедитесь, что вы не звонитеsuper.shouldOverrideUrlLoading()
.Использовать
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return shouldOverrideUrlLoading(view, request.getUrl().toString()); }
источник
Реализуйте устаревшие и нерекомендуемые методы, как показано ниже. Первый - обрабатывать уровень API 21 и выше, второй - обрабатывать уровень ниже 21 API.
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 } }
источник
Uri.parse
иparseUri
. Новые ответы должны добавить новую полезную информацию и новое понимание темы.