通过@JavascriptInterface将字符串从Android传递给WebView中的JS

Posted

技术标签:

【中文标题】通过@JavascriptInterface将字符串从Android传递给WebView中的JS【英文标题】:Passing a string from Android to JS in a WebView via @JavascriptInterface 【发布时间】:2021-11-25 10:22:19 【问题描述】:

这是我的 javascript 界面:

class WebAppInterface(val context: Context)

    @JavascriptInterface
    fun provideAString():String
        println("executed from js")
        println("this is text")
        return "this is text"
    

    @JavascriptInterface
    fun printTheString(s:String)
        println(s)
    

这是我将它添加到 WebView 的方法:

webView.addJavascriptInterface(WebAppInterface(this), "android")

这是我从 JS 调用这两个函数的方式:

function StringFromAndroid()
    var string=Android.provideAString();


...
...

var currentString=new StringFromAndroid();
Android.printTheString(currentString.string);

这里是打印行:

I/System.out: executed from js  
I/System.out: this is text
I/System.out: undefined

预期行为:

打印第 1 行和第 2 行表明 provideAString() 正在从 JS 中正确调用。打印第 3 行显示 printTheString(s) 正在从 JS 中正确调用,但 WebView 中 currentString.string 的值是“未定义”。预期的行为是,当var currentString=new StringFromAndroid(); 强制通过var string=Android.provideAString(); 行调用Android.provideAString(); 时,该调用将返回字符串“这是文本”并将var string 设置为具有该值,因此currentString.string将是“这是文本”而不​​是“未定义”。

【问题讨论】:

【参考方案1】:

Android.provideAString();的值赋值给this

function StringFromAndroid() 
    this.string = Android.provideAString();

【讨论】:

非常感谢。我每隔几个月才使用一次 js,所以我总是必须重新学习属性在“类”中的工作方式。无论如何我都会留下这个问题。 ...基于标题是准确的,我的模板以及您的答案为搜索者提供了足够的材料来实施这种工作流程。

以上是关于通过@JavascriptInterface将字符串从Android传递给WebView中的JS的主要内容,如果未能解决你的问题,请参考以下文章

Android JavascriptInterface 解决api 17以下漏洞

Android ProGuard加密webview的JavascriptInterface注解annotation的问题

跨平台实现基础JavascriptInterface原理和Js和Java交互实践

如何使用addJavaScriptInterface

腾讯X5内核 语法不兼容问题

H5调用Android拨打电话