2012-04-02 22 views
8

Estoy migrando una aplicación web a una versión de Android. Después de haber recibido y procesado los datos JSON, tengo una matriz de objetos JavaScript dentro de la página.¿Puedo pasar un objeto Javascript a un Android WebView?

¿Cómo puedo pasar el contenido completo de uno de los objetos javascript "fuera" al contenedor webview para visualizarlo usando controles nativos de Android?

Eventualmente, podría crear una interfaz de JavaScript con un método que tenga parámetros para cada una de las posibles propiedades de objeto de JavaScript, pero esto parece ser demasiado pesado.

¿Alguien puede ayudar con esto?

+1

Verificar respuestas en hilo similares http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –

Respuesta

15

WebView de Android contiene un método llamado addJavascriptInterface(Object obj, String interfaceName) que debería ser útil aquí.

Utilizando este método, se puede acceder al objeto obj que agrega como interfaz mediante el código JavaScript en la Vista web. En su caso, podría pasar un objeto que tenga un método setter que transfiera algún objeto JavaScript a Java.

Aún necesitará crear el código de pegamento que convierta su objeto JavaScript en el objeto JSON. Para un enfoque rápido, puede hacer que su interfaz genere un JSONObject en el lado de Java utilizando una cadena JSON pasada desde JavaScript. La clase JSONObject en Java tiene un constructor que acepta una cadena que contiene datos JSON. Por lo tanto, puede pasar el resultado del stringified directamente a Java y crear el objeto de esa manera. Por ejemplo:

class JSInterface { 
    HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>(); 
    public void passObject(String name, String json) { 
     mObjectsFromJS.put(name, new JSONObject(json)); 
    } 
} 

//At some point, register using: 
mJSInterface = new JSInterface(); 
mWebView.addJavascriptInterface(mJSInterface, "Android"); 

A continuación, en el lado de JavaScript, en el controlador que tiene una masa de unparsed JSON en la variable jsonData:

Android.passObject("pageItems", jsonData); 

Ahora, su JSInterface en el lado de Java tendrá una JSONObject que contiene los elementos, a los que puedes acceder utilizando los getters proporcionados por JSONObject. Los objetos creados a través de la llamada de Javascript estarán en el mapa mObjectsFromJS. Por supuesto, querrá agregar métodos auxiliares adicionales a la clase JSInterface para permitir una mejor administración de los objetos.

No he compilado ni probado ninguno de estos métodos, por lo que es posible que deba ajustarlos un poco para que funcionen correctamente. Pero espero que esto te dé la idea.

Sin embargo, si los objetos tienen una interfaz y elementos de datos consistentes, sería más sensato crear una función simple de pegamento de JavaScript que vincule las propiedades del objeto JavaScript con los campos de objetos del lado de Java utilizando métodos setter.

POR FAVOR Esto está dando la capacidad remota de código para activar el código nativo en su dispositivo. Si no tiene control completo sobre las páginas/scripts que se cargan en el WebView, debe asegurarse de que el comportamiento expuesto por obj no permita ningún exploit.

+0

Gracias Jason, Por lo que dices, no es posible "simplemente" pasar el objeto javascript directamente a una función de configuración de java y esperar que se traduzca. Así, para continuar, yo tendría que: - tomar mi objeto JSON y volver de nuevo a una cadena codificada JSON - pasar la cadena codificada copia de seguridad a través de la interfaz de JavaScript - decodificarlo en un objeto java Todo eso para poder acceder a los datos correctamente. Gracias por aclarar esto. – Simon

+0

Después de haber intentado que esta respuesta funcione, descubrí que la interfaz de JavaScript está completamente rota en v2.3.x de Android. Vergüenza. – Simon

+0

¿Qué sucede si quiero hacer que mi función Java sea un constructor, así que llamaría, p. 'var ob = new Android.MyObject()', ¿cómo devolvería un objeto JavaScript nativo? – Michael

Cuestiones relacionadas