![](/img/trans.png)
[英]How to handle javascript events from a native android application?
[英]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.