Android 从cwac摄像机回调

Android 从cwac摄像机回调,android,commonsware-cwac,Android,Commonsware Cwac,我正在尝试实现一个很棒的库cwac摄像机。 我似乎不知道如何实现对图片的回调以及如何设置图片的路径 这是我的相机碎片 公共类CustomCameraFragment扩展了CameraFragment{ 私有静态最终字符串键\u USE\u FFC=“com.commonware.cwac.camera.demo.USE\u FFC” } 我在另一个片段的框架布局中使用它,但我无法找到回调的正确实现 我使用CustomCameraFragment的片段: 我有一个拍照按钮: @OnClick(R.

我正在尝试实现一个很棒的库cwac摄像机。 我似乎不知道如何实现对图片的回调以及如何设置图片的路径

这是我的相机碎片 公共类CustomCameraFragment扩展了CameraFragment{ 私有静态最终字符串键\u USE\u FFC=“com.commonware.cwac.camera.demo.USE\u FFC”

}

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

我使用CustomCameraFragment的片段: 我有一个拍照按钮: @OnClick(R.id.btnTakePicture) 公共照片(视图){

但在这个片段中,我需要: -回电话询问照片是什么时候拍的 -当启动回调时,我需要显示位图,而不是预览 -我需要能够设置保存图片的路径和文件名


这三件事我不清楚。

您必须重写
保存图像(PictureTransaction,byte[])
函数, 有关更多信息,请参见此处:

回电话询问照片是什么时候拍的

引述:

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

欢迎您重写saveImage(PictureTransaction,字节[]),并使用字节[]执行其他操作,例如通过Internet发送。saveImage(PictureTransaction,字节[])是在后台线程上调用的,因此您不必执行自己的异步工作

另一个用途是找出保存完成的时间,以便使用生成的映像。只需覆盖saveImage(PictureTransaction,byte[]),链接到超类实现,当返回时,映像即可使用


当启动回调时,我需要显示位图,而不是预览

引述:

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

然后,您可能需要使用自己的saveImage()在您的CameraHost中实现,以执行您想执行的任何操作,而不是重新启动预览。例如,您可以启动另一个活动来对图像执行某些操作。但是,请记住,意图限制为~1MB,因此通过意图附加将图像传递给另一个活动可能不可靠。您需要执行某些操作否则,例如(小心地)使用静态数据成员

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


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


这也包含在中,足够长,我不想在这里引用它。:-

在DemoCameraHost中,我尝试:@Override public void saveImage(PictureTransaction xact,Bitmap Bitmap){Logger.d(TAG,“saveImage”);super.saveImage(xact,Bitmap);}但是当我调用片段上的takePicture时,它没有被调用。这是因为我发布的链接提到:“默认情况下,将调用saveImage(PictureTransaction,byte[]),而不是saveImage(PictureTransaction,Bitmap)。要更改此设置,请调用needBitmap(布尔)和/或needByteArray(布尔)在PictureTransaction上,将该PictureTransaction传递给takePicture()这确实有效,这是向前迈出的一大步。但我还是不太明白这个摄影机片段和父片段之间的通信,我需要一个回调?我不明白你的意思,我现在正在路上,但我会在今天晚些时候给你指出文档的正确部分。好吧,谢谢!因为现在我正在修复它otto eventbus的e回调:)非常感谢您提供的信息!我想我最大的问题是我在父片段中使用customCameraFragment作为“视图”。因此,我无法获得这两个片段之间的通信(父片段如何知道saveImage()在customCameraFragment中?我应该做的是使用customCameraFragment作为我的实际片段:)@TomCB:“父片段如何知道customCameraFragment中的saveImage()--自定义摄影机片段将调用其父对象上的方法。但是CustomCameraFragment将不是泛型的?我无法将CustomCameraFragment视为“视图”我可以在任何需要相机预览的地方使用吗?@TomCB:我不知道为什么你的应用程序中需要多个点来制作
CustomCameraFragment
。当然,图书馆并不希望你在很多地方使用大量相机片段。也就是说,仅仅因为片段调用宿主activit上的一个方法y并不意味着片段不是“通用的”。有一个
CustomCameraFragment.Contract
接口,所有托管活动都需要实现该接口,并让片段调用该
Contract
上的一个方法。然后,该片段可以由任意数量的活动托管。输入非常好,我通过在需要调用该方法以使用我的图片的位置找到了我的片段,这很有效.现在,我正在使用你建议的界面,它就像一个符咒,更通用!我想我是sp
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);
    }
}
    try {
        CustomCameraFragment.DemoCameraHost demoCameraHost = customCameraFragment.demoCameraHost;
        PictureTransaction pictureTransaction = new PictureTransaction(demoCameraHost);
        pictureTransaction.needBitmap(true);
        customCameraFragment.takePicture(pictureTransaction);

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

    showCameraPreview(false);

}