如何从android的webview的JavaScript中获得返回值?

我想从Android中的JavaScript获得返回值。 我可以用iPhone做,但是我不能用Android。 我用loadUrl,但它返回void而不是一个对象。 有谁能够帮助我? 谢谢。

这里有一个关于如何完成它的黑客攻击:

将此客户端添加到您的WebView:

final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } } 

现在在你的javascript调用做:

 webView.loadUrl("javascript:alert(functionThatReturnsSomething)"); 

现在在onJsAlert调用“消息”将包含返回的值。

Keith相同,但答案较短

 webView.addJavascriptInterface(this, "android"); webView.loadUrl("javascript:android.onData(functionThatReturnsSomething)"); 

并执行该function

 @JavascriptInterface public void onData(String value) { //.. do something with the data } 

不要忘记从proguard列表中删除onData (如果您启用了proguard)

使用addJavascriptInterface()将Java对象添加到Javascript环境。 让您的Javascript调用该Java对象的方法来提供其“返回值”。

这是我今天想到的。 它是线程安全的,合理高效的,并允许从Java的同步JavaScript执行Android WebView

适用于Android 2.2及更高版本。 (需要commons-lang,因为我需要将我的代码片段作为Javascriptstring传递给eval()。可以通过将代码不包含在引号中,而是用function(){} )来代替这个依赖项。

首先,将其添加到您的Javascript文件中:

 function evalJsForAndroid(evalJs_index, jsString) { var evalJs_result = ""; try { evalJs_result = ""+eval(jsString); } catch (e) { console.log(e); } androidInterface.processReturnValue(evalJs_index, evalJs_result); } 

然后,将其添加到您的Android活动:

 private Handler handler = new Handler(); private final AtomicInteger evalJsIndex = new AtomicInteger(0); private final Map<Integer, String> jsReturnValues = new HashMap<Integer, String>(); private final Object jsReturnValueLock = new Object(); private WebView webView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = (WebView) findViewById(R.id.webView); webView.addJavascriptInterface(new MyJavascriptInterface(this), "androidInterface"); } public String evalJs(final String js) { final int index = evalJsIndex.incrementAndGet(); handler.post(new Runnable() { public void run() { webView.loadUrl("javascript:evalJsForAndroid(" + index + ", " + "\"" + StringEscapeUtils.escapeEcmaScript(js) + "\")"); } }); return waitForJsReturnValue(index, 10000); } private String waitForJsReturnValue(int index, int waitMs) { long start = System.currentTimeMillis(); while (true) { long elapsed = System.currentTimeMillis() - start; if (elapsed > waitMs) break; synchronized (jsReturnValueLock) { String value = jsReturnValues.remove(index); if (value != null) return value; long toWait = waitMs - (System.currentTimeMillis() - start); if (toWait > 0) try { jsReturnValueLock.wait(toWait); } catch (InterruptedException e) { break; } else break; } } Log.e("MyActivity", "Giving up; waited " + (waitMs/1000) + "sec for return value " + index); return ""; } private void processJsReturnValue(int index, String value) { synchronized (jsReturnValueLock) { jsReturnValues.put(index, value); jsReturnValueLock.notifyAll(); } } private static class MyJavascriptInterface { private MyActivity activity; public MyJavascriptInterface(MyActivity activity) { this.activity = activity; } // this annotation is required in Jelly Bean and later: @JavascriptInterface public void processReturnValue(int index, String value) { activity.processJsReturnValue(index, value); } } 

@Felix Khazinbuild议的解决scheme是有效的,但是缺less一个关键点。

加载WebView的网页后,应调用JavaScript调用。 将此WebViewClientWebChromeClient一起添加到WebView

完整的例子:

 @Override public void onCreate(Bundle savedInstanceState) { ... WebView webView = (WebView) findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new MyWebViewClient()); webView.setWebChromeClient(new MyWebChromeClient()); webView.loadUrl("http://example.com"); } private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished (WebView view, String url){ view.loadUrl("javascript:alert(functionThatReturnsSomething())"); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } } private class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } } 

在API 19+上,最好的方法是在WebView上调用evaluateJavascript :

 webView.evaluateJavascript("foo.bar()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // value is the result returned by the Javascript as JSON } }); 

相关的答案更详细: https : //stackoverflow.com/a/20377857