最近,我制作了一个自定义相机应用程序用于测试目的,我遇到了一个看似简单的小问题,但我很难解决。 问题是,当我点击按钮拍摄快照时,相机会在第一次拍摄时成功拍摄照片,但是,当我第二次点按该按钮时,相机根本没有响应(不是&#39) ;崩溃,但无法拍摄照片) 我已经在下面设置了示例代码,我想知道我实现的某些代码是否存在一些结构性错误,或者我是否只是在做一个偏离主题的菜鸟。
preview = new Preview(this,
(SurfaceView) findViewById(R.id.CameraFragment));
FrameLayout frame = (FrameLayout) findViewById(R.id.preview);
frame.addView(preview);
preview.setKeepScreenOn(true);
fotoButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
//take the picture
takeFocusedPicture();
} catch (Exception e) {
}
// exitButton.setClickable(false);
fotoButton.setClickable(false);
// progressLayout.setVisibility(View.VISIBLE);
}
});
}
@Override
protected void onResume() {
super.onResume();
// TODO Auto-generated method stub
if (camera == null) {
camera = Camera.open();
camera.startPreview();
camera.setErrorCallback(new ErrorCallback() {
public void onError(int error, Camera mcamera) {
camera.release();
camera = Camera.open();
Log.d("Camera died", "error camera");
}
});
}
if (camera != null) {
if (Build.VERSION.SDK_INT >= 14)
setCameraDisplayOrientation(context,
CameraInfo.CAMERA_FACING_BACK, camera);
preview.setCamera(camera);
}
}
//This method allows you to take the image after the camera autofocuses
Camera.AutoFocusCallback mAutoFocusCallback = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
try {
// camera.takePicture(mShutterCallback, null, jpegCallback);
shutter(); // Method one shutt(1)
} catch (Exception e) {
}
}
};
//This method will activate the shutter class
public void shutter() {
//passies the auto focus listener parameter = 2
this.camera.autoFocus(this.mAutofocusListener);
}
private Camera.AutoFocusCallback mAutofocusListener = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
// camera.autoFocus(null); Takes the picture after the device succeeds in auto focus
//passes in two methos as a parameter
//First parameter = 3 Second paramter = 4
camera.takePicture(mShutterListener, null, mPictureListener);
}
};
private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() {
@Override
public void onShutter() {
}
};
//method for the picture callback parameter = 4
private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
//I think you better alter this part
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//returns the image data as a byte
//if image data exists
// if (data != null) {
camera.startPreview();
//passes in the byte data into the makeRotateImage function to rotate the image that has been taken
makeRotateImage(mOwner, data, 512 * 512); //maximum pixel willl be 262144
//}
}
};
public void takeFocusedPicture() {
//sets up the mAutoFocusCallback method as a parameter
camera.autoFocus(mAutoFocusCallback);
}
答案 0 :(得分:0)
拍完照片后,请刷新你的表面视图&停止预览并释放相机并重新开始该过程。
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
camera.stopPreview();
} catch (Exception e) {
// ignore: tried to stop a non-existent preview
}
camera.setPreviewDisplay("Our SurfaceView Holder");
camera.startPreview();
}