原文地址

https://blog.csdn.net/junzia/article/details/52301199

拍照步骤
1.添加权限
2.开启相机时check一下是否有摄像头
3.对预览大小、照片大小和对焦方式进行设置;对相机预览方向进行设置;
4.相机预览前,必须设置预览的承载;对预览View大小进行设置
5.相机预览时拍照,图像回调,对拍照的结果进行裁剪,使图片结果和预览结果相同,对前摄像头拍摄的结果还需要做对称变换。

相机的控制类CameraKitKat源码

public class CameraKitKat extends ACamera{private Camera camera;private SurfaceHolder holder;private float displayScale;public CameraKitKat(SurfaceView surfaceView) {super(surfaceView);init();}private void init(){holder=displayView.getHolder();}
  //获得一个相机实例@Overridepublic void open(int type){    //获取预览方向设置int rotation=((WindowManager)displayView.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();    //判断相机是否开启if(!openCamera(type))return;    //修改相机设置setParameters(camera,rotation);    //设置正确的预览方向setDisplayOrientation(camera,rotation);    //设置预览的承载,如果没有这一步,相机无法开始预览setPreviewDisplay(camera,holder);    //开启预览camera.startPreview();}@Overridepublic void close(){camera.stopPreview();camera.release();}//调整SurfaceView的大小private void resizeDisplayView(){    //获得相机实例的默认设置Camera.Parameters parameters=camera.getParameters();    //将预览View的Size和Camera的PreviewSize设置相同Camera.Size size=parameters.getPreviewSize();    //返回布局参数的引用FrameLayout.LayoutParams p= (FrameLayout.LayoutParams) displayView.getLayoutParams();float scale=size.width/(float)size.height;displayScale=displayView.getHeight()/(float)displayView.getWidth();if(scale>displayScale){p.height= (int) (scale*displayView.getWidth());p.width=displayView.getWidth();}else{p.width= (int) (displayView.getHeight()/scale);p.height=displayView.getHeight();}Log.e("wuwang","-->"+size.width+"/"+size.height);Log.e("wuwang","--<"+p.height+"/"+p.width);displayView.setLayoutParams(p);displayView.invalidate();}
  //获得当前设备的Camera个数,为0表示不支持摄像头private boolean checkCameraId(int cameraId){return cameraId>=0&&cameraId<Camera.getNumberOfCameras();}//相机使用第一步,打开相机,获得相机实例private boolean openCamera(int cameraId){if(!checkCameraId(cameraId))return false;camera=Camera.open(cameraId);return true;}//相机使用第二步,设置相机实例参数//TODO :里面还存在问题,需要修改private void setParameters(Camera camera,int rotation){Camera.Parameters parameters=camera.getParameters();//PreviewSize设置为设备支持的最高分辨率final Camera.Size size=Collections.max(camera.getParameters().getSupportedPreviewSizes(),new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return lhs.width*lhs.height-rhs.width*rhs.height;}});parameters.setPreviewSize(size.width,size.height);//PictureSize设置为和预览大小最近的Camera.Size picSize=Collections.max(parameters.getSupportedPictureSizes(), new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return (int) (Math.sqrt(Math.pow(size.width-rhs.width,2)+Math.pow(size.height-rhs.height,2))-Math.sqrt(Math.pow(size.width-lhs.width,2)+Math.pow(size.height-lhs.height,2)));}});parameters.setPictureSize(picSize.width,picSize.height);//如果相机支持自动聚焦,则设置相机自动聚焦,否则不设置if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)){parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);}//设置颜色效果
//        parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);camera.setParameters(parameters);resizeDisplayView();}//相机使用第三步,设置相机预览方向private void setDisplayOrientation(Camera camera,int rotation){if(rotation== Surface.ROTATION_0||rotation==Surface.ROTATION_180){camera.setDisplayOrientation(90);}else{camera.setDisplayOrientation(0);}}//相机使用第四步,设置相机预览载体SurfaceHolderprivate void setPreviewDisplay(Camera camera,SurfaceHolder holder){try {camera.setPreviewDisplay(holder);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void measureSize(int width, int height) {super.measureSize(width, height);}
  //拍照@Overridepublic void takePicture() {super.takePicture();camera.takePicture(new Camera.ShutterCallback() {@Override      //原始图像数据回调public void onShutter() {}}, new Camera.PictureCallback() {@Override      //展示图像数据的回调public void onPictureTaken(byte[] data, Camera camera) {}}, new Camera.PictureCallback() {@Override      //JPEG图像数据的回调public void onPictureTaken(byte[] data, Camera camera) {if(pictureCallback!=null){pictureCallback.onPictureTaken(data,displayScale);}}});}
}

转载于:https://www.cnblogs.com/hyating/p/9007731.html

Android Camera的使用(一) 读书笔记相关推荐

  1. 《Android编程权威指南》-读书笔记(七) -处理旋转设备

    <Android编程权威指南>-读书笔记(七) -处理旋转设备 旋转设备会改变设备配置(device configuration).设备配置是用来描述设备当前状态的一系列特征.这些特征包括 ...

  2. 《android开发艺术探索》读书笔记(五)--RemoteViews

    接上篇<android开发艺术探索>读书笔记(四)--View工作原理 No1: RemoteViews使用场景:通知栏和桌面小部件 No2: 通知栏主要通过NotificationMan ...

  3. 《Android开发艺术探索》读书笔记

    一.前言 花了几天整理完<Android进阶之光>的读书笔记,效果不是很满意,把以前零散整合成一片超长笔记,总感觉也不是那么好,决定接下来读书笔记还是拆开来,以后也好查找一点. 二.目录 ...

  4. 《Android进阶之光》Horizontal 读书笔记

    <Android进阶之光>Horizontal 读书笔记 public class HorizontalView extends ViewGroup {private int lastIn ...

  5. 《android开发艺术探索》读书笔记(二)--IPC机制

    接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...

  6. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

  7. 《Android群英传 神兵利器》读书笔记

    <Android群英传 神兵利器> - Android开发的工具使用 这是一本Android开发的工具书,里面的提到的工具基本上是每个Android开发者必备的技能,买这本书的起因是看到有 ...

  8. 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析

    本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...

  9. 第二章:Android系统与嵌入式开发读书笔记

    本章我们主要学习了Android与传统嵌入式Linux系统:嵌入式系统概述,组成,开发概述:Android系统概述和架构. 嵌入式系统是面向用户.面向产品.面向应用的,它必须与具体应用相结合才会具有生 ...

  10. 《Android开发艺术探索》读书笔记——Cha3.2.2使用动画实现View的滑动

    章节来自<Android开发艺术探索> 第一种方式 3.2.2 使用动画 上一节介绍了采用scrollTo/scrollBy来实现View的滑动,本节介绍另外一种滑动方式,即使用动画,通过 ...

最新文章

  1. CSDN内容颜色、位置以及图片大小改变
  2. Windows系统调用学习笔记(三)—— 保存现场
  3. 减少训练成本的一个方法
  4. 【H264/AVC 句法和语义详解】(五):Exp-Golomb指数哥伦布编码(理论篇)
  5. leetcode 559. N 叉树的最大深度(Java版,N叉树的深度优先搜索)
  6. python画一个祝福别人生日快乐_生日贺卡祝福语(精选50条)
  7. 2.转动的地球shader
  8. ES6 数值的扩展
  9. 《汇编语言》王爽—第八章实验七详解
  10. 微信小应用资源汇总整理
  11. dao层如何调用对象_以k8s集群管理为例,大牛教你如何设计优秀项目架构
  12. 分享两个网址,一个是使用mssql自带的跟踪工具和分析工具
  13. 博弈论-共有知识与共同知识
  14. configure: error: udev support requested but libudev header not installed
  15. linux化学公式软件下载,化学公式编辑器下载-Efofex FX Chem(化学公式编辑器)下载 v3.004.0 官方特别版-IT猫扑网...
  16. 工厂信息化系统(ERP、PLM、MES、WMS)架构设计与建设规划
  17. 寒霜朋克计算机丢失,寒霜朋克无法进入游戏解决方法 寒霜朋克无法进入游戏怎么办...
  18. 火车头采集html5游戏,火车采集器7.6-火车头数据采集平台1.6教程
  19. 广域网加速方案--Riverbed
  20. 笔记本电脑没有WiFi选项 解决办法

热门文章

  1. CentOS 6.4 配置LAMP 环境 与安装 phpmyadmin
  2. 北斗导航 | 北斗伪距定位、测速与授时——PNT:最小二乘法、加权最小二乘:伪距单点定位
  3. java数组解析_Java - 数组解析
  4. linux多线程求和_谈一谈C++中的多线程(上)
  5. 【转】VC窗口刷新InvalidateRect和UpdateWindow RedrawWindow
  6. 串口编程-枚举遍历串口、获取PC所有串口名称、遍历注册表项、RegEnumValue用法
  7. SQLite学习手册(在线备份)
  8. Windows消息机制(MFC)
  9. Python 网络爬虫笔记6 -- 正则表达式
  10. 健康管理-健康管理特点