Android 从cwac摄像机回调
我正在尝试实现一个很棒的库cwac摄像机。 我似乎不知道如何实现对图片的回调以及如何设置图片的路径 这是我的相机碎片 公共类CustomCameraFragment扩展了CameraFragment{ 私有静态最终字符串键\u USE\u FFC=“com.commonware.cwac.camera.demo.USE\u FFC” } 我在另一个片段的框架布局中使用它,但我无法找到回调的正确实现 我使用CustomCameraFragment的片段: 我有一个拍照按钮: @OnClick(R.id.btnTakePicture) 公共照片(视图){ 但在这个片段中,我需要: -回电话询问照片是什么时候拍的 -当启动回调时,我需要显示位图,而不是预览 -我需要能够设置保存图片的路径和文件名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.
这三件事我不清楚。您必须重写
保存图像(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);
}