我可以将Javascript对象传递给Android WebView吗?

时间:2012-04-02 15:41:40

标签: javascript android webview

我正在将Web应用程序迁移到Android版本。 在收到并处理了JSON数据之后,我在页面中保存了一组Javascript对象。

如何将其中一个javascript对象“out”的完整内容传递给webview容器,以便使用本机android控件进行显示?

最终,我可以使用一个方法创建一个javascript界面​​,该方法具有每个可能的javascript对象属性的参数 - 但这似乎过于沉重。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:15)

Android的WebView包含一个名为addJavascriptInterface(Object obj, String interfaceName)的方法,在这里应该很有用。

使用此方法,可以通过Web视图中的JavaScript代码访问作为界面添加的对象obj。在您的情况下,您可以传入一个具有setter方法的对象,该方法将一些JavaScript对象传回Java。

您仍然需要创建将JavaScript对象转换为JSON对象的粘合代码。对于快速方法,您可以使用从JavaScript传递的JSON字符串让您的接口在Java端生成JSONObject。 Java中的JSONObject类有一个构造函数,它接受包含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");

然后,在JavaScript方面,在变量jsonData中有一小块未解析的JSON的处理程序中:

Android.passObject("pageItems", jsonData);

现在,Java端的JSInterface将包含一个包含项的JSONObject,您可以使用JSONObject提供的getter访问这些项。通过Javascript调用创建的对象将位于mObjectsFromJS地图中。您当然希望向JSInterface类添加其他辅助方法,以便更好地管理对象。

我没有编译或测试过任何这些方法,因此您可能需要稍微调整一下才能正常运行。但希望这会给你一个想法。

但是,如果对象具有一致的接口和数据项,那么创建一个简单的JavaScript粘合函数会更加明智,该函数使用setter方法将JavaScript对象属性绑定到Java端对象字段。

请注意 这使远程代码能够触发设备上的本机代码。如果您无法完全控制加载到WebView中的页面/脚本,则应确保obj公开的行为不允许任何漏洞利用。