前言
PhotoActor是Camera APP中一个十分重要的类,负责拍照行为。
在之前的MTK camera 4.2 APP基本结构(2013/4)中做了简单介绍,这里详细分享如何完成一个拍照过程。
在之前的MTK camera 4.2 APP基本结构(2013/4)中做了简单介绍,这里详细分享如何完成一个拍照过程。
思路
直接看这个类会茫然,代码有1500+行,于是,根据拍照流程,逐步熟悉。 看着类中定义的方法和属性,头脑风暴一下需要明白的内容
(优先级从高到底排序;阅读代码时才反应过来的内容也可以加到这里):
- 一个定焦镜头最简单的拍照流程:点击拍照键->拍照->保存。
- 变焦镜头相机,则要保证拍照前完成了对焦:点击拍照键->对焦(对焦完成)->拍照->保存。(PS:此过程可以优化,如果触屏点击对焦后,短时间用户没有移动相机,则可以直接拍照)
- 拍照是下发参数让硬件完成,所以要考虑硬件的状态。如果此时硬件的状态不适合拍照,如:没有open,没有start preview完成,刚完成拍照正在吐拍出的数据,等等。那么这个时候不能进行拍照。所以,必须要硬件idle时才能拍照。
- 保存照片需要进行IO操作,所以要新建线程实现对照片的保存。获得了吐出的数据后如何同保存线程交互。
- 生成thumbnail。
- 拍照之前存储空间不够;或者拍完照片之后存储空间不够。
- 拍照的时候是否有快门声;有怎样的快门声。
- 点击屏幕,物理按键也可以拍照。
- 音控拍照,微笑拍照则是事件的触发源从拍照键callback变成了音控的callback, smile detection(face detection) callback.
- 计时拍照。
- 对第三方进入的拍照,应该有不同的处理。
- 连拍。
- 连拍没有到最大数量时可以停止。
- 拍照过程,拍完有无动画。
类图
Shutter button event
以OnShutterButtonListener作为事件源分析一个拍照过程。
以下是PhotoActor的拍照log信息。
界面的变化是所以的app view除了thumbnail都会变灰。
(如果截不到Log可以将 Log.LOGV;改为true):
Photo.onShutterButtonFocus(com.android.camera.ui.ShutterButton{42022090 VFED..CL ...P..ID 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}, true) mContinuousShotPerformed=false mCameraClosed=false camera.state=1 mCameraCategory.supportContinuousShot()=true mCamera.isImageCaptureIntent()=false Photo.onShutterButtonClick(com.android.camera.ui.ShutterButton{42022090 VFED..CL ...P.... 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}) Check camera state in ModeActor, mCameraState=1 mCameraClosed=false capture begin Capture time = 562 Photo.onShutterButtonFocus(com.android.camera.ui.ShutterButton{42022090 VF.D...L ........ 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}, false) mContinuousShotPerformed=false mCameraClosed=false camera.state=3 mCameraCategory.supportContinuousShot()=true mCamera.isImageCaptureIntent()=false ShutterCallback onShutter mContinuousShotPerformed=false mStreamID=0 mShutterLag = 749ms RawPictureCallback onPictureTaken rawData=null mShutterToRawCallbackTime = 30ms RawPictureCallback onPictureTaken rawData=null mShutterToRawCallbackTime = 165ms JpegPictureCallback onPictureTaken jpegData=[B@424cbe88 mCameraClosed=false mPictureDisplayedToJpegCallbackTime = 83ms PhotoActor.startPreview stopPreview() mCamera.getCameraState()=3 setFocusParameters sIsAutoFocusCallback =false PhotoActor.getAutoFocusMoveCallback startFaceDetection sFaceDetectionStarted=false isSupportFaceDetect faceDetection=on initializeFaceView sFaceDetectionStarted=true mJpegCallbackFinishTime = 293ms onAutoFocusMoving onAutoFocusMoving onAutoFocusMoving
一段长按拍照键,未触发连拍的log。
界面的变化是所以的app view除了thumbnail都会变灰,然后消失:
Photo.onShutterButtonFocus(com.android.camera.ui.ShutterButton{41917980 VFED..CL ...P..ID 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}, true) mContinuousShotPerformed=false mCameraClosed=false camera.state=1 mCameraCategory.supportContinuousShot()=true mCamera.isImageCaptureIntent()=false onAutoFocusMoving onAutoFocusMoving Photo.onShutterButtonLongPressed(com.android.camera.ui.ShutterButton{41917980 VFED..CL ...P.... 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}) Check camera state in ModeActor, mCameraState=1 mCameraClosed=false initMemory() mMaxMemory=268435456 capture begin Capture time = 356 Photo.onShutterButtonClick(com.android.camera.ui.ShutterButton{41917980 VFED..CL ...P.... 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}) Photo.onShutterButtonFocus(com.android.camera.ui.ShutterButton{41917980 VFED..CL ........ 119,22-237,85 #7f0b0017 app:id/shutter_button_photo}, false) mContinuousShotPerformed=true mCameraClosed=false camera.state=3 mCameraCategory.supportContinuousShot()=true mCamera.isImageCaptureIntent()=false Button up Msg received, start to Cancel continuous shot ShutterCallback onShutter mContinuousShotPerformed=false mStreamID=0 mShutterLag = 817ms RawPictureCallback onPictureTaken rawData=null mShutterToRawCallbackTime = 1ms ShutterCallback onShutter mContinuousShotPerformed=false mStreamID=0 mShutterLag = 818ms PhotoActor.ContinuousShot.onPictureTaken received onPictureTaken, but mCameraClosed=false or mContinuousShotPerformed=false, ignore it Continuous Shot, onPictureTaken: mCurrentShotsNum = 0 mContinuousShotPerformed = false getSuitableContinuousShotSpeed speed=0fps suitableSpeed=0fps Continuous Shot, speed = 0 onContinuousShotDone, pictures saved = 1 updateSavingHint, saving = true shotDone = true msg id=101 updateSavingHint, saving = false shotDone = false PhotoActor.startPreview setFocusParameters sIsAutoFocusCallback =false PhotoActor.getAutoFocusMoveCallback startFaceDetection sFaceDetectionStarted=false isSupportFaceDetect faceDetection=on initializeFaceView sFaceDetectionStarted=true onAutoFocusMoving
event的时序是pressed(true), optional click, pressed(false)。(关于shutter button的行为可以参考另一篇文档UI element介绍)