使用 Webview 将对象从 Javascript 发送到 Kotlin

Per*_*eus 8 javascript android javascript-injection android-webview kotlin

我已经使用 WebView 组件加载了一个网页并添加了一个 JavascriptInterface。请检查下面的代码,

\n\n
val webview = WebView(this)\nsetContentView(webview)\nwebview.settings.javaScriptEnabled = true\nwebview.loadUrl(HOME_PAGE_URL)\nwebview.addJavascriptInterface(JavascriptInterface(),\xe2\x80\x9djavascript_bridge\xe2\x80\x9d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用 Javascript 调用调用时window.javascript_bridge.showToast(\xe2\x80\x9cInformation Saved\xe2\x80\x9d);

\n\n
private inner class JavascriptInterface\n{\n    @android.webkit.JavascriptInterface\n    fun showToast(text: String?)\n    {\n        Log.d("WEBVIEW", text);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以毫无问题地从 Javascript 调用该方法到 Kotlin。

\n\n

但现在我想将一个对象从 Javascript 传递到 Kotlin,如下所示,

\n\n
var info = {\n    message: \xe2\x80\x9cInformation Saved\xe2\x80\x9d,\n    ID: 123456\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用 Javascript 调用调用时window.javascript_bridge.showToast(info);

\n\n

我尝试将数据类型更改为 Any,但从 Javascript 传递的值为 null

\n\n
private inner class JavascriptInterface\n{\n    @android.webkit.JavascriptInterface\n    fun showToast(text: Any?)\n    {\n       Log.d("WEBVIEW", text.toString());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ran*_*iel 3

据我所知,javaScript接口方法只接受原始类型的数据作为参数(正如在这个问题上讨论的那样)。如果您仍然想实现这一点,您可以在 javaScript 中序列化对象(例如 JSON 格式),然后在 Java 中反序列化。希望能帮助到你 :)