[英]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. 这是不对的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.