Android Camera源码分析
fmms
13年前
<div style="text-align:left;"> <span style="font-size:16px;">android通过android.hardware.Camera类来控制摄像头设备的,要使用只有通过android.hardware.Camera.open()来打开,这样就会创建一个新的Camera对象。</span> </div> <p style="text-align:left;padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;"><span style="font-size:16px;">android提供了一些接口来给予回调,控制Camera的状态,</span></p> <p style="text-align:left;padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;"><span style="font-size:16px;">分别是: <br /> 1.android.hardware.Camera.ErrorCallback:摄像头出错的时候调用,这个接口具有一个void onError(int error,Camera camera)函数;其中,</span></p> <p style="text-align:left;padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;"><span style="font-size:16px;">前者表示数据类型,取值是Camera类中的常量CAMERA_ERROR_UNKNOWN或者是 CAMERA_ERROR_SERVICE_DIED;</span></p> <p style="text-align:left;padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;"><span style="font-size:16px;">前者是不明错误,后者是表示服务已经关闭,</span></p> <p style="text-align:left;padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;"><span style="font-size:16px;">在这种情况下需要释放当前的Camera对象,然后再初 始化一个。</span></p> <p></p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">2.android.hardware.camera.PreviewCallback:在图像预览时调用,这个接口有一个void onPreviewFrame(byte[] data,Camera camera);参数data为每帧图像的数据流。我们可以根据实际需要来实现这个接口。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">3.android.hardware.Camera.ShutterCallback:在图像预览的时候调用,这个接口具有一个void onShutter();<br /> 可以在改函数中通知用户快门已经关闭,例如播放一个声音。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">4.android.hardware.Camera.PictureCallback:当拍摄相片的时候调用,该接口具有一个void onPictureTaken(byte[] data,Camera camera)函数;参数和预览的一样。在android中主要有三个类实现了这个接口,分别是PostViewPictureCallback、 RawPictureCallback、JepgPictureCallback。我们可以根据需要定义自己需要的类。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">5.android.hardware.Camera.AutoFocusCallback:当自动对焦时候调用,该接口具有一个void onAutoFocus(boolean success,Camera camera)函数;</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">6.还提供了放大缩小的监听器android.hardware.Camera.OnZoomChangeListener。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">private final class ZoomListener implements android.hardware.Camera.OnZoomChangeListener {<br /> public void onZoomChange(int value, boolean stopped, android.hardware.Camera camera) ;</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">当取得照片的数据流后可以通过BitmapFactory的decodeByteArray()函数来解析图片。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">另外还可以通过Camera对象的getParameters()函数来得到一个android.hardware.Camera.Parameters 对象,Parameters提供了一些接口来设置Camera的属性:</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">1.setPictureFormat(int pixel_format):设置图片的格式,其取值为PixelFormat YCbCr_420_SP、PixelFormatRGB_565或者PixelFormatJPEG。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">2.setPreviewFormat(int pixel_format):设置图片的预览格式,取值如上。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">3.setPictureSize(int width,int height):设置图片的高度和宽度,单位为像素。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">4.setPreviewSize(int width,int height):设置预览的高度和宽度,取值如上。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">5.setPreviewFrameRate(int fps):设置图片预览的帧速。 在设置好Camera的参数后,可以通过函数void startPreview()开始预览图像、void stopPreview()结束预览,通过autoFocus(AutoFocusCallback cb)来自动对焦,最后可以通过takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg)函数来拍照。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">该函数有三个参数,分别为快门回调接口、原生图像数据接口和压缩格式图片数据接口。</p> <p style="padding-bottom:0px;line-height:26px;margin:0px 0px 1em;padding-left:0px;padding-right:0px;color:#6d6d6d;padding-top:0px;">如果数据格式不存在的话数据流为空,如果不需要 实现这些接口则这些参数取值可以为null。<br /> <br /> 来自:http://blog.csdn.net/itachi85/article/details/6759975</p>