Android 学习之Camera拍照流程
2014-01-20 09:31
435 查看
最近在看Android 4.2.2上的Camera的源码,仔细看了下拍照的流程,从点击拍照按钮到成像保存为图片,整个流程分析如下:
1、
点击拍照按钮图标会执行ShutterButton类中的drawableStateChanged方法,接着调用callshutterButtonFocus(boolean
flag)方法,接着会调用OnShutterButtonListener接口中的onShutterButtonFocus(boolean
flag)方法。
2、
在PhotoModule类中执行onShutterButtonFocus(boolean
pressed)方法,在该方法中判断按下的状态,如果按下就调用FocusOverlayManager类中的onShutterDown()方法,接着调用autoFocus()方法,在该方法中又调用Listener接口中的autoFocus()方法,回调PhotoModule类中的autoFocus()方法。
3、
在autoFocus方法中调用setCameraState(FOCUSING),接下来会调用内部类AutoFocusCallback的onAutoFocus(boolean
focused, android.hardware.Camera camera)方法,初始化相机后,接着调用FocusOverlayManager类中的onAutoFocus(boolean
focused, boolean shutterButtonPressed)方法,在该方法中处理mState为STATE_FOCUSING的逻辑。
4、
执行ShutterButton类中的performClick()方法,主要用来响应按下ShutterButton事件,接着回调PhotoModule类中的onShutterButtonClick()方法,接着调用onSnap方法,接下来调用FocusOverlayManager类中的doSnap()方法,接着调用capture方法,接着又回调PhotoModule类中的capture方法(关键)。
5、
拍照按钮的状态发生变化,pressed值由true变为false,继续调用ShutterButton类中的callShutterButtonFocus方法,调用OnShutterButtonListener接口中的onShutterButtonFocus()方法,在PhotoModule类的onShutterButtonFocus(boolean
pressed)方法中直接返回,回调实现了ShutterCallback接口的类ShutterCallback里面的onShutter方法。
图1 UI层类之间调用流程
6、
底层(HAL)调用UI(APP)的接口实现抽象类AbstractShotMode中的public void onPictureTaken(byte[] data,
Camera camera)方法,回调PhotoModule类中的public void onLastPictureTaken(boolean isNeedStartPreview)方法。
7、
在onLastPictureTaken方法中又调用restartPreview()方法,接着调用setupPreview()方法,在该方法中调用startPreview方法,流程如下startPreview(int
updateSet)->setCameraParameters(int updateSet) ->updateCameraParametersInitialize()-> setPreviewSize(),在上述流程中的setCameraParameters方法中继续调用updateCameraParametersPreference()方法(关键),底层回调FeaturePictureCallback接口中的onQuickThumbnail(byte[]
data)方法,在该方法中调用PhotoModule类中的onQuickThumbnail(byte[] data, boolean isGenUrlEarlier)方法,返回到startPreview方法里。
8、
在抽象类AbstractShotMode中onPictureTaken方法(关键)中执行FeaturePictureCallback接口中的onFakePictureTaken()方法,接着会执行CommonFeaturePictureCallback回调接口中的onFakePictureTaken()方法,再调用PhotoModule类中的onFakePictureTaken方法,继续调用接口中的storeImage(byte[]
jpegData, int postWidth, int postHeight,boolean isHdr, boolean updateThumbnail)。
图2 底层调用UI层处理流程
1、
点击拍照按钮图标会执行ShutterButton类中的drawableStateChanged方法,接着调用callshutterButtonFocus(boolean
flag)方法,接着会调用OnShutterButtonListener接口中的onShutterButtonFocus(boolean
flag)方法。
2、
在PhotoModule类中执行onShutterButtonFocus(boolean
pressed)方法,在该方法中判断按下的状态,如果按下就调用FocusOverlayManager类中的onShutterDown()方法,接着调用autoFocus()方法,在该方法中又调用Listener接口中的autoFocus()方法,回调PhotoModule类中的autoFocus()方法。
3、
在autoFocus方法中调用setCameraState(FOCUSING),接下来会调用内部类AutoFocusCallback的onAutoFocus(boolean
focused, android.hardware.Camera camera)方法,初始化相机后,接着调用FocusOverlayManager类中的onAutoFocus(boolean
focused, boolean shutterButtonPressed)方法,在该方法中处理mState为STATE_FOCUSING的逻辑。
4、
执行ShutterButton类中的performClick()方法,主要用来响应按下ShutterButton事件,接着回调PhotoModule类中的onShutterButtonClick()方法,接着调用onSnap方法,接下来调用FocusOverlayManager类中的doSnap()方法,接着调用capture方法,接着又回调PhotoModule类中的capture方法(关键)。
5、
拍照按钮的状态发生变化,pressed值由true变为false,继续调用ShutterButton类中的callShutterButtonFocus方法,调用OnShutterButtonListener接口中的onShutterButtonFocus()方法,在PhotoModule类的onShutterButtonFocus(boolean
pressed)方法中直接返回,回调实现了ShutterCallback接口的类ShutterCallback里面的onShutter方法。
图1 UI层类之间调用流程
6、
底层(HAL)调用UI(APP)的接口实现抽象类AbstractShotMode中的public void onPictureTaken(byte[] data,
Camera camera)方法,回调PhotoModule类中的public void onLastPictureTaken(boolean isNeedStartPreview)方法。
7、
在onLastPictureTaken方法中又调用restartPreview()方法,接着调用setupPreview()方法,在该方法中调用startPreview方法,流程如下startPreview(int
updateSet)->setCameraParameters(int updateSet) ->updateCameraParametersInitialize()-> setPreviewSize(),在上述流程中的setCameraParameters方法中继续调用updateCameraParametersPreference()方法(关键),底层回调FeaturePictureCallback接口中的onQuickThumbnail(byte[]
data)方法,在该方法中调用PhotoModule类中的onQuickThumbnail(byte[] data, boolean isGenUrlEarlier)方法,返回到startPreview方法里。
8、
在抽象类AbstractShotMode中onPictureTaken方法(关键)中执行FeaturePictureCallback接口中的onFakePictureTaken()方法,接着会执行CommonFeaturePictureCallback回调接口中的onFakePictureTaken()方法,再调用PhotoModule类中的onFakePictureTaken方法,继续调用接口中的storeImage(byte[]
jpegData, int postWidth, int postHeight,boolean isHdr, boolean updateThumbnail)。
图2 底层调用UI层处理流程
相关文章推荐
- Android之Camera拍照插值算法 &&Android4.2之Camera系统HAL调用流程
- Android Camera fw学习(五)-takepicutre(STILL_TAKEPICTURE)流程分析
- Android学习之APK的安装流程
- 学习Android中拍照与录像
- android从应用到驱动之—camera(1)---程序调用流程
- android中Mms学习笔记——彩信(mms)发送流程和就收流程(四)
- Android Camera调用流程
- android 手机拍照上传项目的开发-----Camera1.0(动态显示预览)
- 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo
- MTK Android Camera 运行流程
- (转)android从应用到驱动之—camera(1)---程序调用流程
- Android Camera之SurfaceView学习
- Android 中camera 、 Matrix 和画图进阶学习
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- Androd选取相册照片和拍照处理-android学习之旅(62)
- Android FM模块学习之一 FM启动流程
- 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
- Android 长按电源键关机整个流程小学习
- android自定义Camera实现录像和拍照
- Android扩展 - 拍照篇(Camera)