WebView.loadData не работает на Android 9.0 (API-29)

У меня есть приложение для статей, я показываю статьи в WebView. В Android версии 9.0 (API-29) этот WebView не работает. Приложение не показывает НИЧЕГО в моей статье Действия.

mWebView.setVisibility(View.VISIBLE);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setMinimumFontSize(14);

String htmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
   + "<head>"
   + "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"
   + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>"
   + "<style type=\"text/css\">body{color: #525252;} img {max-width: 100%; height: auto}</style>"
   + "</head>"
   + item.getContent() //content of item
   + "";

mWebView.loadData(htmlContent, "text/html; charset=utf-8", "UTF-8");

В результате, как я могу решить эту проблему?


person gurkan stack    schedule 04.02.2019    source источник


Ответы (3)


Я решил свою проблему, проблема возникает на смартфонах с последней версией Chrome.

РЕШЕНИЕ:

Не используй

mWebview.loadData

вместо этого используйте

mWebview.loadDataWithBaseURL

В результате мое решение:

mWebview.loadDataWithBaseURL(null,htmlContent,"text/html", "utf-8", null);

person gurkan stack    schedule 06.02.2019
comment
Странно то, что loadData работает с отладочной сборкой. Он перестаёт работать только на релизной сборке. - person neobie; 09.08.2019
comment
@neobie, есть ли шанс, что вы решили проблему с релизной сборкой? В моем случае и loadData, и loadDataWithBaseUrl не работают ни с какими параметрами в сборке релиза, только в сборке отладки. И это также специфично для проекта, потому что тестовый проект, созданный с нуля, отлично показывает локальный контент с помощью webView в сборке выпуска. - person AlexanderShirshov; 11.07.2020
comment
Я включил baseUrl (URL-адрес, откуда я изначально получил html), вместо того, чтобы оставить его нулевым. Я предполагаю, что проблема заключалась в том, что всякий раз, когда веб-просмотр пытался получить изображения для html, он не знал, где искать, но после того, как я дал ему исходный URL-адрес, он знал, где их найти - person Trake Vital; 22.07.2020
comment
черт возьми, Я ТЕБЯ ЛЮБЛЮ. Я думал, что я тупица, и задавался вопросом, не работает ли видимость веб-просмотра, так как я просто вижу белый экран. Тогда это было на самом деле виновником, так как я использую loadData, и это работало на моих старых устройствах. - person MDuh; 26.08.2020
comment
Круто, ты спас мой день, братан - person G.N.SRIDHAR; 16.09.2020
comment
Будьте здоровы !!!!! - person Dusan Lilic; 15.03.2021

Ваш HTML-контент должен быть закодирован либо в Base64, либо в URL-адресе. В вашем примере HTML есть "#", и это вызывает проблему в некоторых версиях WebView.

Вот пример с кодировкой Base64.

String htmlContent = "...";
String encodedHtml = Base64.encodeToString(htmlContent.getBytes(), Base64.NO_PADDING);
webView.loadData(encodedHtml, "text/html", "base64");

Вот javadoc для получения подробной информации.

person Yuichi Araki    schedule 06.02.2019
comment
Спас мне жизнь бро! - person Sumit; 14.01.2020
comment
это должен быть принятый ответ. Спасибо, сэр. - person MrPlow; 03.04.2020
comment
Большой! Это должен быть принятый ответ, мой веб-просмотр перестал работать, когда я обновился до 29 с 28, вы спасли мой день! Большое спасибо - person dicarlomagnus; 08.11.2020

У меня тоже была такая же проблема с версией Android 9.0.

Документы на этой странице (https://developer.android.com/about/versions/pie/android-9.0-migration) упомяните, что:

В Android 9 декодер UTF-8 для языка Java является более строгим и соответствует стандарту Unicode.

Поэтому я попытался преобразовать UTF-8 в Base64 и использовать loadData().

try {
       String base64 = null;
       base64 = android.util.Base64.encodeToString(lecureHtmlData.getBytes("UTF-8"),
                    android.util.Base64.DEFAULT);
       wvLecture.loadData(base64, "text/html; charset=utf-8", "base64");
    } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
    }

Сейчас работает как обычно.

Надеюсь, поможет

person dna    schedule 06.02.2019