几种方法介绍
android摄像头采集和预览-几种方法介绍
http://blog.youkuaiyun.com/f562230829/article/details/78905530
第一种方法:
权限
开启摄像头需要在 AndroidManifest.xml 中添加摄像头权限
<uses-permission android:name="android.permission.CAMERA"/>
注:高版本的手机,还需要动态申请
SurfaceView
1. 布局 xml 文件中
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
2. Activity的onCreate中
mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//打开摄像头
CameraController.getInstance().openCamera(holder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
CameraController.getInstance().closeCamera();
}
});
核心代码
public boolean openCamera(SurfaceHolder surfaceHolder){
boolean b = true;
try {
//打开摄像头
int cameraId = openCommonCamera();
//设置预览方式
mCamera.setPreviewDisplay(surfaceHolder);
//根据打开的摄像头获取旋转角度
mDisplayOrientation = CameraUtils.getDisplayOrientation(cameraId);
mCamera.setDisplayOrientation(mDisplayOrientation);
//设置摄像头参数
setPameras();
//开始预览
mCamera.startPreview();
//获取预览数据
mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//取出数据进行处理
//...
//将data重新设置给camera
camera.addCallbackBuffer(data);
}
});
byte[] data = new byte[mPreViewWidth * mPreViewHeight * 3 / 2];
mCamera.addCallbackBuffer(data);
}catch (Exception e){
e.printStackTrace();
b = false;
}
return b;
}
public static int getDisplayOrientation(int cameraId) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation + 360) % 360;
}
return result;
}
private void setPameras(){
//选择支持的宽高
Camera.Size preViewSize = CameraUtils.getOptimalPreviewSize(mCamera,mPreViewWidth,mPreViewHeight);
Camera.Parameters parameters = mCamera.getParameters();
parameters.setRotation(mRotation);
//预览的图像格式,NV21都支持
parameters.setPreviewFormat(ImageFormat.NV21);
//设置预览宽高 parameters.setPreviewSize(preViewSize.width,preViewSize.height);
int[] range = CameraUtils.adaptPreviewFps(mPreViewFps, parameters.getSupportedPreviewFpsRange());
parameters.setPreviewFpsRange(range[0],range[1]);
mPreviewSize = preViewSize;
}
demo地址
ActivityDemo1为第一种方法
git@gitee.com:audiocn/androidCamera.git
https://gitee.com/audiocn/androidCamera.git