Android 的WebView 包含一个名为addJavascriptInterface(Object obj, String interfaceName) 的方法,在这里应该很有用。
使用此方法,您添加为接口的对象obj 可以通过 Web 视图中的 JavaScript 代码访问。在您的情况下,您可以传入一个对象,该对象具有将一些 JavaScript 对象传回 Java 的 setter 方法。
您仍然需要创建将 JavaScript 对象转换为 JSON 对象的粘合代码。作为一种快速方法,您可以让您的界面使用从 JavaScript 传递的 JSON 字符串在 Java 端生成一个 JSONObject。 Java 中的JSONObject 类有一个构造函数,它接受包含 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 暴露的行为不允许任何漏洞利用。