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.
Verificar respuestas en hilo similares http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –