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

2023-11-25

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

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

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

有人能帮忙吗 ?


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

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

您仍然需要创建将 JavaScript 对象转换为 JSON 对象的粘合代码。作为一种快速方法,您可以让您的界面使用从 JavaScript 传递的 JSON 字符串在 Java 端生成 JSONObject。这JSONObjectJava 中的类有一个构造函数,它接受包含 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不允许任何漏洞利用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将 Javascript 对象传递给 Android WebView 吗? 的相关文章

随机推荐

  • git 预提交钩子代码格式化与部分提交?

    有没有办法有一个预提交钩子来自动格式化代码 对于 示例与astyle 但是确实not销毁部分提交 工作流程 edit a file txt git add p file txt add one chunk but not another g
  • 如何在 Swift 中获得 Bool 的相反值?

    我的具体情况是我正在尝试切换导航栏的隐藏和显示 let navHidden self navigationController navigationBarHidden self navigationController setNavigat
  • iOS - 如何发出 SOAP 请求并接收关注响应

    我知道网络上有很多关于 如何在 iOS 中使用 SOAP 的内容 但我仍然未能遵循 SOAP 请求和响应 非常感谢帮助 我用的是简单的NSURLConnection用于请求和响应 SOAP 请求 POST asmx HTTP 1 1 Hos
  • 服务器端语音识别[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道已经托管的任何好的服务器端语音识别引擎吗 IE 我希望能够调用一个简单的 Web API 来发布一些声音数据并获取文本 不一定是免费的 但希
  • 获取当前域名

    我的网站在服务器上http www myserver uk com 在此服务器上我有两个域 one com and two com 我想使用 PHP 获取当前域名 但是如果我使用 SERVER HTTP HOST 然后它向我展示 myser
  • 如何在 Rails 连接表迁移中正确索引字段?

    Rails 4 引入了生成连接表迁移的功能 bin rails generate migration CreateTeamsUsersJoinTable team user 这会产生以下文件 class CreateTeamsUsersJo
  • 使用 jQuery,如何仅查找可见元素并保留隐藏元素?

    所以我从第 1 4 项开始 div class someDiv bold italic style display none Lorem div div class someDiv regular italic style display
  • 如何对使用 perlcc 编译的 Perl 程序进行逆向工程?

    我继承了一个在 Unix 上有 编译 perl 脚本的环境 是否可以对其进行反编译 反向工程 无论术语是什么 并从编译后的目标代码中获取源代码 可能不可能 但我想我会问而不是假设 谢谢 凯文 省略已经介绍过的字节码后端 tchrist 只讨
  • CakePHP 2个单独的登录表

    我有一个 Cake 网站 它需要有两个单独的登录名 每个登录名都有自己的登录表单并看到不同的页面 最好有两个不同的表 因为两类人之间没有相似之处 每个登录表单仅由某些人使用 他们永远不会登录另一个表单 反之亦然 还有 两个登录表之间有关系
  • bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:

    我的控制器中的构造函数有一些问题 我尝试在构造函数中调用一项服务 该服务在 AbstractController 中自动装配 但我遇到了空指针异常 一个组件 Component RestController RequestMapping v
  • Java/XSLT:找不到匹配的 1 参数函数

    我收到以下错误 javax servlet ServletException Cannot find a matching 1 argument function named http exslt org dynamic evaluate
  • Spring Boot 数据源配置

    我正在尝试使用application properties文件来配置 Spring Boot 必须使用的数据源 我已将以下属性放入其中 spring datasource driverClassName org postgresql Dri
  • 如何将 URI 转换为文件 Android 10

    如何在 android 10 及以上版本中从 URI 获取文件对象或将 URI 转换为文件对象 final File file new File Environment getExternalStorageDirectory read me
  • Lucene索引从4.6版本升级到8.0.0

    我正在尝试将 Lucene 索引从 4 6 升级到 8 0 0 当我尝试使用以下方式升级工具时 java cp lucene core jar lucene backward codecs jar org apache lucene ind
  • 递归记忆化

    我试图理解memoization的Haskell实现 但我不明白它是如何工作的 memoized fib Int gt Integer memoized fib map fib 0 where fib 0 0 fib 1 1 fib n m
  • 刷新不起作用

    Why fflush 不起作用c2 and c0 如果我使用声明c0 0 and c2 0它有效 但是fflush stdin 不起作用 我尝试放在不同的地方 但它不起作用 我在 ubuntu 13 04 中使用代码块 int main v
  • 如何将 mysql_data_seek 与 PDO 一起使用?

    我想将 mysql data seek 与来自 google 搜索的 PDO 一起使用我发现它应该如下所示 row0 result gt fetch PDO FETCH ASSOC PDO FETCH ORI ABS 0 但这不起作用 我做
  • 同一 AppDomain 中的多个 WPF 应用程序

    我得到以下设置 WPF 应用程序 exe and 包含 WinForms 窗口和 WPF 窗口的 DLL WPF Application exe 从 DLL 调用 WinForms 窗口 WinForms 窗口在 DLL 中创建 WPF 窗
  • 如何将数据从DialogFragment发送到Fragment?

    我有一个片段可以打开Dialogfragment获取用户输入 字符串和整数 我如何将这两件事发送回片段 这是我的 DialogFragment public class DatePickerFragment extends DialogFr
  • 我可以将 Javascript 对象传递给 Android WebView 吗?

    我正在将 Web 应用程序迁移到 Android 版本 接收并处理 JSON 数据后 我在页面中保存了一组 Javascript 对象 如何将 javascript 对象之一的完整内容 传出 到 webview 容器以使用本机 androi