2013-06-30 36 views
1

当后面向和前置摄像头之间的切换,我运行成在Nexus S(的Android 4.1.2)以下错误:来切换摄像机,崩溃之间上Nexus S的

E/CameraHardwareSec(90): ERR(virtual android::status_t android::CameraHardwareSec::setParameters(const android::CameraParameters&)): preview is running, cannot change size and format! 

这后面紧跟着:

06-30 16:43:38.961: E/AndroidRuntime(10946): java.lang.RuntimeException: setParameters failed 
06-30 16:43:38.961: E/AndroidRuntime(10946): at android.hardware.Camera.native_setParameters(Native Method) 
06-30 16:43:38.961: E/AndroidRuntime(10946): at android.hardware.Camera.setParameters(Camera.java:1410) 
06-30 16:43:38.961: E/AndroidRuntime(10946): at com.commonsware.cwac.camera.CameraView.initPreview(CameraView.java:279) 
06-30 16:43:38.961: E/AndroidRuntime(10946): at com.commonsware.cwac.camera.TexturePreviewStrategy.onSurfaceTextureAvailable(TexturePreviewStrategy.java:45) 
06-30 16:43:38.961: E/AndroidRuntime(10946): at android.view.TextureView.getHardwareLayer(TextureView.java:368) 
... 

尽管这是事实,我呼吁我的后置摄像头预览stopPreview()调用setParameters()一个新的预览大小(适用于FFC)前。相同的代码适用于其他设备(例如,Galaxy Nexus,Nexus 4)。

有没有人有一个想法解决这个问题,除了选择两个相机可用的预览大小?该解决方案可以工作,但我无法确保在两台摄像机之间有公共预览尺寸,并且它人为地限制了预览尺寸。

谢谢!

UPDATE

这里是logcat的一个较长的转储,显示我的预览停止,然后再启动它和崩溃。这一个显示了通过postDelayed()添加的人为的一秒延迟;这并没有解决问题:

06-30 17:20:14.375: D/CameraView(12663): stopping preview 
06-30 17:20:14.414: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): calling mSecCamera->stopPreview() and waiting 
06-30 17:20:14.492: I/CameraHardwareSec(90): void android::CameraHardwareSec::stopPreviewInternal() : preview not running, doing nothing 
06-30 17:20:14.492: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): return from wait 
06-30 17:20:14.492: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): exiting 
06-30 17:20:14.500: W/SecCamera(90): int android::SecCamera::stopPreview(): doing nothing because m_flag_camera_start is zero 
06-30 17:20:14.507: W/SecCamera(90): int android::SecCamera::stopRecord(): doing nothing because m_flag_record_start is zero 
06-30 17:20:14.507: I/SecCamera(90): DeinitCamera: m_cam_fd(39) 
06-30 17:20:14.523: I/SecCamera(90): DeinitCamera: m_cam_fd2(40) 
06-30 17:20:14.550: E/CameraHardwareSec(90): preview window is NULL! 
06-30 17:20:14.550: I/CameraService(90): Destroying camera 0 
06-30 17:20:14.550: I/CameraHardwareSec(90): int android::HAL_camera_device_close(hw_device_t*) 
06-30 17:20:14.550: I/SecCamera(90): DeinitCamera : already deinitialized 
06-30 17:20:14.554: W/AudioFlinger(90): session id 206 not found for pid 90 
06-30 17:20:14.558: W/AudioFlinger(90): session id 207 not found for pid 90 
06-30 17:20:15.480: E/DemoCameraHost(12663): facing: 0, useFFC: true 
06-30 17:20:15.480: E/DemoCameraHost(12663): facing: 1, useFFC: true 
06-30 17:20:15.480: I/CameraService(90): Opening camera 1 
06-30 17:20:15.480: I/CameraHardwareSec(90): int android::HAL_camera_device_open(const hw_module_t*, char const*, hw_device_t**): open camera 1 
06-30 17:20:15.484: E/SecCamera(90): initCamera: m_cam_fd(39), m_jpeg_fd(0) 
06-30 17:20:15.484: I/SecCamera(90): Name of input channel[1] is S5KA3DFX 
06-30 17:20:15.496: E/SecCamera(90): initCamera: m_cam_fd2(40) 
06-30 17:20:15.496: I/SecCamera(90): Name of input channel[1] is S5KA3DFX 
06-30 17:20:15.496: I/SecCamera(90): initCamera : initialized 
06-30 17:20:15.496: I/SecCamera(90): Name of input channel[1] is S5KA3DFX 
06-30 17:20:15.496: I/CameraHardwareSec(90): int android::HAL_camera_device_open(const hw_module_t*, char const*, hw_device_t**): opened camera 1 (0x412688a8) 
06-30 17:20:15.496: I/AwesomePlayer(90): setDataSource_l('/system/media/audio/ui/camera_click.ogg') 
06-30 17:20:15.504: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): starting 
06-30 17:20:15.504: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): calling mSecCamera->stopPreview() and waiting 
06-30 17:20:15.507: W/SecCamera(90): int android::SecCamera::stopPreview(): doing nothing because m_flag_camera_start is zero 
06-30 17:20:15.515: D/dalvikvm(12663): GC_CONCURRENT freed 159K, 4% free 8249K/8519K, paused 53ms+7ms, total 98ms 
06-30 17:20:15.519: I/AwesomePlayer(90): setDataSource_l('/system/media/audio/ui/VideoRecord.ogg') 
06-30 17:20:15.535: I/CameraHardwareSec(90): void android::CameraHardwareSec::stopPreviewInternal() : preview not running, doing nothing 
06-30 17:20:15.535: E/CameraHardwareSec(90): preview window is NULL! 
06-30 17:20:15.539: I/CameraHardwareSec(90): virtual android::status_t android::CameraHardwareSec::startPreview() : deferring 
06-30 17:20:15.640: D/CameraHardwareSec(90): mPreviewHeap(fd(39), size(460800), width(640), height(480)) 
06-30 17:20:15.640: I/CameraHardwareSec(90): int android::CameraHardwareSec::previewThreadWrapper(): return from wait 
06-30 17:20:15.640: D/CameraView(12663): initPreview() called, setting up 320 x 240 
06-30 17:20:15.644: E/CameraHardwareSec(90): ERR(virtual android::status_t android::CameraHardwareSec::setParameters(const android::CameraParameters&)): preview is running, cannot change size and format! 
06-30 17:20:15.648: D/AndroidRuntime(12663): Shutting down VM 
06-30 17:20:15.648: W/dalvikvm(12663): threadid=1: thread exiting with uncaught exception (group=0x40c33300) 
06-30 17:20:15.679: E/AndroidRuntime(12663): FATAL EXCEPTION: main 
06-30 17:20:15.679: E/AndroidRuntime(12663): java.lang.RuntimeException: setParameters failed 
06-30 17:20:15.679: E/AndroidRuntime(12663): at android.hardware.Camera.native_setParameters(Native Method) 
06-30 17:20:15.679: E/AndroidRuntime(12663): at android.hardware.Camera.setParameters(Camera.java:1410) 
06-30 17:20:15.679: E/AndroidRuntime(12663): at com.commonsware.cwac.camera.CameraView.initPreview(CameraView.java:280) 
06-30 17:20:15.679: E/AndroidRuntime(12663): at com.commonsware.cwac.camera.TexturePreviewStrategy.onSurfaceTextureAvailable(TexturePreviewStrategy.java:45) 
06-30 17:20:15.679: E/AndroidRuntime(12663): at android.view.TextureView.getHardwareLayer(TextureView.java:368) 
... 
+0

有三星提交的[this](https://android.googlesource.com/device/samsung/crespo/+/7ac60f8c902354ba14013054f92013a9616a3221)似乎正在修复类似的崩溃,但它被合并回姜饼(I假设你在运行JB?)。除此之外,我只发现线1598 [这里](https://android.googlesource.com/device/samsung/crespo/+/jb-release/libcamera/SecCameraHWInterface.cpp)错误实际触发的地方。预览是在自己的线程中进行的,但通过代码浏览,锁看起来很健全。它可能仍然是一个竞争条件,我会尝试添加睡眠()。 – Delyan

+0

@德兰:“我假设你在跑JB?” - 是的,4.1.2。 “我会尝试添加sleep()s” - 停止和启动预览之间的1000ms的postDelayed()没有帮助。我在通过异常调用'stopPreview()'之前添加了一个更长的LogCat块。从日志消息来看,就好像'stopPreview()'被破坏了,因为Nexus S似乎认为没有预览正在运行,这是我无法解释的。 – CommonsWare

+0

我建议两件事情之一 - 1)从相机捕获logcat从默认相机应用程序更改并比较代码流,或者甚至更好,2)咨询官方相机应用程序的源代码(即'switchCamera()' @ 2245 [here](https://android.googlesource.com/platform/packages/apps/Camera/+/android-4.1.2_r2/src/com/android/camera/Camera.java))。我没有使用相机API,但查看代码,他们实际上完全停止并释放相机,而不仅仅是停止预览。 – Delyan

回答

4

我发现我的问题。在我以为是之前,我开启了预览模式,这在我稍后设置预览大小时会导致问题。

这个故事的寓意:如有疑问,请在Camera的每一个用途上设置断点,并确保事件顺序与您的想法相符。

相关问题