public class CameraOperate {
private static CameraOperate mCameraOperate;
private Camera mCamera;
private int mStatus = 0;
private int mCameraId = -1;
private int mSurfaceViewOrientation = 0;
private int mPictureOrientation = 0;
public static synchronized CameraOperate getInstance() {
if (null == mCameraOperate) {
mCameraOperate = new CameraOperate();
}
return mCameraOperate;
}
private CameraOperate() {
}
/**
* 绑定相机实例
*/
public void openCamera() {
if (mCameraId <= -1) {
int numberOfCameras = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
mCamera = Camera.open(i);
mCameraId = i;
}
}
} else {
mCamera = Camera.open(mCameraId);
}
}
/**
* 绑定与当前摄像头相反的相机实例
*
* @param
*/
public void changeCamera(SurfaceHolder holder) {
int cameraCount = 0;
int id = -1;
CameraInfo cameraInfo = new CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int cameraId = 0; cameraId < cameraCount; cameraId++) {
Camera.getCameraInfo(cameraId, cameraInfo);
if (mStatus == 0) {
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
stopPreview();
stopCamera();
try {
mCamera = Camera.open(cameraId);
LogUtils.d("swl","android.os.Build.BRAND"+android.os.Build.BRAND);
if(android.os.Build.BRAND.endsWith ("Xiaomi") ) {
mCamera.setDisplayOrientation(270);
}else {
mCamera.setDisplayOrientation(90);
}
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
return;
}
mCamera.startPreview();
mCameraId = cameraId;
mStatus = 1;
break;
}
} else {
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
stopPreview();
stopCamera();
try {
mCamera = Camera.open(cameraId);
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
mCameraId = cameraId;
mStatus = 0;
break;
}
}
}
}
/**
* 获取当前相机的
* @return
*/
public boolean isFrontCamera(){
return mStatus == 1;
}
/**
* 获取相机实例
*
* @return
*/
public Camera getCameraInstance() {
return mCamera;
}
/**
* 释放Camera实例
*/
public void stopCamera() {
if (null == mCamera)
return;
try {
mCamera.release();
mCamera = null;
} catch (Exception e) {
}
}
/**
* 设置相机属性(前后摄像头,闪光,聚焦,相片和预览尺寸)
*
* @param parmars
*/
public void setParameters(Parameters parmars) {
if (null == mCamera)
return;
try {
mCamera.setParameters(parmars);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 绑定预览surfaceHolder
*
* @param holder
* @throws IOException
*/
public void setPreviewDisplay(SurfaceHolder holder) {
if (null == mCamera)
return;
try {
mCamera.setPreviewDisplay(holder);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 适配预览相片与surfaceView 的大小
*
* @param surfaceView
*/
private void setupPreviewSize(SurfaceView surfaceView) {
Parameters parameters = mCamera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
int width = surfaceView.getWidth();
int height = surfaceView.getHeight();
Size size = CameraSizeUntil.getOptimalPreviewSize(sizes, height, width);
parameters.setPreviewSize(size.width, size.height);
if (parameters.isZoomSupported()) {
parameters.setZoom(0);
}
setParameters(parameters);
}
/**
* 设置拍照相片尺寸
*
* @param context
*/
private void setUpTakePictureSize(Context context) {
Parameters parameters = mCamera.getParameters();
List<Size> sizes = parameters.getSupportedPictureSizes();
Size size = CameraSizeUntil.getOptimalTakePictrueSize(sizes);
parameters.setPictureSize(size.width, size.height);
mPictureOrientation = getTakePicRotation(context);
parameters.setRotation(mPictureOrientation);
setParameters(parameters);
}
/**
* 开始预览照片
*/
public void startPreview(Activity activity, SurfaceView surfaceView) {
if (null == mCamera)
return;
setCameraDisplayOrientation(activity);
setupPreviewSize(surfaceView);
try {
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 停止预览照片
*/
public void stopPreview() {
if (null == mCamera)
return;
try {
mCamera.stopPreview();
} catch (Exception e) {
}
}
/**
* 获取相机相片
*
* @param shutter
* @param raw
* @param jpeg
*/
public void takePhoto(Context context, ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg) {
if (null == mCamera)
return;
setUpTakePictureSize(context);
try {
mCamera.takePicture(shutter, raw, jpeg);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 自动对焦
*
* @param cb
*/
public void autoFocus(AutoFocusCallback cb) {
if (null == mCamera)
return;
try {
mCamera.autoFocus(cb);
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 增加CameraZoom
*
* @param value
*/
public void addCameraZoom(int value) {
Parameters parameters = mCamera.getParameters();
if (!parameters.isZoomSupported())
return;
int maxzoom = parameters.getMaxZoom();
int zoom = parameters.getZoom();
if (zoom >= maxzoom)
return;
zoom += value;
if (zoom > maxzoom)
zoom = maxzoom;
parameters.setZoom(zoom);
setParameters(parameters);
}
/**
* 相机反向
*/
public void rebackCamera() {
mCamera.startFaceDetection();
}
/**
* 获取界面的角度
*
* @param activity
*/
public int getDisplayRotation(Activity activity) {
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
switch (rotation) {
case Surface.ROTATION_0:
return 0;
case Surface.ROTATION_90:
return 90;
case Surface.ROTATION_180:
return 180;
case Surface.ROTATION_270:
return 270;
}
return 0;
}
/**
* 设置相机的照片的选择角度
*
* @param activity
*/
public void setCameraDisplayOrientation(Activity activity) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(mCameraId, info);
int degrees = getDisplayRotation(activity);
int result;
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
result = (info.orientation - degrees + 360) % 360;
}
mCamera.setDisplayOrientation(result);
}
/**
* 判断拍照时相机的角度(不能适配全部机型)
*
* @param context
* @return
*/
private int getTakePicRotation(Context context) {
if (null == mCameraOperate)
return 0;
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(mCameraId, info);
int degree = mSurfaceViewOrientation;
//if ((degree >= 0 && degree <=45) || degree >= 315 ) {
// return info.orientation;
//}
int plusOrMinus = 1;
if (1 == mStatus)
plusOrMinus = -1;
if (degree <= 315 && degree >= 225) {
return Math.abs(info.orientation + plusOrMinus * 270) % 360;
} else if (degree >= 45 && degree < 135) {
return Math.abs(info.orientation + plusOrMinus * 90) % 360;
} else if (degree >= 135 && degree < 225) {
return Math.abs(info.orientation + plusOrMinus * 180) % 360;
}
return Math.abs(info.orientation) % 360;
}
/**
* 设置手机拍照时手机的旋转角度
*
* @param orientation
*/
public void setSurfaceViewOrientation(int orientation) {
if (null != mCameraOperate) {
mSurfaceViewOrientation = orientation;
}
}
/**
* 清除相机状态设置
*/
public void cleanCameraOption() {
mCameraId = -1;
mStatus = 0;
}
public List<Size> getTakeSizes() {
if (null != mCamera)
return mCamera.getParameters().getSupportedPictureSizes();
return null;
}
public float getPictureOrientation() {
return mPictureOrientation;
}
public int getStatus() {
return mStatus;
}
public void setCameraVoice(boolean camera) {
try {
mCamera.enableShutterSound(camera);
} catch (Exception e) {
}
}
public boolean canDisableSound() {
return true;
}
}