简体   繁体   English

带有SurfaceView的Android相机预览

[英]Android camera preview with surfaceview

I'm trying to draw something on the camera preview. 我正在尝试在相机预览上绘制一些内容。 But when the program call the startPreview method, it throws this exeption: java.lang.RuntimeException: startPreview failed. 但是,当程序调用startPreview方法时,它将抛出以下异常:java.lang.RuntimeException:startPreview失败。

My code: 我的代码:

public class ScanView extends SurfaceView implements SurfaceHolder.Callback {

private MySurfaceThread thread;

Camera camera;

Context context;

private boolean inPreview = false;

public class MySurfaceThread extends Thread {

    private SurfaceHolder myThreadSurfaceHolder;
    private ScanView myThreadSurfaceView;
    private boolean myThreadRun = false;

    public MySurfaceThread(SurfaceHolder surfaceHolder, ScanView surfaceView) {
        myThreadSurfaceHolder = surfaceHolder;
        myThreadSurfaceView = surfaceView;
    }

    public void setRunning(boolean b) {
        myThreadRun = b;
    }

    @Override
    public void run() {

        while (myThreadRun) {
            Canvas c = null;
            try {
                c = myThreadSurfaceHolder.lockCanvas(null);
                synchronized (myThreadSurfaceHolder) {

                    myThreadSurfaceView.onDraw(c);
                }
            } finally {
                if (c != null) {
                    myThreadSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

@Override
protected void onDraw(Canvas canvas) {

}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return true;
}

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

    this.context = context;
    init();
}

private void init() {
    getHolder().addCallback(this);
    thread = new MySurfaceThread(getHolder(), this);


    setFocusable(true); // make sure we get key events

}

public void surfaceChanged(SurfaceHolder arg0, int format, int width, int height) {

    ((Activity)context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    this.

    camera.setDisplayOrientation(90);
    camera.startPreview();
    inPreview = true;
}

public void surfaceCreated(SurfaceHolder arg0) {
    thread.setRunning(true);
    thread.start();

    try {
        camera.setPreviewDisplay(this.getHolder());
    } catch (Throwable t) {
    }
}

public void surfaceDestroyed(SurfaceHolder arg0) {

    boolean retry = true;
    thread.setRunning(false);
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}

public void onPause() {
    if (inPreview) {
        camera.stopPreview();
    }

    camera.release();
    camera = null;
    inPreview = false;

}

public void onResume() {
    camera = Camera.open();
}
}

How should i do this? 我应该怎么做?

You can't be sure that surfaceChanged() is called only once. 您不能确保surfaceChanged()仅被调用一次。 So camera.startPreview(); 所以camera.startPreview(); also can be called few times there. 也可以在那里打几次。 It is not right. 这是不对的。

Android's Camera is very specific in its ordering. Android的相机的订购非常具体。 See here and follow it step by step. 请参阅此处 ,并逐步进行操作。 I personally track of its start/stop state. 我亲自跟踪其开始/停止状态。

if (_previewRunning) camera.stopPreview();
[...]
camera.startPreview();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM