android - 在相机之间切换,在 Nexus S 上崩溃

标签 android android-camera

当在后置和前置摄像头之间切换时,我在 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() 之前在我的后置摄像头预览中调用了).相同的代码适用于其他设备(例如 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)
...

最佳答案

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

这个故事的寓意:当有疑问时,在你对 Camera 的每一次使用中设置断点,并确保事件的顺序与你认为的一样。

关于android - 在相机之间切换,在 Nexus S 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17394718/

相关文章:

android - 未调用入队回调

android - 在 Android 中发送 HTTP DELETE 请求

java - 如何将数据从非 Activity 类传递到android中的 Activity ?

java - 将类型为 class 的变量分配给扩展声明的变量类型的不同类

android - 获取手电筒(闪光灯)状态以在 android M 中切换它

Android使用前置摄像头拍照

android - 如何唯一标识一个安卓设备?

android - 如何在android中保存图像和表面 View ?

android - 如何将 OpenGl 对象添加到 surfaceView 相机中?

安卓相机黑屏