Android WebView не выполняет JavaScript из сценария SRC
Эта проблема
Webview фактически не выполняет скрипты, загруженные через src из удаленного местоположения.
Проверено и дважды проверено
Разрешение:
<uses-permission android:name="android.permission.INTERNET" />
Что файл
http://localhost/android/test.js
существуетЧто это называется
view.getSettings().setJavaScriptEnabled(true);
перед загрузкой URL
Код
Учитывая WebView view
и Context context
Создание документа
Для этого понадобятся файлы cookie, поэтому необходимо его динамически создавать. file:// URL не разрешают использование файлов cookie. В любом случае, это "должно" работать просто отлично.
String html =
"<html>\n" +
"<head>\n" +
"</head>\n" +
"<body>\n" +
"<script src=\"http://localhost/android/test.js\" type=\"text/javascript\"></script>\n" +
"</body>\n" +
"</html>";
String mime = "text/html";
String encoding = "utf-8";
Cookies включены
Простые функции, чтобы убедиться, что устройство сохраняет куки.
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().sync();
Создание клиента Chrome для регистрации
Регистрация всех сообщений [дважды] и после загрузки страницы выполнить функцию. Это на самом деле хорошо работает. Добавление дополнительных тегов [remote] script задерживает выполнение.
WebChromeClient client = new WebChromeClient ( ) {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.e( "JSINTERFACE", consoleMessage.message() );
return super.onConsoleMessage(consoleMessage);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
loadingFinished = ( newProgress == 100 );
Log.d( "JSINTERFACE", "Progress is:" + newProgress );
if ( loadingFinished ) {
Log.i( "JSINTERFACE", "Finished loading webclient" );
execute();
}
}
};
Загрузка представления
Присоедините клиент Chrome, включите JavaScript, добавьте интерфейс и начните загрузку!
view.setWebChromeClient( client );
view.getSettings().setJavaScriptEnabled(true);
view.addJavascriptInterface( new JSInterface(), "bridge" );
view.loadDataWithBaseURL( "http://localhost/android/", html, mime, encoding, null );
Интерфейс
Интерфейс выглядит следующим образом
public class JSInterface{
@JavascriptInterface
public void result( int success, String message ) {
Log.i( "JSINTERFACE", message );
// TODO handler
}
}
Я могу на самом деле проверить Javascript и интерфейс, позвонив
view.loadUrl("javascript:bridge.result( 0, 'TESTING INTERFACE' );");
Пока это откладывается до завершения загрузки (например, в execute function
это отлично работает И сообщение зарегистрировано.
Внутри test.js
скрипт
Очень простой скрипт
console.log( 'test loaded' );
var test = function() { console.log( 'test' ); bridge.result( 1, 'res' ); }
Почему это не работает?
Я не вижу
test loaded
журнал, должен быть захвачен клиентомКогда я звоню
view.loadUrl("javascript:console.log(test)
я получилtest is not defined