5

我正在尝试创建一个访问 Android 相机的应用程序,获取帧(图像),对其进行处理,然后重新启动该过程,同时在屏幕上提供流畅的预览。

我通过调用来获取一个帧camera.setOneShotPreviewCallback(...),处理在我的回调中接收到的数据,然后setOneShotPreviewCallback再次调用来做到这一点。

问题是,我无法通过放入setOneShotPreviewCallback主要活动的onResume()功能来启动该过程。如果我这样做,我的回调永远不会被调用。

请看以下测试代码:

public void onResume() {
    super.onResume();
    camera = getCameraInstance();

    cameraPreviewSurface = new CameraPreview(this, camera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.removeAllViews();
    preview.addView(cameraPreviewSurface);
    camera.setOneShotPreviewCallback(cameraPreviewCallback);

    Button button = (Button) findViewById(R.id.button_capture);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            camera.setOneShotPreviewCallback(cameraPreviewCallback);
        }
    });
}

当应用程序启动时,永远不会调用回调,但只要按下按钮,我就会收到回调。

我曾尝试setOneShotPreviewCallback在我的CameraPreview课堂上使用 after camera.startPreview();,但我的方法仍然没有被调用。

4

1 回答 1

4

我发现了问题。由于某种原因,必须在初始化预览表面后设置回调。

就我而言,由于我使用的是自定义 SurfaceView,因此我必须在 surfaceCreatedsurfaceChanged函数中应用回调。

camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
camera.setOneShotPreviewCallback(cameraPreviewCallback);
于 2013-04-15T11:07:45.137 回答