最近忙于项目中Camera的种种,由于大多数热衷于交流的Android开发者是在模拟器上进行开发,在涉及到硬件相关的实践内容上,(例如此刻我将记录的有关于Camera的变焦问题),网上可查询和借鉴的资料真是少的可怜。不过想想也是,项目中具体硬件的相关信息调试过程也不便公之于众。我不写细节,说说思路吧。
我所遇到的camera的变焦问题是这样的:
zoom value 满足于区间:[0,28],平均对应smooth zoom的效果是放大1倍到8倍。
我将smoothzoom 从*1 拖到 *8 的Log:
V/camera (30714): Zoom changed: value=1. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=2. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=3. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=4. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=5. stopped=true
D/camera (30714): ^_^ ZOOM_STOPPING
V/camera (30714): Zoom changed: value=7. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=8. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=10. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=12. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=15. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=18. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=21. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=24. stopped=false
D/camera (30714): ^_^ ZOOM_START
V/camera (30714): Zoom changed: value=28. stopped=true
D/camera (30714): ^_^ ZOOM_START
(注意:value=28不代表是28倍,而是8倍)
按上面的Log分析看来,逻辑十分错乱,按道理说stopped参数为true时,zoom为停止。value 1-5的true值让我费解。这个在真机上实际效果就是,在取景画面中看到是a倍的场景,但是拍出的照片确实b倍的效果……
更为可怕的是,当自动测试zoom N个来回后,重复启动camera,满屏的I2C ERROR 告诉我camera挂掉了……如果找不出问题所在,我也要挂掉了……
Camera部分文件量较大,同名也多,不得不先做个梳理,理清思路。
Camera.cpp的路径我没有写,是有原因的。
对于上层应用来说,camera.cpp是最为直接的函数调用和实现,可以参考阅读framework/base/libs/camera/Camera.cpp ,但是在硬件设备确定的情况下,是根据硬件的功能具体实现整合到实际项目中的某一路径的,习惯上来讲放在hardware/下,至于怎么编译进来那是另外一方面的内容了。
启动camera,首先对zoom进行初始化,如果硬件不支持zoom,那么直接return了。
支持,使mSmoothZoomSupported置为true。
ZoomListener
implements android.hardware.Camera.OnZoomChangeListener { |
当接到zoom改变信号的时候
其实抛开I2C的问题,仅仅明确这几个操作就足以解决问题。今天实在太累了,下回接着写好了 —_—||
欢迎驱动牛人多多交流camera I2C 方面的经验。