1.implements SurfaceHolder.Callback
可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
ExecutorService executorService = Executors.newCachedThreadPool(); public void initView() {
mSurfaceView = findViewById(R.id.surface);
//SurfaceHolder.Callback()用于监听surface的生命周期
mSurfaceHolder.addCallback(this);
mSurfaceHolder = mSurfaceView.getHolder();
@Override
protected void onStart() {
super.onStart();
if (this.checkCameraHardware(this) && (mCamera == null)) {
try {
setCameraFace();
} catch (Exception e) {
e.printStackTrace();
}
Log.d("onStart", "onStart");
}
}
// 设置摄像头方向
public void setCameraFace() {
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();// 得到摄像头的个数
for (int i = 0; i < cameraCount; i++) {
Camera.getCameraInfo(i, cameraInfo);// 得到每一个摄像头的信息
// 现在是后置,变更为前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
/*
* 记得释放camera,方便其他应用调用
*/
releaseCamera();
// 打开当前选中的摄像头
mCamera = Camera.open(i);
if (mCamera != null) {
Camera.Parameters params = mCamera.getParameters();
params.setPictureFormat(ImageFormat.JPEG);
params.setPreviewSize(800, 400);
// 自动对焦
// params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
params.setJpegQuality(40);
// params.setPictureSize(300,300);
mCamera.setParameters(params);
}
}
}
}
/**
* 释放mCamera
*/
private void releaseCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();// 停掉原来摄像头的预览
mCamera.release();
mCamera = null;
}
}
/**
* Check if this device has a camera
*/
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
// this device has a camera
return true;
} else {
// no camera on this device
return false;
}
}
/**
* 设置camera显示取景画面,并预览
*
* @param camera
*/
private void setStartPreview(Camera camera, SurfaceHolder holder) {
/* Log.d("onStart", "setStartPreview");
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}*/
try {
setCameraFace();
//预览拍照
mCamera.setPreviewDisplay(holder);
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Log.d("onStart", "surfaceCreated");
setStartPreview(mCamera, surfaceHolder);
// mHandler.postDelayed(runnbale,10000);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
Log.d("onStart", "surfaceChanged");
if (mSurfaceHolder.getSurface() == null) {
return;
}
// stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e) {
// ignore: tried to stop a non-existent preview
}
setStartPreview(mCamera, surfaceHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
// 当surfaceview关闭时,关闭预览并释放资源
releaseCamera();
mSurfaceHolder = null;
mSurfaceView = null;
}
void takephoto(final String cardNumber) {
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(final byte[] bytes, Camera camera) {
executorService.execute(new Runnable() {
@Override
public void run() {
setStartPreview(mCamera, mSurfaceHolder);
//设置线程为前端进程
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
String imgName = "";
FileOutputStream fos = null;
try {
try {
//将照片保存到本地
fos = new FileOutputStream("/sdcard/DCIM/" + (imgName = "a"+"_"+cardNumber+"_"+ System.currentTimeMillis()) + ".jpg");
} catch (Exception e) {
} finally {
fos.flush();
fos.close();
}
});
}
});
}
如果mCamera.takePicture(null, null, new Camera.PictureCallback() {}方法没有回调
可能的原因是:没有预览拍照 mCamera.setPreviewDisplay(holder); mCamera.startPreview();