【问题标题】:sendPluginResult() not working in onActivityResult() - CordovasendPluginResult() 在 onActivityResult() 中不起作用 - Cordova
【发布时间】:2016-01-11 09:31:15
【问题描述】:

我是科尔多瓦的新手。我正在为 PhoneGap 的 Android 中的视频捕获创建自定义插件。在我的 onActivityResult() 中,我正在获取捕获的视频。我在 onActivityResult() 中添加了一个回调,但它不起作用。

这是我的代码:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        final Mediatest that = this;
        // TODO Auto-generated method stub
        if (resultCode == cordova.getActivity().RESULT_OK) {
            if (requestCode == REQUEST_VIDEO_CAPTURED) {
                uriVideo = data.getData();
                Toast.makeText(cordova.getActivity().getApplicationContext(),
                        uriVideo.getPath(), Toast.LENGTH_LONG).show();
                 that.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0));


            }
        } else if (resultCode == cordova.getActivity().RESULT_CANCELED) {
            uriVideo = null;
            Toast.makeText(cordova.getActivity().getApplicationContext(),
                    "Cancelled!", Toast.LENGTH_LONG).show();
        }
    }

但是当我在 onActivityResult 之外添加回调方法时,它正在工作:

private void captureVideo(Long limit) {
        this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0));
        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, limit);
        cordova.setActivityResultCallback (this);
        this.cordova.startActivityForResult((CordovaPlugin) this, intent, REQUEST_VIDEO_CAPTURED);
        this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0));

    }

吐司

Toast.makeText(cordova.getActivity().getApplicationContext(),
                        uriVideo.getPath(), Toast.LENGTH_LONG).show();

正在显示,但回调不起作用。我无法追踪问题。任何帮助将不胜感激。

【问题讨论】:

标签: android cordova plugins


【解决方案1】:

调用插件时,先发送一个带有NO_RESULT的插件结果,并将KeepCallback设置为true

private void captureVideo(Long limit) {

    Intent intent = new Intent(
                android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, limit);
    cordova.setActivityResultCallback (this);
    this.cordova.startActivityForResult((CordovaPlugin) this, intent, REQUEST_VIDEO_CAPTURED);

    //Send a plugin result with NO_RESULT and set KeepCallback as true
    PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
    r.setKeepCallback(true);
    callbackContext.sendPluginResult(r);

}    

那么你应该可以从onActivityResult()调用sendPluginResult()

【讨论】:

  • 为什么?这对我来说毫无意义,为什么会这样,它是如此反直觉,我一直无法找到支持这一点的文档,但我在我尝试调试的其他插件中看到它,这些插件由于不相关的原因而失败,而且非常令人困惑。
  • 每个插件调用都有一个id,该id用于调用插件回调,如果你不设置keepCallback为true,回调id会丢失,之后你不能发送结果。
  • 好的,我想我明白了。我有一种错误的印象,即每次调用插件只能得到一个结果。但似乎该模型支持一个请求,该请求可以发出多个带有各种报告状态和数据的回调。因此,发回一个“NO_RESULT”绝不意味着该实例已完成?非常感谢您抽出时间帮助澄清。
  • 如果使用r.setKeepCallback(true);则实例不完整,如果使用r.setKeepCallback(false);(或不设置为默认值)则实例完整。发送 OK、ERROR 或 NO_RESULT 状态值无关紧要,状态的类型将决定执行哪个回调或不执行任何回调(OK-> 成功,ERROR -> 失败,NO_RESULT -> 无回调)
猜你喜欢
  • 2012-06-02
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2012-08-29
  • 2015-02-01
相关资源
最近更新 更多