在此处说明一点,本例子实现的是三连拍,通过异步任务类实现的存储,最重要的一点:Camera的回调是异步方式的,三连拍不能够使用简单的for循环,我在这里使用的递归方法。
1.CameraPreview。java
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera myCamera;
public CameraPreview(Context context, Camera camera, SurfaceView surfaceView) {
super(context);
myCamera = camera;
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//一直保持屏幕常亮
surfaceView.getHolder().setKeepScreenOn(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
//设置参数并开始预览
Log.d("=======熄屏=1111===","熄屏");
if (myCamera != null) {
Camera.Parameters params = myCamera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);
//myCamera.setDisplayOrientation(90);
List<Camera.Size> list=params.getSupportedPreviewSizes();
for(int i=0;i<list.size();i++){
LogUtils.i("getSupportedPreviewSizes "+ list.get(i).width+","+list.get(i).height);
}
if(list.size()>0)
params.setPreviewSize(list.get(0).width, list.get(0).height);
else
params.setPreviewSize(640, 480);
params.set("orientation", "portrait");
// params.set("rotation", 90);
myCamera.setParameters(params);
myCamera.startPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
//开启相机
try {
if (myCamera != null) {
myCamera.setPreviewDisplay(holder);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (myCamera != null) {
//关闭预览并释放资源
// holder.removeCallback(this);
Log.d("====home", "home");
myCamera.setPreviewCallback(null);
myCamera.stopPreview();
// myCamera.lock();
myCamera.release();
myCamera = null;
}
}
}
2.MainActivity中
private void initCameraData(){
if(null==myCamera){
myCamera=getCameraInstance();
new CameraPreview(this.getActivity(),myCamera,mySurfaceView);
}
myCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, final Camera camera) {
if (success) {
cameraPlus = camera;
ContinueShot();
}
}
});
}
private void ContinueShot(){
cameraPlus.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
Toast.makeText(getActivity(), "3连拍成功", Toast.LENGTH_SHORT).show();
if (++temp < 3) {
ContinueShot();
}
}
});class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(byte[]... params) {
Log.d("=======","baackground");
File out = new File(picture,new CurrentTime().Times()+".jpg");
try {
FileOutputStream fos = new FileOutputStream(out.getPath());
fos.write(params[0]);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}