【问题标题】:Pass variable from plugin back to cordova将变量从插件传递回cordova
【发布时间】:2017-06-10 10:14:03
【问题描述】:

我正在使用的Cordova plugin 播放VR 视频文件,并通过GoogleVRPlayer.playVideo(videoUrl, fallbackVideoUrl) 调用。

插件的 .java 文件中的某处,有:

@Override
public void onLoadError(String errorMessage) {
  // I want to know if this function is executed
  Log.e(TAG, "Error loading video: " + errorMessage);
}

基本上,当视频加载失败时,我想在我的科尔多瓦 javascript 中将一个变量设置为“错误”,例如 var video_status = "error",以便稍后在我的应用中使用此信息。

我找到了一些可能解决我的问题的答案,但我似乎无法以正确的方式整合它。我对原生插件和 Java 的经验很少。

谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript android cordova ionic-framework cordova-plugins


    【解决方案1】:

    由于 Cordova 插件 GoogleVRPlayer 启动了一个新 Activity (VrVideoActivity),我将使用 Singleton 类作为两个 Activity 之间的插页式数据桥来保存错误消息。 这是因为,在启动视频播放器活动时,您的应用程序(Cordova 活动)会在后台暂停,并且只有在视频播放器活动关闭后才会恢复执行。 通过使用中间类,Cordova 插件和视频活动都能够共享数据。

    所以我会这样做:

    cordova-vr-player/src/android/java/neotrino/中创建一个名为CordovaBridge.java的新文件

    package com.neotrino;
    
    public class CordovaBridge {
      private String errorMsg = null;
      public String getErrorMsg() {return errorMsg;}
      public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}
    
      private static final CordovaBridge holder = new CordovaBridge();
      public static CordovaBridge getInstance() {return holder;}
    }
    

    修改GoogleVRPlayer.java如下:

    import com.neotrino.CordovaBridge;
    
    @Override
    public void onResume(boolean multitasking) {
        cordova.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String errorMsg = CordovaBridge.getInstance().getErrorMsg();
                if(errorMsg != null){
                  webView.loadUrl("javascript:window.video_status = '"+errorMsg+"'");
                }
            }
      });
    }
    

    修改VrVideoActivity.java如下:

    import com.neotrino.CordovaBridge;
    
    @Override
    public void onLoadError(String errorMessage) {
      // I want to know if this function is executed
      Log.e(TAG, "Error loading video: " + errorMessage);
      CordovaBridge.getInstance().setErrorMsg(errorMessage);
    }
    

    我没有测试上面的代码,但就方法而言,它应该为您提供一个近似值,作为您的解决方案的基础。

    【讨论】:

    • 感谢您的建议。尝试构建项目时出现以下错误:error: cannot find symbol webView.loadUrl("javascript:window.video_status = 'error'"); symbol: variable webViewerror: cannot find symbol cordova.getActivity().runOnUiThread(new Runnable() { symbol: variable cordova
    • 我最初的解决方案假定插件在 Cordova 活动中执行 - 查看了插件的源代码后,它实际上使用了一个单独的活动,这使您将错误消息传达回 Cordova 的方式变得复杂应用程序。我已经相应地更新了我的答案。
    • 感谢您的编辑!我现在遇到构建错误:cannot find symbol import com.neotrino.CordovaBridge; ^ symbol: class CordovaBridge 用于两个 .java 文件...
    • 您需要将 CordovaBridge.java 作为源文件注入到 plugin.xml 中。请注意,这不是插件的简单编辑。
    • 我明白了。可能是为什么我很难弄清楚这一点。在 plugin.xml 中注入源文件后新的构建错误:error: cannot find symbol CordovaInterface cordova = CordovaBridge.getInstance().setErrorMsg(errorMessage); ^ symbol: class CordovaInterface location: class VrVideoActivity.ActivityEventListener
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2022-12-22
    • 2021-11-10
    相关资源
    最近更新 更多