目前因为设计使用到android的自定义照相机,所以把以前写的方法归结了一下,希望能帮到需要使用的同学,具体代码如下:
import java.io.IOException;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.Toast;
public class CameraUtils {
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
public Camera mCamera;
private boolean isFrontCamera = false;
private Context mContext;
public CameraUtils(Context context,SurfaceHolder surfaceHolder,SurfaceView surfaceView){
this.mSurfaceHolder = surfaceHolder;
this.mSurfaceView = surfaceView;
this.mContext = context;
}
@SuppressWarnings("deprecation")
public void initSurface(){
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSurfaceHolder.addCallback(surfaceCallback);
//选择摄像头
camIdx = getUserCameraInfo();
}
public boolean isPreview = false;
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public void initCamera(){
if(mCamera==null && !isPreview){
//打开照相机 如果Camera.open() 不添加参数 默认打开的是后置
mCamera = Camera.open(camIdx);
}
if(mCamera!=null && !isPreview){
try {
Camera.Parameters parmeters = mCamera.getParameters();
//设置照片预览的大小 注释掉 否则会报错
//parmeters.setPreviewSize(WIDTH, HEIGHT);
//每秒显示4帧
parmeters.setPreviewFrameRate(4);
//设置图片格式
parmeters.setPictureFormat(PixelFormat.JPEG);
//设置JPEG照片的质量
parmeters.set("jpeg-quality", 85);
//设置照片的大小
//parmeters.setPictureSize(WIDTH, HEIGHT);
//设置相机旋转90度 这样就不会拍摄返图像
mCamera.setDisplayOrientation(90);
mCamera.setParameters(parmeters);
//通过surfaceView来显示取景画面
mCamera.setPreviewDisplay(mSurfaceHolder);
//开始预览
mCamera.startPreview();
isPreview = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
SurfaceHolder.Callback surfaceCallback = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//如果camera不为null,释放摄像头
if(mCamera!=null){
if(isPreview)
mCamera.stopPreview();
isPreview = false;
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
};
public PictureCallback jpegCallback = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
System.out.println("get picture from camera!");
}
};
private int camIdx;
@SuppressLint("NewApi")
/**
* 获取摄像头信息
*
* 判断是否有前置摄像头 如有,默认使用前置摄像头
* @return
*/
private int getUserCameraInfo(){
int cameraCount = Camera.getNumberOfCameras();
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for(int c = 0;c<cameraCount;c++){
Camera.getCameraInfo(c, cameraInfo);
//表示有前置摄像头
if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
isFrontCamera = true;
return Camera.CameraInfo.CAMERA_FACING_FRONT;
}
}
return Camera.CameraInfo.CAMERA_FACING_BACK;
}
/**
* 未完待续。。。
*/
@SuppressLint({ "InlinedApi", "NewApi" })
public void switchCamera(){
//如果有前置摄像头
if(isFrontCamera){
//如果摄像头开启 并预览中
if(mCamera!= null&&isPreview){
//摄像头位置 CAMERA_FACING_BACK代表后置 CAMERA_FACING_FRONT代表前置
if(camIdx == Camera.CameraInfo.CAMERA_FACING_FRONT){
camIdx = Camera.CameraInfo.CAMERA_FACING_BACK;
}else{
camIdx = Camera.CameraInfo.CAMERA_FACING_FRONT;
}
//关闭摄像头 并重新初始化
mCamera.stopPreview();
mCamera.release();
mCamera = null;
mCamera = Camera.open(camIdx);//打开当前选中的摄像头
try {
mCamera.setPreviewDisplay(mSurfaceHolder);//通过surfaceview显示取景画面
//设置翻转90度 否则画面是返的
mCamera.setDisplayOrientation(90);
}catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();//开始预览
}
}else{
Toast.makeText(mContext, "未检测到前置摄像头", Toast.LENGTH_LONG).show();
}
}
}