繁体   English   中英

如何从本机 android 应用程序监听 javascript 事件?

[英]How to listen for javascript events from a native android application?

我有一个本机 Android 应用程序,它有一个 webView 加载一个我无法控制的 web 页面。

在应用程序中,我需要跟踪/检测在 webView 中单击此页面上的按钮时发生的“MessageEvent”。

场景:用户按下 webView 中的一个按钮,它触发了一个“MessageEvent”,当检测到这个“MessageEvent”时,需要调用 Java/Kotlin 代码中的一个方法,通过一个等待这个“MessageEvent”的监听器或者另一种方式(与调用方法无关)。

我主要关心的是如何在我的 Java/Kotlin 代码中检测到这个 javascript “MessageEvent” 事件。

这里的答案取决于你为什么想要它。 一种方法是在触发事件时更新数据库中的字段,并且您需要在 java 代码中进行循环检查,以询问同一数据库是否触发了事件...
此外,您无法直接访问该信息。 Witch 非常善于为用户提供安全保护……假设您将用户带到他的 PayPal 帐户,他会看到一个功能完美的 PayPal web 页面,其中包含所有购买,如果您的 android 应用程序可以访问他网站中的脚本。 我想我们都知道会发生什么。

我找到了似乎有效的解决方案,它发布在另一个答案上:

使用我们的 webview 实现。 我们实现了 onPageFinished 方法以注入我们的 JS 代码来加载 web:

override fun onPageFinished(url: String?) {
webview.loadUrl(
"javascript:(function() {" +
    "window.parent.addEventListener ('message', function(event) {" +
    " Android.receiveMessage(JSON.stringify(event.data));});" +
    "})()"
)
}

我们正在做的是创建一个监听器,将这些消息发送到我们自己的 JS 和 Android Bridge 接口。 我们之前在 Android 活动的 webview 设置中创建了它,就像我们通常使用 addJavascriptInterface 所做的那样。

webview.addJavascriptInterface(JsObject(presenter), "Android”)

这样,我们已经有了那个通信桥,postMessage 发送的所有消息都将在订阅该侦听器的那个接口中到达我们。

class JsObject(val presenter: Presenter) {
    @JavascriptInterface
    fun receiveMessage(data: String): Boolean {
        presenter.onDataReceived(data)
        Log.d("Data from JS", data)
        return true
    }

原答案: https://stackoverflow.com/a/62500309/7849477

希望它能帮助别人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM