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

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.JSONObjectJava中的类有一个构造函数,它接受包含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不允许任何漏洞利用.