Android 第二次执行surfaceCreated方法时,摄影机为空
当第二次调用SurfaceHolder.Callback的surfaceCreated方法时,我发现camera对象有问题,我的意思是: 我在onResume方法中根据我的活动创建了一个对象摄影机,它可以很好地显示预览显示,但是当我的活动暂停时,surfaceview被破坏,我必须释放摄影机对象,然后如果我的活动进入onResume,android会在我的摄影机对象中抛出一个nullPointerException 我不知道为什么会发生这种情况,我在调试每个方法时都添加了注释,看看会发生什么,很明显,只有在surfaceCreated方法中,摄影机对象变为null,一切都很好 这是我的班级:Android 第二次执行surfaceCreated方法时,摄影机为空,android,camera,nullpointerexception,surfaceview,Android,Camera,Nullpointerexception,Surfaceview,当第二次调用SurfaceHolder.Callback的surfaceCreated方法时,我发现camera对象有问题,我的意思是: 我在onResume方法中根据我的活动创建了一个对象摄影机,它可以很好地显示预览显示,但是当我的活动暂停时,surfaceview被破坏,我必须释放摄影机对象,然后如果我的活动进入onResume,android会在我的摄影机对象中抛出一个nullPointerException 我不知道为什么会发生这种情况,我在调试每个方法时都添加了注释,看看会发生什么,很
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();
}
公共类CameraRecord实现SurfaceHolder.Callback{
公共静态最终int BACK_摄像机=1;
公共静态最终int前摄像头=2;
//私人表面查看表面;
私人土地持有人;
私人摄像机;
公共摄像记录(SurfaceView surface){
//这个表面=表面;
holder=surface.getHolder();
holder.addCallback(本);
夹持器。设置类型(表面夹持器。表面夹持器类型推压缓冲);
Log.e(“CameraRecord”、“constructor”);
}
public void openCamera(int wichCamera)引发异常{
如果(wichCamera==后摄像头)
camera=camera.open();
否则{
Camera.CameraInfo CameraInfo=新的Camera.CameraInfo();
int cameraCount=Camera.getNumberOfCameras();
对于(int i=0;i}我遇到了这样的问题,在AndroidManifest.xml中添加这3行之后,我的应用程序工作了
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
也许它会帮助你:)我也有同样的问题。我解决这个问题的方法是在释放相机的同时(在onPause()方法上)在我的SurfaceHolder中调用removeCallbak()方法。我想在你的例子中
holder.removeCallback(this);
其思想是,不仅可以在活动的onPause()方法上释放摄影机,还可以删除SurfaceHolder上的回调集。如果不这样做,错误将第二次出现,因为回调是针对您关联的第一个实例而不是第二个实例进行的。如果同时在onPause()上删除回调,则不会出现任何问题
public void release() {
camera.release();
camera = null;
}
这应该是:
public void release() {
if(camera!=null) camera.release();
camera = null;
}
可能是《谢谢你》,mmeyer,但我的问题是MediaRecorder,而不是SurfaceView。我在准备MediaRecorder对象时出错。