Android Camera的使用(一) 读书笔记
原文地址
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();
- }
//获得一个相机实例- @Override
- public 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();
- }
- @Override
- public 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>() {
- @Override
- public 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>() {
- @Override
- public 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);
- }
- }
- //相机使用第四步,设置相机预览载体SurfaceHolder
- private void setPreviewDisplay(Camera camera,SurfaceHolder holder){
- try {
- camera.setPreviewDisplay(holder);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void measureSize(int width, int height) {
- super.measureSize(width, height);
- }
//拍照- @Override
- public 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);
- }
- }
- });
- }
- }
Android Camera的使用(一) 读书笔记的更多相关文章
- 《android开发艺术探索》读书笔记(七)--动画
接上篇<android开发艺术探索>读书笔记(六)--Drawable No1: 自定义动画:派生一种新动画只需要继承Animation这个抽象类,然后重写它的initialize和app ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...
- 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程
接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...
- 《android开发艺术探索》读书笔记(十三)--综合技术
接上篇<android开发艺术探索>读书笔记(十二)--Bitmap的加载和Cache No1: 使用CrashHandler来获取应用的crash信息 No2: 在Android中单个d ...
- 《android开发艺术探索》读书笔记(十二)--Bitmap的加载和Cache
接上篇<android开发艺术探索>读书笔记(十一)--Android的线程和线程池 No1: 目前比较常用的缓存策略是LruCache和DiskLruCache,LruCache常被用作 ...
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
接上篇<android开发艺术探索>读书笔记(十)--Android的消息机制 No1: 在Android中可以扮演线程角色的有很多,比如AsyncTask.IntentService.H ...
- 《android开发艺术探索》读书笔记(十)--Android的消息机制
接上篇<android开发艺术探索>读书笔记(九)--四大组件 No1: 消息队列MessageQueue的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表,因为单链表 ...
- 《android开发艺术探索》读书笔记(九)--四大组件
接上篇<android开发艺术探索>读书笔记(八)--WindowManager No1: 四大组件除了BroadcastReceiver,其他三种组件都必须在AndroidManifes ...
- 《android开发艺术探索》读书笔记(八)--WindowManager
接上篇<android开发艺术探索>读书笔记(七)--动画 No1: Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window是很简单的事,只需要通过Windo ...
随机推荐
- MySQL性能调优 – 你必须了解的15个重要变量
1.DEFAULT_STORAGE_ENGINE 如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了.如果没有,确保把你的表转换为InnoDB并且设置d ...
- Bootstrap-Plugin:附加导航(Affix)插件
ylbtech-Bootstrap-Plugin:附加导航(Affix)插件 1.返回顶部 1. Bootstrap 附加导航(Affix)插件 附加导航(Affix)插件允许某个 <div&g ...
- multiboot 的golden image 和update image的 mcs文件的生成及调试
multiboot的功能对于不同的FPGA应该是相同的,但是具体的配置可能不一样.基本流程如下: 上图来源是xapp1246, 明显分为5个步骤,在FPGA启动时是有flash的0地址开始,但是因为 ...
- [Python] numpy.sum
import numpy as np #Syntax: numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._ ...
- python新里程
为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...
- 在WebBrowser中发送POST请求
我们要用到的也是WebBrowser的“Navigate”方法,其函数原型如下所示: Sub Navigate(URL As String, [Flags], [TargetFrameName], [ ...
- URL的名称设置
1. 对于login.html 此为跳转文件, 加入了参数nid,在views.py中进行关于request.POST.get()的文件中获取 <a href='/detail?nid={{k} ...
- Selenium+TestNG+Maven 搭建
Java环境配置 Eclipse配置TestNG Eclipse配置Maven pom.xml文件相关配置,添加依赖selenium和TestNg的jar包 <!-- https://mvnre ...
- 搭建https+nginx服务器
搭建https+nginx的服务器,主要是安装ngnix和使用openssl生成自签证书,并在nginx中配置的过程 一.安装环境 1.安装opnssl(ssl支持) https://www.op ...
- 32-python代码打包成exe文件-pyinstaller
安装 pyinstaller: pip install pyinstall 简单使用 最简单的使用方式是运行 pyinstaller myscript.py 来生成可执行文件,其中 myscript. ...