[英]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.