簡體   English   中英

帶有SurfaceView的Android相機預覽

[英]Android camera preview with surfaceview

我正在嘗試在相機預覽上繪制一些內容。 但是,當程序調用startPreview方法時,它將拋出以下異常:java.lang.RuntimeException:startPreview失敗。

我的代碼:

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();
}
}

我應該怎么做?

您不能確保surfaceChanged()僅被調用一次。 所以camera.startPreview(); 也可以在那里打幾次。 這是不對的。

Android的相機的訂購非常具體。 請參閱此處 ,並逐步進行操作。 我親自跟蹤其開始/停止狀態。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM