Android Camera简述

         好吧,别人的分析都是系统层面的==,我这算是酱油文章么?默默路过T^T。
 
一、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照相

Camera照相

 
2.2)Camera摄像

Camera摄像

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

相机调用

 
2)自定义相机

自定义相机

 
3)摄像调用

摄像调用

 
4)自定义摄像

自定义摄像