安卓的WebView
包含一个名为的方法addJavascriptInterface(Object obj, String interfaceName)
这在这里应该有用。
使用该方法,对象obj
您添加的界面可以通过 Web 视图中的 JavaScript 代码进行访问。在您的情况下,您可以传入一个具有 setter 方法的对象,该方法将某些 JavaScript 对象传输回 Java。
您仍然需要创建将 JavaScript 对象转换为 JSON 对象的粘合代码。作为一种快速方法,您可以让您的界面使用从 JavaScript 传递的 JSON 字符串在 Java 端生成 JSONObject。这JSONObject
Java 中的类有一个构造函数,它接受包含 JSON 数据的字符串。因此,您可以将字符串化结果直接传递回 Java 并以这种方式创建对象。例如:
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");
然后,在 JavaScript 端,在变量 jsonData 中有一个未解析的 JSON 的处理程序中:
Android.passObject("pageItems", jsonData);
现在,Java 端的 JSInterface 将有一个包含项目的 JSONObject,您可以使用 JSONObject 提供的 getter 来访问它。通过 Javascript 调用创建的对象将位于mObjectsFromJS
地图。您当然需要向 JSInterface 类添加额外的帮助器方法,以更好地管理对象。
我还没有编译或测试这些方法,因此您可能需要稍微调整它们才能正常运行。但希望这能给你带来想法。
但是,如果对象具有一致的接口和数据项,那么更明智的做法是创建一个简单的 JavaScript 粘合函数,使用 setter 方法将 JavaScript 对象属性绑定到 Java 端对象字段。
请注意这使得远程代码能够触发您设备上的本机代码。如果您无法完全控制加载到的页面/脚本WebView
,你应该确保暴露的行为obj
不允许任何漏洞利用。