Ошибка предварительного просмотра камеры Android - PullRequest
0 голосов
/ 15 ноября 2011

Вот мой класс CameraView:

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {
private Camera camera=null;

public CameraView(Context context, AttributeSet attrs) {
    super(context, attrs);

    SurfaceHolder holder = this.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public boolean isVisible(){
    return this.getVisibility()==View.VISIBLE;
}

public void show(){
    this.setVisibility(View.VISIBLE);
}

public void hide(){
    this.setVisibility(View.GONE);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    camera.setPreviewCallback(this);

    try {
        camera.setPreviewDisplay(holder);
    }catch (IOException e) {
        Log.e("Preview Exception", e.getMessage());
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {        
    if(camera!=null){
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera=null;
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {        
    if(camera==null || !(w>0&&h>0))
        return;

    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(w, h);

    camera.setParameters(parameters);
    camera.startPreview();
}

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

}
}

В моей деятельности у меня есть две кнопки - одна из них показывает предварительный просмотр камеры, а вторая скрывает его (с помощью CameraView.show () и CameraView.hide ()) методы.

Это работает почти нормально, за исключением одного случая: если я скрываю предварительный просмотр с помощью CameraView.hide (), нажмите кнопку HOME (приложение будет разветвлено на задний план) и снова выведу приложение на передний планбольше не запускаю предварительный просмотр.Когда я вызываю CameraView.show () (нажатием кнопки), появляется CameraView, но предварительный просмотр не запускается.

Для меня это выглядит как ошибка Android, потому что в других случаях все работает нормально - яработает андроид 2.1.

Может кто-нибудь мне помочь?Спасибо!

PS.Вот обновленный класс, согласно сообщению mmeyer (все еще не работает):

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {
private Camera camera=null;
private SurfaceHolder holder;

public CameraView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void initialize(){
    camera=Camera.open();

    holder = this.getHolder();
    holder.addCallback(this);
    holder.setSizeFromLayout();
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void release(){
    holder.removeCallback(this);

    if(camera!=null){
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera=null;
    }
}

public boolean isVisible(){
    return this.getVisibility()==View.VISIBLE;
}

public void show(){
    this.setVisibility(View.VISIBLE);
}

public void hide(){
    this.setVisibility(View.GONE);
}

public void surfaceCreated(SurfaceHolder holder) {      
}

public void surfaceDestroyed(SurfaceHolder holder) {
    if(camera!=null)
        camera.stopPreview();
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {        
    if(camera==null || !(w>0&&h>0))
        return;


    try {
        camera.setPreviewDisplay(holder);
    }catch (IOException e) {
        Log.e("Preview Exception", e.getMessage());
    }

    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(w, h);

    camera.setParameters(parameters);
    camera.startPreview();
}

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

}
}

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Я подозреваю, что вам нужно минимально отпустить камеру в onDestroy и, в идеале, в onPause, иначе драйвер камеры зависнет.

Шаблон, который я использую для предварительного просмотра камеры:

onResume:
   - get a ref to camera with Camera.open();
   - sv = (SurfaceView)this.findViewById(R.id.capture_SurfaceView);
                mHolder = sv.getHolder(); 
                mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
                mHolder.setSizeFromLayout();
                mHolder.addCallback(this); 
  surfaceChanged:
    - Camera.setPreviewDisplayHolder()
    - Camera.startPreview()
  onPause:
    - Camera.stopPreview
    - SurfaceHolder.removeCallback()
    - Camera.release()
0 голосов
/ 13 августа 2013

У меня есть рабочая версия:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "CameraPreview";

    private SurfaceHolder surfaceHolder;
    private Camera camera;

    public CameraPreview(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed

        surfaceHolder = getHolder();
        surfaceHolder.addCallback(this);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here,
        // make sure to stop the preview before resizing or reformatting it

        if (surfaceHolder.getSurface() == null){
            // Preview surface does not exist
            return;
        }

        // Stop preview before making changes
        try {
            camera.stopPreview();
        } catch (Exception e){
            // ignore: tried to stop a non-existent preview
        }

        // Set preview size and make any resize, rotate or
        // reformatting changes here

        // Start preview with new settings
        try {
            camera.setPreviewDisplay(surfaceHolder);

            // Update the camera parameters
            Camera.Parameters cameraParameters = camera.getParameters();
            cameraParameters.setPreviewSize(w, h);

            camera.setParameters(cameraParameters);
            camera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }

    public void setCamera(Camera camera) {
        this.camera = camera;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...