如何从Android WebView获取JavaScript返回值及输入框值到Java应用
解决Android WebView获取JavaScript返回值的问题
问题根源
你之前的代码错误是因为WebView.loadUrl()方法的返回值是void,它仅用于执行JavaScript代码,无法直接返回JS函数的结果,所以不能赋值给String类型变量。
方案一:使用evaluateJavascript()(推荐)
这是Android 4.4(API 19)及以上版本提供的异步方法,专门用于获取JavaScript执行的返回结果,安全性和效率都更高。
步骤1:启用WebView的JavaScript支持
WebView myWebView = findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
步骤2:异步获取输入框的文件名
// 替换成你的输入框实际ID String jsCode = "document.getElementById('your-input-id').value"; myWebView.evaluateJavascript(jsCode, new ValueCallback<String>() { @Override public void onReceiveValue(String result) { // JS返回的结果会被JSON序列化,需去除前后的双引号 String fileName = result.replace("\"", ""); // 这里可直接使用文件名,结合你的data URI执行下载逻辑 // 例如:解析data URI为字节流,保存文件时用该文件名命名 } });
方案二:通过JavaScriptInterface回调
适合需要更复杂交互的场景,让JavaScript主动将数据传递给Android端。
步骤1:创建JS接口类
public class WebAppInterface { private Context mContext; WebAppInterface(Context c) { mContext = c; } // API 17+必须添加@JavascriptInterface注解,否则JS无法访问该方法 @JavascriptInterface public void receiveFileName(String fileName) { // 直接获取到文件名 // 注意:此方法运行在WebView后台线程,更新UI需切换到主线程 ((Activity) mContext).runOnUiThread(() -> { // 执行下载逻辑,比如结合data URI保存文件 }); } // 可扩展方法,同时接收data URI和文件名 @JavascriptInterface public void receiveDownloadData(String dataUri, String fileName) { // 处理data URI和文件名,完成下载操作 } }
步骤2:给WebView绑定接口
myWebView.addJavascriptInterface(new WebAppInterface(this), "AndroidApp");
步骤3:在JavaScript中调用接口传递数据
// 例如用户点击下载按钮时触发 function startDownload() { var fileName = document.getElementById('your-input-id').value; var dataUri = // 你的Blob转base64的data URI逻辑 // 调用Android端接口传递文件名 AndroidApp.receiveFileName(fileName); // 或者同时传递data URI // AndroidApp.receiveDownloadData(dataUri, fileName); }
注意事项
- 使用
evaluateJavascript()时,返回的结果会被JSON格式化,字符串会被包裹双引号,需要处理后再使用。 - JavaScriptInterface的方法必须添加
@JavascriptInterface注解,避免API 17及以上版本的安全限制。 - JS回调到Android的方法默认运行在WebView后台线程,若需更新UI,必须切换到主线程(如使用
runOnUiThread)。
内容的提问来源于stack exchange,提问作者ADasGH
相关产品推荐
相关产品推荐

