JavaScript-инъекция не работает на Android Chromium WebView, когда целью является Android 3.1

Мое приложение для Android внедряет код JS в WebView. Он нацелен на Android 3.1, но у меня возникают проблемы с Android 6 и 7 из-за того, что WebView теперь является хромовым, поэтому это не старый WebView.

Тем не менее, проблема очень странная, поэтому я не думаю, что это связано с причудливым режимом, в котором мое приложение работает на Android 6 и 7.

Мое приложение использует все полезные вызовы для загрузки интерфейса JS, который создает связь между кодом Java и кодом JS и работает в предыдущих версиях. После этих инструкций (метод addJavascriptInterface()) он выполняет "поддельную" загрузку, чтобы убедиться, что загружен интерфейс JS:

webView.loadData("", "text/html", null);

и когда "страница" загружается, она выполняет загрузку реального URL, то есть локального файла (file:///...); когда он загружен, скрипт вставляется и выполняется.

Что я испытываю, так это то, что я постоянно получаю следующую ошибку в журнале cat:

Cannot call determinedVisibility() - never saw a connection for the pid:

и я попробовал различные предложения, найденные на SO по этому поводу, но безуспешно:

это URL "data:text/html", который загружается снова и снова, и я могу остановить его, загружая только пустой URL, но тогда интерфейс JS теряется.

Что я должен сделать, чтобы сохранить интерфейс JS и заблокировать бесконечный цикл загрузки?

1 ответ

Проблема такого рода была устранена путем изменения первого "поддельного" вызова, который был предназначен для эффективного добавления интерфейса JS (он необходим) в WebView.

Вышеупомянутый метод, с этой инструкцией:

webView.loadData("", "text/html", null);

работал только с версиями, более старыми, чем Android 6.x (это может зависеть от устройств, поэтому он мог работать и на 4.4 и 5.x, но мое приложение работало на обоих).

Таким образом, правильный метод, работающий на всех версиях - это загрузить целевой файл дважды (выполнить новую загрузку после завершения первой),

или также возможно сначала загрузить другой файл (например, простой HTML без содержимого в теле), а затем загрузить целевой файл (когда первая загрузка будет завершена).

Другие вопросы по тегам