【问题标题】:Can I pass a Javascript object out to an Android WebView?我可以将 Javascript 对象传递给 Android WebView 吗?
【发布时间】:2012-04-16 06:55:38
【问题描述】:

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

如何将其中一个 javascript 对象的完整内容“输出”到 webview 容器,以便使用原生 android 控件进行显示?

最终,我可以创建一个 javascript 接口,其中的方法具有每个可能的 javascript 对象属性的参数 - 但这似乎过于繁重。

有人可以帮忙吗?

【问题讨论】:

标签: javascript android webview


【解决方案1】:

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 暴露的行为不允许任何漏洞利用。

【讨论】:

  • 谢谢 Jason,从你的意思来看,不可能“简单地”将 javascript 对象直接传递给 java setter 函数并期望它被翻译。因此,要恢复,我需要: - 获取我的 JSON 对象并将其恢复为 json 编码字符串 - 通过 javascript 接口将编码字符串传递回来 - 将其解码为 java 对象 所有这些都能够访问数据正确。感谢您澄清这一点。
  • 在尝试让这个答案正常工作后,我发现 javascript 界面在 Android 的 v2.3.x 中完全被破坏了。耻辱。
  • 如果我想让我的 Java 函数成为构造函数怎么办,所以我会调用例如var ob = new Android.MyObject(),我将如何返回原生 javascript 对象?
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
相关资源
最近更新 更多