gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:57:46 27 4
gpt4 key购买 nike

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

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

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

有人可以帮忙吗?

最佳答案

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

使用此方法,您添加为接口(interface)的对象 obj 可以通过 Web View 中的 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 类添加额外的辅助方法,以便更好地管理对象。

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

但是,如果对象具有一致的接口(interface)和数据项,则更明智的做法是创建一个简单的 JavaScript 胶水函数,使用 setter 方法将 JavaScript 对象属性绑定(bind)到 Java 端对象字段。

请注意这使远程代码能够在您的设备上触发 native 代码。如果您不能完全控制加载到 WebView 中的页面/脚本,您应该确保 obj 暴露的行为不允许任何攻击。

关于javascript - 我可以将 Javascript 对象传递给 Android WebView 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9979398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com