You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:47:55