Новый WebView применяет дополнительные ограничения при запросе ресурсов и разрешении ссылок, использующих пользовательскую схему URL-адресов. Например, если вы реализуете обратные вызовы, такие как shouldOverrideUrlLoading() или shouldInterceptRequest(), тогда WebView вызывает их только для допустимых URL-адресов.
Если вы используете настраиваемую схему URL-адресов или базовый URL-адрес и заметили, что ваше приложение получает меньше вызовов для этих обратных вызовов или не может загрузить ресурсы на Android 4.4, убедитесь, что в запросах указаны допустимые URL-адреса, соответствующие RFC 3986.
Например, новый WebView может не вызывать ваш метод shouldOverrideUrlLoading() для таких ссылок:
Показать профиль Результат перехода пользователя по такой ссылке может быть разным:
Если вы загрузили страницу, вызвав loadData() или loadDataWithBaseURL() с недопустимым или пустым базовым URL-адресом, вы не получите обратный вызов shouldOverrideUrlLoading() для этого типа ссылки на странице. Примечание. Если вы используете loadDataWithBaseURL(), а базовый URL-адрес недействителен или имеет значение null, все ссылки в загружаемом контенте должны быть абсолютными.
Если вы загрузили страницу, вызвав 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, и важно включать косую черту в конце, иначе любые запросы с загруженной страницы могут быть отброшены.
person
Community
schedule
14.04.2016