MTK camera 4.2 app PhotoActor(2013/4)

前言

PhotoActor是Camera APP中一个十分重要的类,负责拍照行为。 
在之前的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介绍)

注册OnShutterButtonListener
Camera先取得CameraActor的OnShutterButtonListener实例,将其封装到成员变量mPhotoShutterListener(代理),将mPhotoShutterListener通过ShutterManager注册到ShutterButton

监听event事件
以普通拍照为例。 


发布了27 篇原创文章 · 获赞 2 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wlia/article/details/41788859