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 без содержимого в теле), а затем загрузить целевой файл (когда первая загрузка будет завершена).