Android自定义的照相机操作类

目前因为设计使用到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();
}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值