camera拍照过程中花屏问题

来源:互联网 发布:tf idf算法python实现 编辑:程序博客网 时间:2024/05/16 11:31

在以前做的一个对产品的综合测试程序中,最近测到的一个低概率出现的问题。程序测试了产品各项功能,包括相机。拍照是通过一个定时器切换两路摄像头并拍照,然后在onPictrueTaken()方法中处理数据,之后再重新startPreview()。

花屏的问题重现不容易,有时出现了发现时已经过了一段时间,不能现场抓取log。这时可以在/data/anr/traces.txt中碰碰运气,它记录了整个系统中ANR及死锁发生时进程和线程的一些信息,或许可以找到蛛丝马迹。运气不错,可以看到是onPictureTaken()之后startPreview时的异常

----- pid 3203 at 2014-05-09 11:22:44 -----Cmd line: com.lyt.brtest_func04DALVIK THREADS:(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)"main" prio=5 tid=1 NATIVE  | group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xce70  | sysTid=3203 nice=0 sched=0/0 cgrp=default handle=-1345006528  at android.hardware.Camera.startPreview(Native Method)  at com.lyt.brtest_func04.Br_test_funcActivity.onPictureTaken(Br_test_funcActivity.java:312)  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:529)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:123)  at android.app.ActivityThread.main(ActivityThread.java:3647)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:507)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)  at dalvik.system.NativeStart.main(Native Method)

外国友人也遇到了同样的问题:

I checked in SecCameraHWInterface.cpp and mCaptureInProgress is still set to true when calling different callbacks. mCaptureInProgress is checked when calling startPreview and returning an error if value is true.Problem is we don't have any information to check if pictureThread() is terminated or not before to restart preview.

原来这里我加了500ms的延时,如果在onPictureTaken()中不加任何延时会立即得到这样的错误:

05-15 10:32:41.363: E/CameraHardwareSec(68): virtual android::status_t android::CameraHardwareSec::startPreview() : capture in progress, not allowed05-15 10:32:41.367: E/AndroidRuntime(3411): FATAL EXCEPTION: main05-15 10:32:41.367: E/AndroidRuntime(3411): java.lang.RuntimeException: startPreview failed05-15 10:32:41.367: E/AndroidRuntime(3411): at android.hardware.Camera.startPreview(Native Method)05-15 10:32:41.367: E/AndroidRuntime(3411): at com.lyt.brtest_func04.Br_test_funcActivity.onPictureTaken(Br_test_funcActivity.java:310)05-15 10:32:41.367: E/AndroidRuntime(3411): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:529)05-15 10:32:41.367: E/AndroidRuntime(3411): at android.os.Handler.dispatchMessage(Handler.java:99)05-15 10:32:41.367: E/AndroidRuntime(3411): at android.os.Looper.loop(Looper.java:123)05-15 10:32:41.367: E/AndroidRuntime(3411): at android.app.ActivityThread.main(ActivityThread.java:3647)05-15 10:32:41.367: E/AndroidRuntime(3411): at java.lang.reflect.Method.invokeNative(Native Method)05-15 10:32:41.367: E/AndroidRuntime(3411): at java.lang.reflect.Method.invoke(Method.java:507)05-15 10:32:41.367: E/AndroidRuntime(3411): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)05-15 10:32:41.367: E/AndroidRuntime(3411): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)05-15 10:32:41.367: E/AndroidRuntime(3411): at dalvik.system.NativeStart.main(Native Method)

暂时没办法,只能通过加长等待时间来避免这个问题。或者修改系统源码通过广播来获悉 pictureThread()结束,然后再开始预览。此处我修改为2s延时,开始测试,后续提供测试结果。


0 0
原创粉丝点击