在Android开发中,WebView是一个可以嵌入网页视图的组件,它允许应用显示网页内容。有时我们需要在Android原生代码和WebView中的JavaScript代码之间进行交互,特别是获取JavaScript执行后的返回值。
evaluateJavascript
方法(API 19+推荐)这是Android 4.4(API 19)及以上版本推荐的方法,异步执行JavaScript并获取返回值。
webView.evaluateJavascript("javascript:yourFunction()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
// 这里处理返回的值
Log.d("JS返回值", value);
}
});
addJavascriptInterface
结合回调对于更复杂的交互场景,可以设置一个JavaScript接口:
// 定义接口类
public class WebAppInterface {
private Context mContext;
private ValueCallback<String> mCallback;
WebAppInterface(Context c, ValueCallback<String> callback) {
mContext = c;
mCallback = callback;
}
@JavascriptInterface
public void returnResult(String result) {
mCallback.onReceiveValue(result);
}
}
// 设置接口
webView.addJavascriptInterface(new WebAppInterface(this, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
// 处理返回值
}
}), "Android");
// 在JavaScript中调用
// window.Android.returnResult(yourValue);
shouldOverrideUrlLoading
拦截URL(传统方法)webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("js://")) {
// 解析URL获取返回值
String result = url.substring(5);
// 处理返回值
return true; // 表示已处理
}
return false;
}
});
// 在JavaScript中调用
// window.location = "js://" + yourValue;
runOnUiThread
@JavascriptInterface
注解的方法才能被JavaScript调用evaluateJavascript
需要API 19+// 在Activity中
webView.getSettings().setJavaScriptEnabled(true);
// 方法1: evaluateJavascript
webView.evaluateJavascript("(function() { return 'Hello from JS'; })();",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("JS Return", s); // 输出: "Hello from JS"
}
});
// 方法2: JavascriptInterface
webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void sendResult(String result) {
runOnUiThread(() -> {
Toast.makeText(MainActivity.this, "JS返回: " + result, Toast.LENGTH_SHORT).show();
});
}
}, "AndroidBridge");
// 加载HTML或执行JS
webView.loadUrl("javascript:window.AndroidBridge.sendResult(document.title)");
问题1:返回值是null或未调用回调
问题2:安全警告
@JavascriptInterface
注解问题3:复杂对象传递
这些方法可以满足大多数从WebView获取JavaScript返回值的需求,根据具体场景选择最适合的方案。