一、Camera

package android.hardware

 
         该类用于设定图像捕获设置,开启/关闭预览,抓拍图片以及获取帧用于编码视频。这个类是Camera服务的客户端,用于管理真实的照相机硬件。

为了能够访问照相机,你必须在你的Android Manifest内声明CAMERA权限。同时确保包括了<uses-feature>节点元素,来声明你所使用的camera功能。例如,如果你使用了照相机的自动对焦功能,你的Manifest应当包括以下内容:

  1. <uses-permission android:name="android.permission.CAMERA" />
  2. <uses-feature android:name="android.hardware.camera" />
  3. <uses-feature android:name="android.hardware.camera.autofocus" />
         用该类拍照的执行步骤:
         1. 通过open(int)函数,获得一个Camera实例。
         2. 通过getParameters()函数,获得已有的设置(默认)。
         3. 如果需要的话,调用setParameters(Camera.Parameters)函数,修改第二步返回的Camera.Parameters对象。
         4. 如果需要的话,调用setDisplayOrientation(int)函数,设置屏幕水平或垂直。
         5. 重要:传递一个已初始化好的SurfaceHolder对象给setPreviewDisplay(SurfaceHolder)函数。如果没有surface,camera将无法打开预览。
         6. 重要:调用startPreview()函数开始更新预览surface。预览必须在你照相前启动。
         7. 在你想要捕获一张照片时,调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)函数。等待回调函数中给出的实际图像数据。
         8. 在照相后,预览显示将会停止。如果要照更多相片,需要再次调用startPreview()函数(回至第六步)。
         9. 调用stopPreview()函数,停止更新预览surface。
         10. 重要:调用release()函数,释放camera引用,以便其他应用使用。应用应当在onPause()调用时立刻释放camera引用(在onResume()时重新打开它)。
 
         快速转换到视频录像模式,用以下步骤:
         1. 如上所述,获取一个初始化好的Camera对象并开启预览。
         2. 调用unlock()函数,以允许media进程得以访问camera。
         3. 传递当前camera对象至setCamera(Camera)函数。请查看MediaRecorder关于视频录制的信息。
         4. 当结束录制时,调用reconnect()函数重新取的和加锁camera对象。
         5. 如上所述,调用stopPreview()和release()函数,结束拍摄。
 
         这个类是线程不安全的,意味着是通过event线程使用的该类。大多数长时间运行的操作(预览、聚焦、拍照等)都是非同步的,并且是在需要的时候才会回调。而这些回调函数是在event线程open(int)函数被调用时触发的。所以,该类的方法一定不能在多线程内调用。
         警告:不同的Android设备有不同的硬件规格,如兆像素等级和自动对焦性能。为了使你的应用和更多设备兼容,最好不要限制camera规格。
 
         翻译自:官方SDK文档(无聊的紧啊==)。
 
二、照相
1)系统相机
1.1)调用方式
         系统相机的入口Action:MediaStore.ACTION_IMAGE_CAPTURE。只需以startActivityForResult(…)启动该Activity即可。
 
1.2)处理方式
         在onActivityResult(…)中,处理返回信息。
 
2)自定义相机
2.1)照相预览
         继承SufaceView写自己的预览界面,继而放到你的照相Activity的布局里。可以写个照相监听接口,用于在Activity里处理这些照相操作。
 
2.2)照相活动
         就是我们自己做的照相Activity了。完成后调用自己的相机,也就是跳转入这个Activity。而获得照片后,可以直接处理或者存入媒体库。
 
2.3)照相调用
         以startActivityForResult(…)方式跳转入照相Activity,在拍完照片后setResult(…)返回。建议存入媒体库,将照片的uri返回。直接data数据的话,多拍时,是承受不了的==。
         ps:Android给每个应用都设置了内存上限。系统层修改的话,参见博文《如何修改Android应用程序能够使用的默认最大内存值》。
 
2.4)照相处理
         在onActivityResult(…)中,处理返回信息。
 
三、摄像
1)系统摄像
         系统摄像的入口Action:MediaStore.ACTION_VIDEO_CAPTURE。视频捕捉intent可以包含以下附带信息:
         MediaStore.EXTRA_OUTPUT——本设置需要一个Uri,用于指定保存视频的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置值,那么摄像应用将会把所请求的视频以默认文件名和路径进行保存,并将数据置入intent的Intent.getData()部分返回。
         MediaStore.EXTRA_VIDEO_QUALITY——本值用0表示最低品质及最小的文件尺寸,用1表示最高品质和较大的文件尺寸。
         MediaStore.EXTRA_DURATION_LIMIT——本值用于限制所捕获视频的长度,以秒为单位。
         MediaStore.EXTRA_SIZE_LIMIT——本值用于限制所捕获视频的文件尺寸,以字节为单位。
 
2)自定义摄像
2.1)流程简述
         Android框架的视频捕捉需要对Camera对象进行仔细的管理,还要与MediaRecorder类一起协同工作。使用Camera录制视频时,必须管理好Camera.lock()与Camera.unlock()的调用,使得MediaRecorder能够顺利访问摄像头硬件,并且还要进行Camera.open()和Camera.release()调用。
         注意:自Android 4.0 (API level 14) 开始,Camera.lock()和 Camera.unlock()调用由系统自动管理。
         与用摄像头拍照不同,视频捕获必需十分精确地按顺序进行调用。必须按照特定的顺序来执行,应用程序才能成功地准备并捕获视频,详细步骤如下。
1. 打开摄像头——用Camera.open()来获得一个camera对象的实例。
2. 连接预览——用Camera.setPreviewDisplay()将camera连接到一个SurfaceView,准备实时预览。
3. 开始预览——调用 Camera.startPreview()开始显示实时摄像画面。
4. 开始录制视频——严格按照以下顺序执行才能成功录制视频:
         a. 解锁Camera——调用Camera.unlock()解锁,便于MediaRecorder使用摄像头。
         b. 配置MediaRecorder——按照如下顺序调用MediaRecorder中的方法。详情请参阅MediaRecorder参考文档。
                  1. setCamera()——用当前Camera实例将摄像头用途设置为视频捕捉。
                  2. setAudioSource()——用MediaRecorder.AudioSource.CAMCORDER设置音频源。
                  3. setVideoSource()——用MediaRecorder.VideoSource.CAMERA设置视频源。
                  4. 设置视频输出格式和编码格式。对于Android 2.2 (API Level 8) 以上版本,使用MediaRecorder.setProfile方法,并用CamcorderProfile.get()来获取一个profile实例。对于Android prior to 2.2以上版本,必须设置视频输出格式和编码参数:
                           i. setOutputFormat()——设置输出格式,指定缺省设置或MediaRecorder.OutputFormat.MPEG_4。
                           ii. setAudioEncoder()——设置声音编码类型。指定缺省设置或MediaRecorder.AudioEncoder.AMR_NB。
                           iii. setVideoEncoder()——设置视频编码类型,指定缺省设置或者 MediaRecorder.VideoEncoder.MPEG_4_SP。
                  5. setOutputFile()——用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()设置输出文件,见保存媒体文件一节中的方法示例。
                  6. setPreviewDisplay()——用上面连接预览中设置的对象来指定应用程序的SurfaceView预览layout元素。
                  警告: 必须按照如下顺序调用MediaRecorder的下列配置方法,否则应用程序将会引发错误,录像也将失败。
         c. 准备MediaRecorder——调用MediaRecorder.prepare()设置配置,准备好MediaRecorder。
         d. 启动MediaRecorder——调用MediaRecorder.start()开始录制视频。
5. 停止录制视频——按照顺序调用以下方法,才能成功完成视频录制:
         a. 停止MediaRecorder——调用MediaRecorder.stop()停止录制视频。
         b. 重置MediaRecorder——这是可选步骤,调用MediaRecorder.reset()删除recorder中的配置信息。
         c. 释放MediaRecorder——调用MediaRecorder.release()释放MediaRecorder。
         d. 锁定摄像头——用Camera.lock()锁定摄像头,使得以后MediaRecorder session能够使用它。自Android 4.0 (API level 14)开始,不再需要本调用了,除非MediaRecorder.prepare()调用失败。
6. 停止预览——activity使用完摄像头后,应用Camera.stopPreview()停止预览。
7. 释放摄像头——使用Camera.release()释放摄像头,使其它应用程序可以使用它。
注意: 也可以不必先创建摄像头预览就使用MediaRecorder,并跳过本节开始的几步。不过,因为用户一般都希望在开始录像前看到预览画面,这里就不讨论那类过程了。
 
         摘录自:后记->参阅内容1
 
2.2)摄像预览
         摄像头预览类,用于嵌入一个View布局中。其实现了SurfaceHolder.Callback接口来捕捉view创建和销毁时的回调事件。
 
2.3)摄像活动
         按官方开发者指南里的流程实现的(参阅2.1流程简述)。但这不同版本和硬件下有些问题==,在代码里有稍带说明。
         ps:至于想要实现一个优秀的Camera摄像,请看后记->参阅内容2。
 
2.4)摄像调用

以startActivity (…)方式跳转入摄像Activity即可。当然也可以用startActivityForResult(…),在摄像完成后setResult(…)返回^^。

 
四、后记
1)参阅内容

1.1)SDK docs->Dev Guide->Multimedia and Camera->Camera

         ps:译文亦收录在Android中文翻译组->Android开发指南->框架主题->多媒体与摄像头->摄像头(好热情的一帮家伙==,大家都多多支持他们啊^^)
 
1.2)Camera摄像在不同版本不同硬件环境下不通用==
         想实现更优秀的方式,请参考Sipdroid开源项目^^
         Google Code:http://code.google.com/p/sipdroid/
         参考文件:org.sipdroid.sipua.ui包下的VideoPreview.java&VideoCamera*.java
         ps:可以考虑学习下该开源项目,求入手分析资料啊T^T
 
2)模块概览
2.1)Camera照相

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="Camera照相" src="http://img1.51cto.com/attachment/201204/083106502.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

 
2.2)Camera摄像

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="Camera摄像" src="http://img1.51cto.com/attachment/201204/083106968.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

 
3)运行效果
1)相机调用

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="相机调用" src="http://img1.51cto.com/attachment/201204/083106369.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

 
2)自定义相机

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="自定义相机" src="http://img1.51cto.com/attachment/201204/083106280.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

 
3)摄像调用

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="摄像调用" src="http://img1.51cto.com/attachment/201204/083408332.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

 
4)自定义摄像

<img onmouseup="" onclick="" onkeypress="" onabort="" onmouseover="" ondblclick="" onresize="" onmousemove="" onkeyup="" onmousedown="" onfocus="" onmouseout="" onerror="" onkeydown="" style="border-top:medium none;border-right:medium none;vertical-align:top;border-bottom:medium none;padding-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:medium none;padding-right:0px;" border="0" alt="自定义摄像" src="http://img1.51cto.com/attachment/201204/083205699.png" onsubmit="" onchange="" onunload="" onselect="" onreset="" onload="if(this.width>650) this.width=650;" data-ke-onblur="" />

转自:http://blog.csdn.net/jixianghao/article/details/23283649

安卓Camera APP的更多相关文章

  1. 中国首个 SaaS 模式的云告警平台安卓版 APP 上线

    今年一月底,国内首个 SaaS 模式的云告警平台 OneAlert 正式发布了 iOS 版 App 客户端,今天上午,安卓版 App 客户端也正式上线了!每个安卓用户,无需电脑,都可以通过手机全程跟踪 ...

  2. angularjs中安卓原生APP调用H5页面js函数,js写法应注意

    安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...

  3. Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

    源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机 ...

  4. 将H5页面打包成安卓原生app

    第一步:下载HBuilderX,新建项目选择5+App新建一个空项目如下图 新建后项目目录结构如下图 第二步,将你要打包成安卓app的文件打包,最后生成的文件目录如下图 1.打包完成后,将对应文件内容 ...

  5. 第十九章节 BJROBOT 安卓手机 APP 导航【ROS全开源阿克曼转向智能网联无人驾驶车】

    导航前说明:一定要确保你小车在构建好地图的基础上进行! 1.把小车平放在你想要构建地图区域的地板上,打开资料里的虚拟机,打开一个终端, ssh 过去主控端启动roslaunch znjrobot br ...

  6. 第十八章节 BJROBOT 安卓手机 APP 建地图【ROS全开源阿克曼转向智能网联无人驾驶车】

    1.把小车平放在地板上,用资料里的虚拟机,打开一个终端 ssh 过去主控端启动roslaunch znjrobotbringup.launch 2.在虚拟机端再打开一个终端,ssh 过去主控端启动ro ...

  7. 安卓版App开发心得

    从2016年4月到6月主要做的工作是网站的开发,而6月到现在2016年8月初,主要做的工作是Android和IOS两种App的开发,又以Android为主. 将这段时间的Android开发心得记录如下 ...

  8. 安卓手机APP压力monkey测试

    一.Monkey概述 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行 ...

  9. Android 创建自己的Camera App

    在sdk中找到/sdk/docs/guide/topics/media/camera.html#custom-camera,里面有详细的api参考 在清单文件中添加相应的权限: <uses-pe ...

随机推荐

  1. JNDI Tomcat

    1.JNDI的诞生及简介简介 1)服务器数据源配置的诞生 JDBC阶段: 一开始是使用JDBC来连接操作数据库的: 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Cl ...

  2. C++中template的.h文件和.cpp文件的问题

    在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错.如类似下面代码: //test.h文件 #ifndef TE ...

  3. Beaglebone Black教程项目1闪烁板载LED

    Beaglebone Black教程项目1闪烁板载LED 项目1闪烁板载LED 当设置完你的Beaglebone Black的时候,可能早就非常期待你的第一个项目了.下面就来满足大家的愿望,当然,这个 ...

  4. 【BZOJ 1815】【SHOI 2006】color 有色图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1815 这道题好难啊,组合数学什么根本不会啊qwq 题解详见08年的Pólya计数论文. 主要思想是只 ...

  5. Gym 101128F Sheldon Numbers(网络流)

    [题目链接] http://codeforces.com/gym/101128/attachments [题目大意] 给出一张地图,分为高地和低地,高低地的交界线上划有红线, 现在要开小车跨过每条红线 ...

  6. BZOJ 3391 [Usaco2004 Dec]Tree Cutting网络破坏(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3391 [题目大意] 给定一棵树,求分支size均不大于一半点数的点 [题解] 递归的同 ...

  7. 【推导】【数学期望】Gym - 101237D - Short Enough Task

    按照回文子串的奇偶分类讨论,分别计算其对答案的贡献,然后奇偶分别进行求和. 推导出来,化简一下……发现奇数也好,偶数也好,都可以拆成一个等比数列求和,以及一个可以错位相减的数列求和. 然后用高中数学知 ...

  8. 【状态压缩DP】NOIP2005-river过河

    [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看 ...

  9. Codeforces Round #344 (Div. 2) A. Interview 水题

    A. Interview 题目连接: http://www.codeforces.com/contest/631/problem/A Description Blake is a CEO of a l ...

  10. 使用Busybox制作CRAMFS文件系统成功

    转:http://www.360doc.com/content/11/1013/22/7775902_155877501.shtml 这几天在使用Busybox制作FS2410开发板的CRAMFS文件 ...