真的与Android中的setPreviewCallback混淆,需要建议

时间:2012-07-18 15:27:13

标签: android android-layout android-activity android-camera surfaceview

我正在Android上构建一个应用程序来从相机中取出帧,处理它们,然后在surfaceView上显示帧,以及通过画布和drawbitmap以及所有这些在SurfaceView上绘图。

只是要检查一下,SurfaceView和Bitmaps以及Canvases是最好的方法吗?我速度快了。

假设上述答案是肯定的,问题是:我应该在哪里放置以下功能

camera_object.setPreviewCallback(new PreviewCallback()
     public void onPreviewFrame(byte[] data, Camera camera){

我应该将它放在onCreate()中还是应该将它放在surfaceCreated()或surfaceChanged()中?

我将mainactivity类声明如下:

public class MainActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback
{

在那个类中,Eclipse强制我在MainActivity类中为onpreviewframe创建一个覆盖函数,如下所示

public void onPreviewFrame(byte[] data, Camera camera){
}

但它永远不会被调用。我应该尝试使用此功能吗?使用它更好吗?或者它只是一个Eclipse的东西?

请告知

2 个答案:

答案 0 :(得分:7)

您是否从应用中调用了setPreviewDisplay()startPreview()setPreviewCallback(this)?没有它,你将无法调用onPreviewFrame()。实际上,如果您使用的是SurfaceView,则回调预览缓冲区是屏幕上显示的实际缓冲区的副本。因此,如果要显示这些复制的缓冲区,则需要创建一个新视图并覆盖它。这将是低效的。我建议您使用SurfaceTexture代替并使用'onFrameAvailable'回调来获取帧然后绘制&手动显示。可以在默认Android Camera App的PanoramaActivity代码中找到此示例。

答案 1 :(得分:1)

没有camera_object.setPreviewDisplay(surface_holder);你就无法收到相机回调;别忘了

surface_view.setVisibility(View.VISIBLE);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

您可以在其他视图下隐藏相机预览;在3.0及更高版本中,您甚至可以将表面推出屏幕(将其显示在屏幕底部下方)。我不确定后一种技巧是否适用于2.3.6。