android摄像头采集和预览-第一种方法
16lz
2021-01-23
几种方法介绍
android摄像头采集和预览-几种方法介绍
http://blog.csdn.net/f562230829/article/details/78905530
第一种方法:
权限
开启摄像头需要在 AndroidManifest.xml 中添加摄像头权限 <uses-permission android:name="android.permission.CAMERA"/>注:高版本的手机,还需要动态申请
SurfaceView
1. 布局 xml 文件中 "@+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为第一种方法
[email protected]:audiocn/androidCamera.git
https://gitee.com/audiocn/androidCamera.git
更多相关文章
- android apk获得系统权限
- Android应用程序永久获取root权限方法
- Android基于ProductFlavors动态配置权限
- Android 短信模块分析(二) MMS中四大组件核心功能详解
- Android所有权限以及权限分类
- Adroid核心分析
- 关于Android接入USB外接摄像头以及控制拍照并保存图片