SurfaceHolder.Callback の surfaceCreated メソッドが 2 回目に呼び出されると、カメラ オブジェクトに問題があります。
アクティビティから onResume メソッドでオブジェクト カメラを作成すると、プレビュー表示が正常に表示されますが、アクティビティが一時停止すると、サーフェスビューが破棄され、カメラ オブジェクトを解放する必要があり、アクティビティが onresume android スローになると、カメラオブジェクトに nullPointerException が発生しました。
なぜこれが起こっているのかわかりません。コメントを付けてすべてのメソッドをデバッグし、何が起こるかを確認しました。明らかに、カメラ オブジェクトが null になる surfaceCreated メソッドでのみすべてが正常です。
これは私のクラスです:
public class CameraRecord implements SurfaceHolder.Callback{
public static final int BACK_CAMERA = 1;
public static final int FRONT_CAMERA = 2;
//private SurfaceView surface;
private SurfaceHolder holder;
private Camera camera;
public CameraRecord(SurfaceView surface){
// this.surface = surface;
holder = surface.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Log.e("CameraRecord","constructor");
}
public void openCamera(int wichCamera) throws Exception {
if (wichCamera == BACK_CAMERA)
camera = Camera.open();
else {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
int cameraCount = Camera.getNumberOfCameras();
for (int i = 0; i < cameraCount; i++ ) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
try {
camera = Camera.open(i);
Log.e("CameraRecord","camera is CAMERA_FACING_FRONT " + cameraInfo.toString());
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
if (camera == null)
Log.e("CameraRecord","openCamera camera is null");
else
Log.e("CameraRecord","openCamera camera is not null");
}
public void start() throws IOException {
camera.startPreview();
}
public void stop() {
camera.stopPreview();
Log.e("CameraRecord","stop camera");
}
public void release() {
camera.release();
camera = null;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.e("CameraRecord", "surfaceChanged");
try {
start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// if (holder == null)
// Log.e("CameraRecord","holder is null");
// else
// Log.e("CameraRecord","holder is not null");
try {
if (camera == null)
Log.e("CameraRecord","camera is null");
else
Log.e("CameraRecord","camera is not null");
camera.setPreviewDisplay(holder);
// start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("CameraRecord", "surfaceDestroyed");
stop();
release();
}
}