Android Camera 摄像 demo
<SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent"/>
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView); mSurfaceHolder = mSurfaceView.getHolder();// 取得holder mSurfaceHolder.addCallback(this); // holder加入回调接口 mSurfaceHolder.setKeepScreenOn(true);
@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (mCamera != null) { freeCameraResource(); }try { mCamera = Camera.open(); if (mCamera == null) return; mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mSurfaceHolder); parameters = mCamera.getParameters();// 获得相机参数 List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); List<Camera.Size> mSupportedVideoSizes = parameters.getSupportedVideoSizes(); optimalSize = CameraHelper.getOptimalVideoSize(mSupportedVideoSizes, mSupportedPreviewSizes, height, width);parameters.setPreviewSize(optimalSize.width, optimalSize.height); // 设置预览图像大小 parameters.set("orientation", "portrait"); List<String> focusModes = parameters.getSupportedFocusModes(); if (focusModes.contains("continuous-video")) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } mFpsRange = parameters.getSupportedPreviewFpsRange();mCamera.setParameters(parameters);// 设置相机参数 mCamera.startPreview();// 开始预览 }catch (Exception io){ io.printStackTrace(); } }
List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); List<Camera.Size> mSupportedVideoSizes = parameters.getSupportedVideoSizes();
public static Camera.Size getOptimalVideoSize(List<Camera.Size> supportedVideoSizes, List<Camera.Size> previewSizes, int w, int h) { // Use a very small tolerance because we want an exact match. final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) w / h;// Supported video sizes list might be null, it means that we are allowed to use the preview // sizes List<Camera.Size> videoSizes; if (supportedVideoSizes != null) { videoSizes = supportedVideoSizes; } else { videoSizes = previewSizes; } Camera.Size optimalSize = null;// Start with max value and refine as we iterate over available video sizes. This is the // minimum difference between view and camera height. double minDiff = Double.MAX_VALUE;// Target view height int targetHeight = h;// Try to find a video size that matches aspect ratio and the target view size. // Iterate over all available sizes and pick the largest size that can fit in the view and // still maintain the aspect ratio. for (Camera.Size size : videoSizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff && previewSizes.contains(size)) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } }// Cannot find video size that matches the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Camera.Size size : videoSizes) { if (Math.abs(size.height - targetHeight) < minDiff && previewSizes.contains(size)) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; }
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
parameters = mCamera.getParameters();// 获得相机参数
mCamera.setParameters(parameters);// 设置相机参数 mCamera.startPreview();// 开始预览
mMediaRecorder.setCamera(mCamera); mMediaRecorder.setOnErrorListener(this); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT ); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 视频源// Use the same size for recording profile. CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); mProfile.videoFrameWidth = optimalSize.width; mProfile.videoFrameHeight = optimalSize.height;mMediaRecorder.setProfile(mProfile); //该设置是为了抽取视频的某些帧,真正录视频的时候,不要设置该参数 // mMediaRecorder.setCaptureRate(mFpsRange.get(0)[0]);//获取最小的每一秒录制的帧数 mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());mMediaRecorder.prepare(); mMediaRecorder.start();
try { mMediaRecorder.stop(); mMediaRecorder.reset(); } catch (Exception e) { e.printStackTrace(); }
private void releaseRecord() { if (mMediaRecorder != null) { mMediaRecorder.setPreviewDisplay(null); mMediaRecorder.setOnErrorListener(null); try { mMediaRecorder.release(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } mMediaRecorder = null; }
private void flashLightToggle(){ try { if(isFlashLightOn){ parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(parameters); isFlashLightOn = false; }else { parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(parameters); isFlashLightOn = true; } } catch (Exception e) { e.printStackTrace(); } }
private void switchCamera(){ Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); int cameraCount = Camera.getNumberOfCameras();//得到摄像头的个数for(int i = 0; i < cameraCount; i++ ) { Camera.getCameraInfo(i, cameraInfo);//得到每一个摄像头的信息 if(cameraPosition == 1) { //现在是后置,变更为前置 if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置 mCamera.stopPreview();//停掉原来摄像头的预览 mCamera.release();//释放资源 mCamera = null;//取消原来摄像头 mCamera = Camera.open(i);//打开当前选中的摄像头 try { mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mSurfaceHolder);//通过surfaceview显示取景画面 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mCamera.setParameters(parameters);// 设置相机参数 mCamera.startPreview();//开始预览 cameraPosition = 0; break; } } else { //现在是前置, 变更为后置 if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置 mCamera.stopPreview();//停掉原来摄像头的预览 mCamera.release();//释放资源 mCamera = null;//取消原来摄像头 mCamera = Camera.open(i);//打开当前选中的摄像头 try { mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mSurfaceHolder);//通过surfaceview显示取景画面 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mCamera.setParameters(parameters);// 设置相机参数 mCamera.startPreview();//开始预览 cameraPosition = 1; break; } }} }
转载于:https://www.cnblogs.com/xiaoxiaoqingyi/p/7016312.html
Android Camera 摄像 demo相关推荐
- android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...
1.自定义一个imageview用来设定surfaceview上的特定区域. public class DrawImageView extends ImageView { private Paint ...
- android 人脸识别demo,Android Camera 内置人脸识别的Demo
CameraFace Android Camera 内置人脸识别的Demo 通过Android源生API支持的人脸识别FaceDetection,获取到脸部矩形坐标,左右眼坐标,嘴坐标通过View动态 ...
- Android Camera开发(一)之基础知识
概述 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助In ...
- Android camera(4)---Android Camera开发之基础知识篇
Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...
- Android Camera 编程从入门到精通
一.前言 想通过一篇文章就让我们精通 Android 的 Camera 那肯定是不可能的事情.但通过对 Android 中相机拍照的所有的方式的梳理和理解,包括直接调起相机拍照,Camera API ...
- Android学习小Demo(10)ToDoList的改进版之ViewPager显示多个图片
在TodoList增强版的增加界面上,为了显示图片,我是挖了两块地方,放了两个ImageButton,来显示图片,而且限制了最多只能放两张图片.当两个View都放置图片之后,我就会把"Gal ...
- Android Camera架构浅析
原址 1.Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转 ...
- Android 自定义相机Demo 入门学习
Android 自定义相机Demo 本文是参考网上一些自定义相机示例,再结合自己对相机的功能需求写的,基本上包含了很多基本功能,比如相机对焦.闪光灯,以及在手机预览界面上绘制自己想要绘制的图案. 话不 ...
- Android USB摄像头插拔监听
Android USB摄像头插拔监听 一.简要介绍 二.使用广播监听USB摄像头插拔情况 1.注册监听USB设备插拔广播 2.判断UsbDevice是否是Camera设备 (重点) 二.通过UsbMa ...
最新文章
- WebGIS空间数据请求访问机制
- 这三篇论文开源了!何恺明等人的PointRend,Hinton组的SimCLR和谷歌大脑的EfficientDet...
- 原理_JS引擎对未声明变量的处理
- Flutter之Align
- 枚举对象注释_如何以及何时使用枚举和注释
- 通过Maven构建打包Spring boot,并将config配置文件提取到jar文件外
- 彭荣新:喜马拉雅自研网关架构演进过程
- 使用JAVA实现语音朗读一段文本
- Retinex图像增强算法
- Unity实现多语言切换
- 手把手教你调整电脑磁盘的分区大小
- 疑犯追踪第一季/全集Person Of Interest迅雷下载
- 使用 yarn 安装 marked
- 汉诺塔游戏c语言作业,C语言实现汉诺塔游戏.pdf
- 滚轮JAVA_java滚轮
- Swift中键盘的弹出隐藏,页面抬高,Return键等的配置
- 清华大学出版社与SAP签署战略合作协议
- 一个人窝在摇椅里乘凉 我承认这样真的很安详 和楼下老爷爷一样
- 转专业2017武汉大学计算机学,转专业申请计算机,武大学子圆梦伯克利
- i3-1125G4 怎么样 相当于什么水平
热门文章
- Jenkins配置MSBuild时使用环境变量
- Kafka Broker常用配置详解
- python3 slice
- 我自己关于C语言,编译器,标准库,GUN glibc,CRT ,API之类的理解。
- butter滤波器是iir吗_如何快速设计应用一个IIR滤波器
- 同一工作组无法访问_工作组、AD、域、DC...
- 项目管理知识体系指南_PMP考前冲刺丨项目管理知识体系指南(PMBOK)串讲(4)...
- spark 把一列数据合并_Spark DataFrame列的合并与拆分
- java和python的优势_Java和Python哪个更好?解读Python对比其他语言的优势
- Kubernetes 证书过期