热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android开发——自定义相机(Camera)开发总结

最近这段时间我一直在开发自定义相机,谷歌了些网上的demo,发现有很多各种各样的问题。最终还是从API的camera类开始学习,进行改进。

最近这段时间我一直在开发自定义相机,谷歌了些网上的demo,发现有很多各种各样的问题。最终还是从API的camera类开始学习,进行改进。下面对之前的实现进行一些总结。

官方camera API:
http://developer.android.com/guide/topics/media/camera.html
中文翻译:
http://www.cnblogs.com/over140/archive/2011/11/16/2251344.html

自定义相机大致实现流程:

这里写图片描述
预览Camera这一块,有三个类可以实现:Surfaceview、GLSurfaceView、TextureView。Android4.0自带Camera应用采用SurfaceView预览,Android4.2采用GLSurfaceView来预览。Android4.4采用TextureView。
这三者的区别和联系请看这篇文章 Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
我这里总结采用Surfaceview预览camera的自定义相机开发。

1. Manifest声明
确保在清单文件加入Camera权限,存储权限等等。
2. 创建预览类
使用SurfaceView控件实现摄像头实时预览画面。
SurfaceView是View的子类,所以它拥有View的一切方法和属性。同时多出的Surface专门用来绘制的类。
SurfaceView有以下三个特点:

A. 具有独立的绘图表面;B. 需要在宿主窗口上挖一个洞来显示自己;C. 它的UI绘制可以在独立的线程中进行,这样就可以进行复杂的UI绘制,并且不会影响应用程序的主线程响应用户输入。

来自 Android视图SurfaceView的实现原理分析
创建一个继承surfaceView和实现SurfaceHolder.Callback的类,SurfaceHolder.CallBack用来监听Surface的变化,实现三个方法:
(1)surfaceCreated(SurfaceHolder holder):在该类创建的时候调用。进行打开camera操作,如何实现看下一步。
(2)surfaceChanged(SurfaceHolder holder, int format, int width,int height):在surface改变时候调用,这里实现图形的绘制。进行开始预览操作,如何实现看下一步。
(3)surfaceDestroyed(SurfaceHolder holder):在surface销毁时候调用,这里一般对资源进行释放。进行释放摄像头等操作。
3. 封装CameraInterface类
采用单例模式创建CameraInterface类,里面操作Camera的检测、打开、预览、拍照、关闭以及保存图片的回调。

CheckCamera(Context mContext)
doOpenCamera(Context mContext,int cameraId)
doStartPreview(SurfaceHolder holder, float previewRate)
doStopCamera()
...

这样在上一步里,我们只需获得CameraInterface实例后直接调用方法。这种方式使Camera的逻辑和界面的UI耦合度降低。同时也保证了程序的扩展性和可重用性。
4. 创建自定义布局

第二步的摄像预览类必须被放入一个activity的layout中,连同其它用户界面控件一起(拍照按钮,摄像头切换),实现拍照或摄像功能。这里注意要采用FrameLayout容纳摄像预览类,可以把附加的图片信息或控件叠加到实时预览画面上。比如要实现中间亮四周暗的实时预览界面,则我们需要在这里自定义view。
5. 创建相机Activity
这里就是控件注册,监听控件点击事件等。
同样的takePicture拍照,切换摄像头后重新创建相机实例都封装在CameraInterface类中。
6. 拍照以及保存图片
拍照会在上一步控件点击事件发生,触发mCamera.takePicture(mShutterCallback, mRawCallback, mJpegPictureCallback);
这里需要实现拍照的快门声音、拍照保存照片的回调方法。同样都在单例类CameraInterface中实现。
同时要注意需求,如果拍照后继续实时预览,则要再次触发doStartPreview。如果是跳转到预览Activity则通过Intent进行跳转。
7. 释放摄像头

/*** 停止预览,释放Camera*/public void doStopCamera(){if(null != mCamera){mCamera.setPreviewCallback(null);mCamera.stopPreview(); isPreviewing = false; mPreviwRate = -1f;mCamera.release();mCamera = null; }}


推荐阅读
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 本文探讨了SSD购买后是否需要进行4K对齐的问题,并详细解释了4K对齐的原理及其重要性。通过对比机械硬盘与固态硬盘的结构,文章深入分析了4K对齐对SSD性能的影响,并提供了具体的对齐方法。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 在项目需要国际化处理时,即支持多种语言切换的功能,通常有两种方案:单个包和多个包。本文将重点讨论单个包的实现方法。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • 使用 Jupyter Notebook 实现 Markdown 编写与代码运行
    Jupyter Notebook 是一个开源的基于网页的应用程序,允许用户在同一文档中编写 Markdown 文本和运行多种编程语言的代码,并实时查看运行结果。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文介绍了在 iOS 开发中设置图片和视图圆角的几种方法,包括通过 layer 设置圆角、使用贝塞尔曲线和 Core Graphics 框架,以及使用 CAShapeLayer 和 UIBezierPath。每种方法都有其优缺点,适用于不同的场景。 ... [详细]
author-avatar
nct6778550
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有