您的位置:首页 > 移动开发

MTK camera 4.2 app PhotoActor(2013/4)

2014-12-07 17:30 615 查看


前言

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事件

以普通拍照为例。 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: