Sim*_*mon 8 javascript android webview
我正在将Web应用程序迁移到Android版本.在收到并处理了JSON数据之后,我在页面中保存了一组Javascript对象.
如何将其中一个javascript对象的完整内容"out"传递给webview容器,以便使用本机android控件进行显示?
最终,我可以使用一个方法创建一个javascript接口,该方法具有每个可能的javascript对象属性的参数 - 但这似乎过于沉重.
有人能帮忙吗 ?
Jas*_*run 15
Android WebView
包含一个addJavascriptInterface(Object obj, String interfaceName)
在这里应该有用的方法.
使用此方法,obj
可以通过Web视图中的JavaScript代码访问作为接口添加的对象.在您的情况下,您可以传入一个具有setter方法的对象,该方法将一些JavaScript对象传回Java.
您仍然需要创建将JavaScript对象转换为JSON对象的粘合代码.对于快速方法,您可以使用从JavaScript传递的JSON字符串让您的接口在Java端生成JSONObject.JSONObject
Java中的类有一个构造函数,它接受包含JSON数据的String.因此,您可以将字符串化结果直接传递回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");
Run Code Online (Sandbox Code Playgroud)
然后,在JavaScript端,在变量jsonData中有一个未解析的JSON blob的处理程序中:
Android.passObject("pageItems", jsonData);
Run Code Online (Sandbox Code Playgroud)
现在,Java端的JSInterface将包含一个包含项的JSONObject,您可以使用JSONObject提供的getters访问这些项.通过Javascript调用创建的对象将在mObjectsFromJS
地图中.您当然希望向JSInterface类添加其他辅助方法,以便更好地管理对象.
我没有编译或测试过任何这些方法,所以你可能需要稍微调整一下才能正常运行.但希望这会给你一个想法.
但是,如果对象具有一致的接口和数据项,那么创建一个简单的JavaScript粘合函数会更加明智,该函数使用setter方法将JavaScript对象属性绑定到Java端对象字段.
请注意
这使远程代码能够触发设备上的本机代码.如果您无法完全控制正在加载的页面/脚本WebView
,则应确保公开的行为obj
不允许任何漏洞利用.