如何调用JavaScript函数并获取JavaScript函数的返回值

8
我想从我的JS函数中获取值,并在我的Java Android应用程序中使用。
示例:
function getStringToMyAndroid(stringFromAndroid){
   var myJsString = "Hello World" + ;
   return myJsString;
}

现在我想调用函数 getStringToMyAndroid("This string from android") 并获取返回的 myJsString 在我的安卓手机上,这样我就可以在我的安卓手机上后续使用 myJsString
我知道我可以使用
WebView.loadUrl("javascript:getStringToMyAndroid('This string from android')")

我想调用JS函数,但我想从JS函数中获取字符串或值

注意:我的Android最低运行SDK为Android 3.0蜂巢


你的目标是哪个版本的Android? - CodingIntrigue
嗨 @RGraham,我使用的最低Android目标API是11 Android 3.0 Honeycomb,谢谢 :) - ilovebali
1个回答

16

对于 API Level < 19,只有两种解决方法可供选择:使用 JavaScriptInterface(以下是我推荐的方式)或劫持 OnJsAlert 方法并改用 alert() 对话框。这意味着您不能将 alert() 函数用于其预定用途。

视图:

WebView.addJavascriptInterface(new JsInterface(), "AndroidApp");
WebView.loadUrl("javascript:doStringToMyAndroid('This string from android')")

JsInterface:

public class JsInterface() {
    @JavascriptInterface
    void receiveString(String value) {
        // String received from WebView
        Log.d("MyApp", value);
    }
}

Javascript:

function doStringToMyAndroid(stringFromAndroid){
   var myJsString = "Hello World" + ;
   // Call the JavascriptInterface instead of returning the value
   window.AndroidApp.receiveString(myJsString);
}

但是在API Level 19及以上版本中,我们现在有了evaluateJavascript方法:

WebView.evaluateJavascript("(function() { return getStringToMyAndroid('" + myJsString + "'); })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Returns the value from the function
    }
});

嗨,感谢您的代码和解释,我有一个问题是 doStringToMyAndroid 是来自 JS 的函数吗?WebView.loadUrl("doStringToMyAndroid('This string from android')"),谢谢,我现在会尝试 :) - ilovebali
我尝试了你的代码,但还没有成功:(,我也尝试使用最后一份让我的应用程序崩溃的代码:),我的做法是从JsInterface创建了一个新的java类,并从我的webView中调用它 WebView.addJavascriptInterface(new JsInterface(), "AndroidApp"); WebView.loadUrl("javascript:doStringToMyAndroid('This string from android')"),需要建议,谢谢 :) - ilovebali
在你的类 public class JsInterface() { @JavascriptInterface void receiveString(String value) { // String received from WebView Log.d("MyApp", value); } } 中,类名后面有 **"()"**,而我把它删除了,因为我得到了 Error:(9, 25) error: '{' expected 错误。然后我从类名中删除了 **"()"**,虽然没有错误,但代码不起作用,谢谢 :) - ilovebali
现在代码完美地运行了,是我的错,我放置了错误的webView,因此代码无法获取正确的webView,感谢您的帮助:D - ilovebali
@RGraham,我在AVD中使用API 16,所以我使用了您针对API级别<19的答案。在我的LogCat中,没有像JSInterface类中那样打印消息[Log.d("MyApp", value);].. 我需要做些什么吗? - user5520878
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接