【问题标题】:Switching Between Cameras, Crash on Nexus S在相机之间切换,Nexus S 崩溃
【发布时间】:2013-06-30 20:49:02
【问题描述】:

在后置和前置摄像头之间切换时,我在 Nexus S (Android 4.1.2) 上遇到以下错误:

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)
...

尽管我在使用新的预览尺寸(适用于 FFC)调用 setParameters() 之前在我的后置摄像头预览中调用了 stopPreview(),但还是会出现这种情况。相同的代码适用于其他设备(例如 Galaxy Nexus、Nexus 4)。

除了选择两个相机都可用的预览尺寸之外,有没有人知道如何解决这个问题?该解决方案可行,但我无法确保两台相机之间有一个共同的预览尺寸,而且它人为地限制了预览尺寸。

谢谢!

更新

这是来自 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)
...

【问题讨论】:

  • 有来自三星的this 提交似乎正在修复类似的崩溃,但它被合并到 Gingerbread 中(我假设你正在运行 JB?)。除此之外,我只找到了实际触发错误的第 1598 行 here。预览在它自己的线程上,但是浏览代码,锁看起来很正常。它仍然可能是一个竞争条件,我会尝试添加 sleep()s。
  • @Deylan:“我假设你在运行 JB?” ——是的,4.1.2。 “我会尝试添加 sleep()s”——停止和开始预览之间的 1000 毫秒的 postDelayed() 没有帮助。我添加了一个更长的 LogCat 块,就在我通过异常调用 stopPreview() 之前。从日志消息来看,几乎就像stopPreview() 坏了,因为 Nexus S 似乎认为没有预览正在运行,我无法解释。
  • 我建议两件事之一 - 1)从默认相机应用程序的相机更改中捕获 logcat 并比较代码流,或者更好的是,2)咨询官方相机应用程序的源代码(即switchCamera()@2245here)。我没有使用相机 API,但查看代码,它们实际上完全停止并释放相机,而不仅仅是停止预览。
  • @Delyan:“他们实际上完全停止并释放相机,而不仅仅是停止预览” - 是的,事实证明,我也是。我刚刚再次确认旧相机将在之前发布新相机打开了——行为没有改变。我会浏览switchCamera() 的其余部分,看看他们还能做些什么来解决问题。谢谢!

标签: android android-camera


【解决方案1】:

我发现了我的问题。之前我以为我打开了预览模式,这导致我后来设置预览大小时出现问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2012-03-11
    • 1970-01-01
    • 2015-05-04
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多