正确处理exception:“getParameters失败(空参数)”

我在安装了Google Analytics的Google Play商店中安装了相机应用程序。 我不断收到以下的崩溃报告:

getParameters失败(空参数)

我的问题是: 处理这个问题的正确方法什么?

看看Android发生的地方并没有给我任何额外的细节。 该错误在android_hardware_Camera.cpp中抛出:

String8 params8 = camera->getParameters(); if (params8.isEmpty()) { jniThrowRuntimeException(env, "getParameters failed (empty parameters)"); return 0; } 

看着开源的Android相机,看看它是如何处理的情况也不是很有帮助。 调用getParameters时,该代码似乎没有捕获RuntimeException。 (除了在一个他们抓住它的情况下,closures相机,然后重新推出它)。

有没有一个正确的方法来处理这个?

如果不是,这是否有这样的原因经常发生?

注:在任何一天,我有5K – 8K活跃用户。 在这些例外的40-70之间。 这对我来说似乎很高。 我知道有相机可能无法初始化的合法实例。 但1%的用户似乎不合理。 此外,由于Android相机应用程序不处理这个exception,这真的让我怀疑是否有其他的根本原因。

Solutions Collecting From Web of "正确处理exception:“getParameters失败(空参数)”"

在我的情况下,我得到这个错误:

getParameters失败(空参数)

当我解锁相机后调用getParameters() 。 所以,请在调用camera.unlock()之前调用getParameters() camera.unlock()

As + Eddy Talvala提到,当相机处于不良状态时会发生这种情况。

相机如何进入不良状态?

1)可能最常见的原因是closures/释放相机,同时仍然使用它。 如果您在多个线程上使用Camera对象而没有同步对Camera访问,这可能会特别成问题。 确保你一次只有一个线程访问Camera

2)在我的情况下,这有点棘手。 我使用SurfaceTexture以便可以将相机输出用作OpenGL纹理。 在Android 4.0(ICS)中,有一个新的方法SurfaceTexture.release() 。 这个方法在使用SurfaceTexture时很重要,因为它比以前更快地清理内存。

问题是,我打电话SurfaceTexture.release()而相机预览仍然活跃。 这是崩溃的Camera服务,这是造成问题中解释的问题。

在我的情况下,我通过延迟调用SurfaceTexture.release()来修复它,直到我用新的SurfaceTexturereplaceSurfaceTexture 。 这样我就可以确定SurfaceTexture可以清理干净,没有任何不良的副作用。

有没有一个特定的Android设备,遇到这个错误? 或者你是否看过很多设备。

一般来说,你不应该看到这种错误。 有可能你的应用程序有某种竞争条件导致了这种情况,但它必须涉及尝试在未初始化的或已经发布的相机上调用getParameters。

这也可能是设备特定相机代码中的错误,或者相机代码堆栈中某处稀有的竞争条件。 没有更多的细节(logcat或Android崩溃的bug报告),不可能告诉 – 错误本身只是说设备特定的摄像头代码返回一个空的参数集。

但是,一旦你得到这个错误,没有什么可以做的 – 相机子系统处于一些奇怪的状态。 如果你想尝试处理它,我所能build议的就是closures并重新打开相机设备。

相机对象总是被默认locking,所以当你可以解锁方法,那么你允许其他procceses使用你的参数,所以确保你在获取参数之前重新locking相机