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事件
以普通拍照为例。
相关文章推荐
- MTK camera 4.2 app 启动时读取设置(2013/8)
- MTK camera 4.2 app UI elements 介绍(2013/4)
- MTK camera 4.2 app 启动时设置对界面的影响(2013/9)
- MTK camera 4.2 APP基本结构(2013/4)
- MTK camera 4.2 app SettingManager界面响应流程(2013/5)
- MTK camera 4.2 app PreferenceGroup生成过程(2013/8)
- MTK camera 4.2 UI layout 结构(2013/4)
- MTK camera 4.2 UI layout 结构(2013/4)
- MTK camera 4.2 app Camera类中的showXXX()状态变化与提示(2013/7)
- MTK Android Camera 运行流程-app到底层
- MTK平台Camera app中的模式切换概述
- python3.6+BeautifulSoup4.2 爬取各类app应用信息并下载app包
- 解决小米miui系统调用系统裁剪图片功能camera.action.CROP后崩溃或重新打开app的问题
- xcode8 iOS10上关于NSPhotoLibraryUsageDescription NSCameraUsageDescription 等问题
- MTK平台添加Camera设备信息
- Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。
- [笔记分享] [Camera] MTK Camera基础知识二
- 让Xcode 4.2生成的app支持旧版iOS设备(armv6)
- 基于MTK平台的camera 移植总结
- Andriod4.2 Camera 架构与实现