Новый WebView применяет дополнительные ограничения при запросе ресурсов и разрешении ссылок, использующих настраиваемую схему URL. Например, если вы выполняете обратные вызовы, такие как shouldOverrideUrlLoading() или shouldInterceptRequest(), то WebView вызывает их только для действительных URL-адресов.
Если вы используете настраиваемую схему URL или базовый URL-адрес и обратите внимание, что ваше приложение получает меньше вызовов этих обратных вызовов или не загружает ресурсы на Android 4.4, убедитесь, что в запросах указаны допустимые URL-адреса, соответствующие RFC 3986.
Например, новый WebView не может назвать свой метод shouldOverrideUrlLoading() для ссылок, как это:
Показать Профиль Результат пользователь должен щелкнуть такую ссылку можно варьировать:
Если загружен на странице loadData() или loadDataWithBaseURL() с недопустимым или нулевым базовым URL-адресом, вы не получите обратный вызов shouldOverrideUrlLoading() для этого типа ссылки на странице. Примечание. Если вы используете loadDataWithBaseURL(), а базовый URL-адрес недействителен или установлен нуль, все ссылки в загружаемом вами содержимом должны быть абсолютными.
Если вы загрузили страницу, вызвав loadUrl() или указав действительный базовый URL-адрес с помощью loadDataWithBaseURL(), вы получите обратный вызов shouldOverrideUrlLoading() для этого типа ссылки на странице, но URL-адрес, который вы получите, будет по отношению к текущей странице. Например, URL-адрес, который вы получите, будет «http://www.example.com/showProfile» вместо «showProfile». Вместо того, чтобы использовать простую строку в ссылку, как показано выше, вы можете использовать пользовательскую схему, такие как следующие: метод
<a href="example-app:showProfile">Show Profile</a>
Вы можете обрабатывать этот URL в вашем shouldOverrideUrlLoading(), как это:
// The URL scheme should be non-hierarchical (no trailing slashes)
private static final String APP_SCHEME = "example-app:";
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(APP_SCHEME)) {
urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");
respondToData(urlData);
return true;
}
return false;
}
Если вы не можете изменить HTML, вы можете использовать loadDataWithBaseURL() и установить базовый URL-адрес, состоящий из пользовательской схемы и допустимого хоста, например «example-app: ///». Например:
webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,
null, "UTF-8", null);
Действительное имя хоста должно соответствовать RFC 3986, и это важно, чтобы включить слэш в конце, в противном случае, любые запросы из загруженной страницы могут пропускаться.
Первоначально я принял свой собственный ответ, потому что он был прямым ответом на мою проблему, но этот ответ помог мне в нескольких других местах, где у меня были некоторые пользовательские значения href, которые перепутались из-за того, как 4.4 обрабатывал мои пользовательские URL-адреса. Так что спасибо! – Jon