原文地址

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

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

相机的控制类CameraKitKat源码

  1. public class CameraKitKat extends ACamera{
  2.  
  3. private Camera camera;
  4. private SurfaceHolder holder;
  5. private float displayScale;
  6.  
  7. public CameraKitKat(SurfaceView surfaceView) {
  8. super(surfaceView);
  9. init();
  10. }
  11.  
  12. private void init(){
  13. holder=displayView.getHolder();
  14. }

  15.   //获得一个相机实例
  16. @Override
  17. public void open(int type){
        //获取预览方向设置
  18. int rotation=((WindowManager)displayView.getContext().getSystemService(Context.WINDOW_SERVICE))
  19. .getDefaultDisplay().getRotation();
        //判断相机是否开启
  20. if(!openCamera(type))return;
        //修改相机设置
  21. setParameters(camera,rotation);
        //设置正确的预览方向
  22. setDisplayOrientation(camera,rotation);
        //设置预览的承载,如果没有这一步,相机无法开始预览
  23. setPreviewDisplay(camera,holder);
        //开启预览
  24. camera.startPreview();
  25. }
  26.  
  27. @Override
  28. public void close(){
  29. camera.stopPreview();
  30. camera.release();
  31. }
  32.  
  33. //调整SurfaceView的大小
  34. private void resizeDisplayView(){
        //获得相机实例的默认设置
  35. Camera.Parameters parameters=camera.getParameters();
        //将预览View的Size和Camera的PreviewSize设置相同
  36. Camera.Size size=parameters.getPreviewSize();
        //返回布局参数的引用
  37. FrameLayout.LayoutParams p= (FrameLayout.LayoutParams) displayView.getLayoutParams();
  38. float scale=size.width/(float)size.height;
  39. displayScale=displayView.getHeight()/(float)displayView.getWidth();
  40. if(scale>displayScale){
  41. p.height= (int) (scale*displayView.getWidth());
  42. p.width=displayView.getWidth();
  43. }else{
  44. p.width= (int) (displayView.getHeight()/scale);
  45. p.height=displayView.getHeight();
  46. }
  47. Log.e("wuwang","-->"+size.width+"/"+size.height);
  48. Log.e("wuwang","--<"+p.height+"/"+p.width);
  49. displayView.setLayoutParams(p);
  50. displayView.invalidate();
  51. }

  52.   //获得当前设备的Camera个数,为0表示不支持摄像头
  53. private boolean checkCameraId(int cameraId){
  54. return cameraId>=0&&cameraId<Camera.getNumberOfCameras();
  55. }
  56.  
  57. //相机使用第一步,打开相机,获得相机实例
  58. private boolean openCamera(int cameraId){
  59. if(!checkCameraId(cameraId))return false;
  60. camera=Camera.open(cameraId);
  61. return true;
  62. }
  63.  
  64. //相机使用第二步,设置相机实例参数
  65. //TODO :里面还存在问题,需要修改
  66. private void setParameters(Camera camera,int rotation){
  67. Camera.Parameters parameters=camera.getParameters();
  68.  
  69. //PreviewSize设置为设备支持的最高分辨率
  70. final Camera.Size size=Collections.max(camera.getParameters().getSupportedPreviewSizes(),new Comparator<Camera.Size>() {
  71. @Override
  72. public int compare(Camera.Size lhs, Camera.Size rhs) {
  73. return lhs.width*lhs.height-rhs.width*rhs.height;
  74. }
  75. });
  76. parameters.setPreviewSize(size.width,size.height);
  77.  
  78. //PictureSize设置为和预览大小最近的
  79. Camera.Size picSize=Collections.max(parameters.getSupportedPictureSizes(), new Comparator<Camera.Size>() {
  80. @Override
  81. public int compare(Camera.Size lhs, Camera.Size rhs) {
  82. return (int) (Math.sqrt(Math.pow(size.width-rhs.width,2)+Math.pow(size.height-rhs.height,2))-
  83. Math.sqrt(Math.pow(size.width-lhs.width,2)+Math.pow(size.height-lhs.height,2)));
  84. }
  85. });
  86. parameters.setPictureSize(picSize.width,picSize.height);
  87. //如果相机支持自动聚焦,则设置相机自动聚焦,否则不设置
  88. if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)){
  89. parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
  90. }
  91. //设置颜色效果
  92. // parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);
  93. camera.setParameters(parameters);
  94. resizeDisplayView();
  95. }
  96.  
  97. //相机使用第三步,设置相机预览方向
  98. private void setDisplayOrientation(Camera camera,int rotation){
  99. if(rotation== Surface.ROTATION_0||rotation==Surface.ROTATION_180){
  100. camera.setDisplayOrientation(90);
  101. }else{
  102. camera.setDisplayOrientation(0);
  103. }
  104. }
  105.  
  106. //相机使用第四步,设置相机预览载体SurfaceHolder
  107. private void setPreviewDisplay(Camera camera,SurfaceHolder holder){
  108. try {
  109. camera.setPreviewDisplay(holder);
  110. } catch (IOException e) {
  111. e.printStackTrace();
  112. }
  113. }
  114.  
  115. @Override
  116. public void measureSize(int width, int height) {
  117. super.measureSize(width, height);
  118. }

  119.   //拍照
  120. @Override
  121. public void takePicture() {
  122. super.takePicture();
  123. camera.takePicture(new Camera.ShutterCallback() {
  124. @Override
          //原始图像数据回调
  125. public void onShutter() {
  126.  
  127. }
  128. }, new Camera.PictureCallback() {
  129. @Override
          //展示图像数据的回调
  130. public void onPictureTaken(byte[] data, Camera camera) {
  131.  
  132. }
  133. }, new Camera.PictureCallback() {
  134. @Override
          //JPEG图像数据的回调
  135. public void onPictureTaken(byte[] data, Camera camera) {
  136. if(pictureCallback!=null){
  137. pictureCallback.onPictureTaken(data,displayScale);
  138. }
  139. }
  140. });
  141. }
  142. }
  143.  

Android Camera的使用(一) 读书笔记的更多相关文章

  1. 《android开发艺术探索》读书笔记(七)--动画

    接上篇<android开发艺术探索>读书笔记(六)--Drawable No1: 自定义动画:派生一种新动画只需要继承Animation这个抽象类,然后重写它的initialize和app ...

  2. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  3. 《android开发艺术探索》读书笔记(十五)--Android性能优化

    接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...

  4. 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程

    接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...

  5. 《android开发艺术探索》读书笔记(十三)--综合技术

    接上篇<android开发艺术探索>读书笔记(十二)--Bitmap的加载和Cache No1: 使用CrashHandler来获取应用的crash信息 No2: 在Android中单个d ...

  6. 《android开发艺术探索》读书笔记(十二)--Bitmap的加载和Cache

    接上篇<android开发艺术探索>读书笔记(十一)--Android的线程和线程池 No1: 目前比较常用的缓存策略是LruCache和DiskLruCache,LruCache常被用作 ...

  7. 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池

    接上篇<android开发艺术探索>读书笔记(十)--Android的消息机制 No1: 在Android中可以扮演线程角色的有很多,比如AsyncTask.IntentService.H ...

  8. 《android开发艺术探索》读书笔记(十)--Android的消息机制

    接上篇<android开发艺术探索>读书笔记(九)--四大组件 No1: 消息队列MessageQueue的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表,因为单链表 ...

  9. 《android开发艺术探索》读书笔记(九)--四大组件

    接上篇<android开发艺术探索>读书笔记(八)--WindowManager No1: 四大组件除了BroadcastReceiver,其他三种组件都必须在AndroidManifes ...

  10. 《android开发艺术探索》读书笔记(八)--WindowManager

    接上篇<android开发艺术探索>读书笔记(七)--动画 No1: Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window是很简单的事,只需要通过Windo ...

随机推荐

  1. MySQL性能调优 – 你必须了解的15个重要变量

    1.DEFAULT_STORAGE_ENGINE 如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了.如果没有,确保把你的表转换为InnoDB并且设置d ...

  2. Bootstrap-Plugin:附加导航(Affix)插件

    ylbtech-Bootstrap-Plugin:附加导航(Affix)插件 1.返回顶部 1. Bootstrap 附加导航(Affix)插件 附加导航(Affix)插件允许某个 <div&g ...

  3. multiboot 的golden image 和update image的 mcs文件的生成及调试

    multiboot的功能对于不同的FPGA应该是相同的,但是具体的配置可能不一样.基本流程如下: 上图来源是xapp1246,  明显分为5个步骤,在FPGA启动时是有flash的0地址开始,但是因为 ...

  4. [Python] numpy.sum

    import numpy as np #Syntax: numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._ ...

  5. python新里程

    为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...

  6. 在WebBrowser中发送POST请求

    我们要用到的也是WebBrowser的“Navigate”方法,其函数原型如下所示: Sub Navigate(URL As String, [Flags], [TargetFrameName], [ ...

  7. URL的名称设置

    1. 对于login.html 此为跳转文件, 加入了参数nid,在views.py中进行关于request.POST.get()的文件中获取 <a href='/detail?nid={{k} ...

  8. Selenium+TestNG+Maven 搭建

    Java环境配置 Eclipse配置TestNG Eclipse配置Maven pom.xml文件相关配置,添加依赖selenium和TestNg的jar包 <!-- https://mvnre ...

  9. 搭建https+nginx服务器

    搭建https+nginx的服务器,主要是安装ngnix和使用openssl生成自签证书,并在nginx中配置的过程   一.安装环境 1.安装opnssl(ssl支持) https://www.op ...

  10. 32-python代码打包成exe文件-pyinstaller

    安装 pyinstaller: pip install pyinstall 简单使用 最简单的使用方式是运行 pyinstaller myscript.py 来生成可执行文件,其中 myscript. ...