La vista web de Android no ejecuta javascript desde el script src

El problema

La vista web no ejecuta realmente los scripts cargados a través de src desde una ubicación remota

Comprobado y doble comprobado

El código

Dada una WebView view y un Context context

Construyendo un documento

Necesitará cookies, por lo que es necesario construirlo dinámicamente. file: // urls no permiten cookies. De cualquier manera, este 'debería' funciona muy bien.

 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 activados

Funciones simples para asegurarse de que el dispositivo retiene las cookies.

 CookieSyncManager.createInstance(context); CookieSyncManager.getInstance().sync(); 

Creación de un cliente cromado para el registro

Registro de todos los mensajes [dos veces] y cuando la página se ha terminado cargando ejecuta una función. Esto realmente funciona bien. Agregar más etiquetas de script [remotas] retrasa la ejecución.

 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(); } } }; 

Cargando la vista

Adjuntar el cliente de cromo, habilitar javascript, agregar la interfaz y empezar a cargar!

 view.setWebChromeClient( client ); view.getSettings().setJavaScriptEnabled(true); view.addJavascriptInterface( new JSInterface(), "bridge" ); view.loadDataWithBaseURL( "http://localhost/android/", html, mime, encoding, null ); 

La interfaz

La interfaz se ve como sigue

 public class JSInterface{ @JavascriptInterface public void result( int success, String message ) { Log.i( "JSINTERFACE", message ); // TODO handler } } 

Realmente puedo probar javascript Y la interfaz llamando

 view.loadUrl("javascript:bridge.result( 0, 'TESTING INTERFACE' );"); 

Siempre que se posponga hasta que se haya completado la carga (por ejemplo, en la execute function esto funciona bien y el mensaje se registra.

Dentro del script test.js

Un script muy sencillo

 console.log( 'test loaded' ); var test = function() { console.log( 'test' ); bridge.result( 1, 'res' ); } 

¿Por qué no funciona?

  • No veo el registro test loaded , debe ser capturado por el cliente

  • Cuando llamo a view.loadUrl("javascript:console.log(test) que obtener test is not defined

  • Escucha tocar y arrastrar el valor y la función en consecuencia
  • ¿Cómo puedo obtener esta aplicación de pintura de lienzo HTML5 para que funcione tanto para eventos de contacto como para ratón?
  • Llamadas Javascript desde Android usando PhoneGap
  • `Preload.js` no ha podido cargar algunos archivos en dispositivos Android
  • ¿Cuál es el equivalente a un setInterval / setTimeout de JavaScript en Android / Java?
  • Crosswalk Cordova Android múltiples archivos select
  • Error de JS en Android en GetSentry
  • ¿Detecta el arrastre de dedos con Javascript en teléfonos táctiles?
  • Cómo crear mapas que detectan la ubicación automática en React-Native
  • Reanudar la vista web de Android cuando se detiene por OS / ejecutar JavaScript en la aplicación en segundo plano?
  • Reacciona el video Web de Android nativo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.