【问题标题】:Callback from cwac-camera来自 cwac-camera 的回调
【发布时间】:2015-04-02 12:23:20
【问题描述】:

我正在尝试实现出色的库 cwac-camera。 我似乎无法弄清楚如何实现图片的回调以及如何设置图片的路径。

这是我的 CustomCameraFragment 公共类 CustomCameraFragment 扩展 CameraFragment { private static final String KEY_USE_FFC = "com.commonsware.cwac.camera.demo.USE_FFC";

public static CustomCameraFragment newInstance(boolean useFFC) {
    CustomCameraFragment f = new CustomCameraFragment();
    Bundle args = new Bundle();

    args.putBoolean(KEY_USE_FFC, useFFC);
    f.setArguments(args);
    return (f);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SimpleCameraHost.Builder builder =
            new SimpleCameraHost.Builder(new DemoCameraHost(getActivity()));
    builder.useFullBleedPreview(true);
    setHost(builder.build());
    //setHost(builder.useFullBleedPreview(true).build());
}

public class DemoCameraHost extends SimpleCameraHost {
    public DemoCameraHost(Context _ctxt) {
        super(_ctxt);
    }

    @Override
    public boolean useFrontFacingCamera() {
        if (getArguments() == null) {
            return (false);
        }

        return (getArguments().getBoolean(KEY_USE_FFC));
    }

    @Override
    public boolean useSingleShotMode() {
        return true;
    }

    @Override
    public void onCameraFail(CameraHost.FailureReason reason) {
        super.onCameraFail(reason);

        Toast.makeText(getActivity(),
                "Sorry, but you cannot use the camera now!",
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void saveImage(PictureTransaction xact, Bitmap bitmap) {
        super.saveImage(xact, bitmap);
    }
}

}

我在另一个片段的框架布局中使用它,但我无法弄清楚回调的正确实现。

我使用 CustomCameraFragment 的片段: 我有一个拍照按钮: @OnClick(R.id.btnTakePicture) public void takePicture(View view) {

    try {
        CustomCameraFragment.DemoCameraHost demoCameraHost = customCameraFragment.demoCameraHost;
        PictureTransaction pictureTransaction = new PictureTransaction(demoCameraHost);
        pictureTransaction.needBitmap(true);
        customCameraFragment.takePicture(pictureTransaction);

    } catch (Exception e) {
        e.printStackTrace();
    }

    showCameraPreview(false);

}

但在这个片段中我需要: - 回调以了解照片的拍摄时间 - 当回调被触发时,我需要显示位图,而不是预览 - 我需要能够设置保存图片的路径和文件名

这三件事我不清楚。

【问题讨论】:

  • 我现在正在路上,但我会在今天晚些时候为您指出文档的正确部分。
  • 好的,谢谢!现在我正在用 otto eventbus 修复回调:)

标签: android commonsware-cwac


【解决方案1】:

您必须覆盖saveImage(PictureTransaction, byte[]) 函数, 请参阅此处了解更多信息:

https://github.com/commonsguy/cwac-camera#overriding-photo-saving

【讨论】:

  • 在 DemoCameraHost 我试过:@Override public void saveImage(PictureTransaction xact, Bitmap bitmap) { Logger.d(TAG,"saveImage"); super.saveImage(xact, 位图);但是当我在我的片段上调用 ​​takePicture 时它不会被调用..
  • 那是因为我发布的链接提到:“默认情况下,将调用 saveImage(PictureTransaction, byte[]),而不是 saveImage(PictureTransaction, Bitmap)。要更改此设置,请调用 needBitmap(boolean ) 和/或 needByteArray(boolean) 在您的 PictureTransaction 上,将该 PictureTransaction 传递给 takePicture()。”
  • 确实有效,这是向前迈出的一大步。还是不太明白这个CameraFragment和parentFragment之间的通信,哪里需要回调?
  • 我不明白你的意思
【解决方案2】:

知道照片拍摄时间的回调

引用the documentation:

保存照片的默认 SimpleCameraHost 逻辑使用上面讨论的 getPhotoPath() 和相关方法。实际上保存照片是在你的 CameraHost 上调用的 saveImage(PictureTransaction, byte[]) 中完成的,其中 SimpleCameraHost 有一个 saveImage(PictureTransaction, byte[]) 实现,它将提供的 byte[] 写入所需的位置。

欢迎您覆盖 saveImage(PictureTransaction, byte[]) 并对 byte[] 执行其他操作,例如通过 Internet 发送。 saveImage(PictureTransaction, byte[]) 在后台线程上调用,因此您不必自己进行异步工作。

另一个用途是找出保存完成的时间,以便您可以使用生成的图像。只需重写 saveImage(PictureTransaction, byte[]),链接到超类实现,当它返回时,图像就可以使用了。


当回调被触发时,我需要显示位图,而不是预览

引用the documentation:

默认情况下,拍照的结果是将CameraFragment返回到预览模式,准备拍摄下一张照片。相反,如果您只需要一张图片,或者您想首先将用户发送到其他一些 UI 并且不希望立即重新启动预览,请在您的 CameraHost 中覆盖 useSingleShotMode() 以返回 true。或者,在 SimpleCameraHost.Builder 上调用 useSingleShotMode(),传入一个布尔值以默认使用。或者,在您的 PictureTransaction 上调用 useSingleShotMode() 来控制单个图片。

然后,您可能希望在 CameraHost 中使用自己的 saveImage() 实现来做任何您想做的事情,而不是重新开始预览。例如,您可以启动另一个活动来处理图像。但是,请记住,Intent 限制为 ~1MB,因此通过 Intent extra 将图像传递给另一个活动可能是不可靠的。您将需要做其他事情,例如(小心地)使用静态数据成员。

预览模式将在 CameraFragment 的 onPause()/onResume() 循环后自动重新启用,或者您可以在 CameraFragment(或 CameraView)上调用 restartPreview()。


我需要能够设置保存图片的路径和文件名

the documentation 也对此进行了介绍,篇幅足够长,我不想在这里引用它。 :-)

【讨论】:

  • 非常感谢您提供的信息!我认为我的大问题是我在父片段中使用 customCameraFragment 作为“视图”。因此,我无法获得这两个片段之间的通信(父片段如何知道 customCameraFragment 中的 saveImage()?我应该做的是使用 customCameraFragment 作为我的实际片段:)
  • @TomCB:“父片段如何知道 customCameraFragment 中的 saveImage()?” -- 自定义相机片段将调用其父级的方法。
  • 但是 CustomCameraFragment 不会是通用的?我无法将 CustomCameraFragment 视为可以在需要相机预览的任何地方使用的“视图”?
  • @TomCB:我不知道为什么您的应用程序中需要多个位置用于CustomCameraFragment。当然,图书馆并不希望您在很多地方使用大量相机片段。话虽如此,仅仅因为片段调用托管活动上的方法并不意味着片段不是“通用的”。拥有所有托管活动都需要实现的CustomCameraFragment.Contract 接口,并让片段调用该Contract 上的方法。然后片段可以由任意数量的活动托管。
  • 很好的输入,我通过找到我需要调用方法来使用我的图片的片段来修复它,这很有效。现在我正在使用你建议的界面,它就像一个魅力,更通用!当我说:“谢谢!”时,我想我是在代表整个社区发言。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多