热门标签 | 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; }}


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
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社区 版权所有