Cordova插件Java代码调用JavaScript函数失败求助
解决Cordova插件中调用自定义JavaScript函数的问题
我看了你的代码,问题核心出在你新建了一个独立的WebView实例,而不是使用Cordova插件已经关联的当前应用WebView。
为什么alert能生效,但自定义函数不行?
当你new WebView(context)时,这个新WebView是完全空白的,根本没有加载你的应用页面,自然也不存在sendVoice函数。而alert是浏览器内置API,不管WebView有没有加载页面都能执行,所以你看到alert生效了,但自定义函数找不到。
正确的解决步骤
1. 确保JavaScript函数在全局作用域
先修改你的Sample.js,把sendVoice挂载到window对象上,这样Cordova的WebView才能全局访问到它:
window.sendVoice = function() { try { ApiAIPlugin.requestVoice( {}, // 可选参数留空 function (response) { alert(JSON.stringify(response)); }, function (error) { alert(error); }); } catch (e) { alert(e); } }
2. 修改Java插件代码,使用自带的WebView
更新callJavaScriptFunction方法,去掉新建WebView的代码,改用CordovaPlugin自带的webView成员变量,同时确保所有WebView操作在UI线程执行:
private void callJavaScriptFunction(){ cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { // 调用全局的sendVoice函数 webView.loadUrl("javascript:sendVoice();"); // 如果你的应用目标是Android 4.4+,更推荐用evaluateJavascript(支持获取返回值) // webView.evaluateJavascript("sendVoice();", new ValueCallback<String>() { // @Override // public void onReceiveValue(String value) { // // 这里可以处理JS函数返回的结果 // } // }); } }); }
3. 修正execute方法中的调用
你在execute方法里直接调用this.webView.loadUrl(...),这可能不在UI线程,所以最好把这部分也移到runOnUiThread块中:
@Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("coolMethod")) { String message = args.getString(0); this.coolMethod(message, callbackContext); context = this.cordova.getActivity(); ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { createFlotingActionButton(); // 移到UI线程里调用JS函数 webView.loadUrl("javascript:sendVoice();"); } }); return true; } return false; }
额外检查点
- 确认
Sample.js已经正确在index.html中引用,确保函数已加载到应用页面 - 如果使用较新版本的Cordova,优先使用
evaluateJavascript替代loadUrl,这是更规范的JS交互方式
内容的提问来源于stack exchange,提问作者Bahu
相关产品推荐
相关产品推荐

