近期这段时间我一直在开发自己定义相机。谷歌了些网上的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中,连同其他用户界面控件一起(拍照button。摄像头切换)。实现拍照或摄像功能。这里注意要採用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;
}
}

android开发——自己定义相机(Camera)开发总结的更多相关文章

  1. 【Android】自己定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)

    ~转载请注明http://blog.csdn.net/u013015161/article/details/46921257 介绍 这几天.写了一个自己定义照相机的demo.支持连续拍照和摄像头切换. ...

  2. Android实现自定义的相机

    使用系统相机 android中使用系统相机是很方便的,单这仅仅是简单的使用而已,并不能获得什么特殊的效果. 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 < ...

  3. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  4. 迟来的Android的Camera开发总结

    这是好久前写的项目,但一直没有去总结.刚好在准备找工作这段时间来总结自己做过的东西,学到的东西. 写Android的自定义的相机应用时,首先要知道一些Camera开发必须知道的尺寸,不然在调试的时候, ...

  5. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  6. Android 让他们自己控制开发的定义(一个)

    作为一个创意开发.或软件UI设计要求比较高,你经常会遇到的情况来圣安德鲁斯控制不符合您的需求.这样的时候.件.同一时候.安卓也同意你去继承已经存在的控件或者实现你自己的控件以便优化界面和创造更加丰富的 ...

  7. Android 音视频开发(四):使用 Camera API 采集视频数据

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  8. Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

    参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...

  9. 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)

    转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...

随机推荐

  1. 关于scarpy的一些说明

    一  scrapy添加代理 1 内置代理:os.environ. 固定格式,不推荐 os.environ['http_proxy'] = "http://root:woshiniba@192 ...

  2. 单线程实现并发——协程,gevent模块

    一 并发的本质 1 切换 2 保存状态 二 协程的概念 协程,又称微线程,纤程.英文名Coroutine.单线程下实现并发,用户从应用程序级别控制单线程下任务的切换,注意一定是遇到I/O才切. 协程的 ...

  3. angular杂谈

    <element ng-include="filename" onload="expression" autoscroll="expressio ...

  4. linux内核学习之四:进程切换简述【转】

    转自:http://www.cnblogs.com/xiongyuanxiong/p/3531884.html 在讲述专业知识前,先讲讲我学习linux内核使用的入门书籍:<深入理解linux内 ...

  5. 标准C程序设计七---34

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  6. GSMArena battery life test

    GSMArena battery life test Battery Endurance Score = [ Battery Capacity / ( call hrs * a + Browsing ...

  7. php的fastcgi_finish_request()函数

    php的fastcgi_finish_request()函数 功能: 此函数冲刷(flush)所有响应的数据给客户端并结束请求. 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行. 返回值: ...

  8. php--转码函数

    最近在用dedecms二次开发会员功能:大家都知道dedecms编码是GBK格式的:所以在我们在项目中经常需要转码,在我了解中有两种转码方式:一是:iconv:二是mb_convert_encodin ...

  9. mysql into outfile 导出

    <sql> into outfile 'xxx.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; <sql> 表示 ...

  10. 洛谷——P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...