android Camera相机类

Camera相机类相关的几个流程方法

Camera.open(cameraId) 打开相机

camera.setDisplayOrientation(0) 设置相机水平方向

mCamera.setPreviewDisplay(holder) 在SurfaceHolder上显示画面

mCamera.setPreviewCallback(callback) 设置回调,将Yuv数据传递到onPreviewFrame方法

previewRate mParams = mCamera.getParameters() 获取相机相关参数

mCamera.stopPreview() 停止预览

mCamera.release() 释放相机

实现Camera.PreviewCallback接口获取Yuv视频流

@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
//获取实时的Yuv数据流
}

实现Camera.PictureCallback接口实现拍照

private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String pictureDir = Environment.getExternalStorageDirectory() + File.separator +"Videocmo/images";
String pictureName = DateFormat.format("yyyyMMddHHmmss",new Date()).toString()+ ".jpg";
String path=pictureDir+ File.separator + pictureName;
try {
File file = new File(pictureDir);
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(path);
fos.write(data);
fos.close();
} catch (FileNotFoundException ignored) {
} catch (IOException ignored) {
}
}
};
mCamera.takePicture(null, null, mPictureCallback);

寻找相机

private int findCamera(boolean isfront) {
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (isfront) {
// CAMERA_FACING_FRONT前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
return camIdx;
}
} else {
// CAMERA_FACING_BACK后置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
return camIdx;
}
} }
return -1;
}

Camera.Parameters相机参数类

Camera.Parameters parameters = camera.getParameters(); //获取相机参数

List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes(); //获取摄像头支持的各种分辨率

parameters.setPictureFormat(PixelFormat.JPEG);//设置照片格式

parameters.setPreviewSize(witdh,height); //设置预览尺寸

parameters.setPictureSize(witdh,height); //设置分辨率

camera.setParameters(parameters);//提交相机参数

设置相机分辨率

private void initCamera(Camera mCamera){
if(mCamera != null){
try{
mParams = mCamera.getParameters();
Size previewSize = CamParaUtil.getInstance().getPropPreviewSize(mParams.getSupportedPreviewSizes(),1.333f, 640);
Log.d("log", String.valueOf(previewSize.width) + "-" + previewSize.height);
pWidth = previewSize.width;
pHeight = previewSize.height;
mParams.setPreviewSize(pWidth, pHeight); List<String> focusModes = mParams.getSupportedFocusModes();
if(focusModes.contains("continuous-video")){
mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
mCamera.setParameters(mParams);
mCamera.startPreview(); isPreviewing = true;
mPreviwRate = previewRate;
}catch (Exception ex){
ex.printStackTrace();
} }
} public Size getPropPreviewSize(List<Size> list, float th, int minWidth){
Collections.sort(list, sizeComparator); int i = 0;
for(Size s:list){
if((s.width >= minWidth) && equalRate(s, th)){
break;
}
i++;
}
if(i == list.size()){
}
return list.get(i);
}

相关阅读

SurfaceView开启相机预览

上一篇:linux内核设计与实现一书阅读整理 之第十八章


下一篇:云平台项目--学习经验--回调函数中call和apply