Android 在摄像机之间切换,在Nexus S上崩溃

Android 在摄像机之间切换,在Nexus S上崩溃,android,android-camera,Android,Android Camera,在后向和前向摄像头之间切换时,我在Nexus S(Android 4.1.2)上遇到以下错误: 紧接着是: 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

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

紧接着是:

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()
之前,我在后向摄像头预览上调用了
stopReview()
,但这是事实。同样的代码也适用于其他设备(如Galaxy Nexus、Nexus 4)

除了选择两台相机都可用的预览尺寸外,还有人知道如何解决这个问题吗?这个解决方案可能会奏效,但我无法确保两台相机之间有一个共同的预览大小,再加上它人为地限制了预览大小

谢谢

更新

这里有一个来自LogCat的较长转储,显示我停止预览,然后稍后启动并崩溃。这一个显示了通过
postdayed()
添加的人工一秒延迟;这并没有解决问题:

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

我发现了我的问题。我还没来得及打开预览模式,后来设置预览大小时就出现了问题


这个故事的寓意是:当你有疑问时,在你每次使用
相机时设置断点,并确保事件的顺序是你认为的那样。

我发现了我的问题。我还没来得及打开预览模式,后来设置预览大小时就出现了问题


这个故事的寓意是:当有疑问时,在你使用的每一个
相机上设置断点,并确保事件的顺序是你认为的那样。

三星的承诺似乎正在修复一个类似的崩溃,但它被合并回姜饼中(我想你正在运行JB?)。除此之外,我只找到了第1598行实际触发错误的地方。预览是在它自己的线程上,但是浏览代码,锁看起来是正常的。这仍然可能是一种竞赛条件,我会尝试添加sleep()s.@Deylan:“我假设你在运行JB?”--是的,4.1.2。“我会尝试添加sleep()s”--在停止和启动预览之间1000毫秒的
postDelayed()
没有帮助。我添加了一个较长的LogCat块,从调用
stopPreview()
到异常。从日志消息来看,这几乎就像是
stopPreview()
被破坏了一样,因为Nexus s似乎认为没有运行预览,这我无法解释。我建议做两件事中的一件-1)从默认摄像头应用程序的摄像头更改中捕获日志,并比较代码流,或者更好,2)咨询官方摄像头应用程序的来源(即,
switchCamera()
@2245)。我没有使用摄像头API,但看代码,他们实际上完全停止并释放摄像头,而不仅仅是停止预览。@Delyan:“他们实际上完全停止并释放摄像头,而不仅仅是停止预览”--是的,事实证明,我也是。我刚刚确认旧相机会在新相机打开之前释放——行为没有改变。我将浏览剩下的
switchCamera()
,看看他们还能做些什么来解决问题。谢谢三星的承诺似乎正在修复类似的崩溃,但它早在姜饼中就被合并了(我想你是在运行JB?)。除此之外,我只找到了第1598行实际触发错误的地方。预览是在它自己的线程上,但是浏览代码,锁看起来是正常的。这仍然可能是一种竞赛条件,我会尝试添加sleep()s.@Deylan:“我假设你在运行JB?”--是的,4.1.2。“我会尝试添加sleep()s”--在停止和启动预览之间1000毫秒的
postDelayed()
没有帮助。我添加了一个较长的LogCat块,从调用
stopPreview()
到异常。从日志消息来看,这几乎就像是
stopPreview()
被破坏了一样,因为Nexus s似乎认为没有运行预览,这我无法解释。我建议做两件事中的一件-1)从默认摄像头应用程序的摄像头更改中捕获日志,并比较代码流,或者更好,2)咨询官方摄像头应用程序的来源(即,
switchCamera()
@2245)。我没有使用摄像头API,但看代码,他们实际上完全停止并释放摄像头,而不仅仅是停止预览。@Delyan:“他们实际上完全停止并释放摄像头,而不仅仅是停止预览”--是的,事实证明,我也是。我刚刚确认旧相机会在新相机打开之前释放——行为没有改变。我将浏览剩下的
switchCamera()
,看看他们还能做些什么来解决问题。谢谢
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)
...