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

时间:2013-02-18 17:10:28

标签: android android-camera

我在安装了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。 (除非在一个案例中他们抓住它,关闭相机,然后重新抛出它)。

有没有正确的方法来解决这个问题?

如果没有,这种情况经常发生这种情况吗?

注意: 在任何一天,我都有5k到8k的活跃用户。在这些例外中有40-70之间。对我来说,这似乎真的。我知道有一些合法的例子,相机可能无法初始化。但1%的用户似乎不合理。此外,由于Android相机应用程序不处理异常,它真的让我想知道是否还有其他根本原因。

4 个答案:

答案 0 :(得分:31)

就我而言,我收到了这个错误:

  

getParameters失败(空参数)

解锁相机后我打电话给getParameters()。因此,请在致电getParameters()之前致电camera.unlock()

答案 1 :(得分:29)

正如+ Eddy Talvala所说,当相机处于不良状态时会发生这种情况。

相机如何处于不良状态?

1)可能最常见的原因是关闭/释放相机,然后仍然使用它。如果您在多个线程上使用Camera对象而不同步Camera的访问权限,则此问题尤其严重。确保您一次只有一个线程访问Camera

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

问题是我在相机预览仍处于活动状态时呼叫SurfaceTexture.release()。这导致Camera服务崩溃,这导致了问题中解释的问题。

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

答案 2 :(得分:3)

是否有特定的Android设备遇到此错误?或者你在许多设备上看到它。

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

它也可能是设备专用摄像机代码中的错误,或摄像机代码堆栈中某处的罕见竞争条件。如果没有更多细节(来自此类崩溃的logcat或Android bug报告),则无法分辨 - 错误本身只是说设备特定的摄像头代码返回了一组空的参数。

但是一旦你得到这个错误,你就无法做很多事情 - 相机子系统处于某种奇怪的状态。如果你想尝试处理它,我建议的就是关闭并重新打开相机设备。

答案 3 :(得分:1)

默认情况下,相机对象始终处于锁定状态 因此,当您可以解锁方法时,您允许其他过程使用您的参数 所以请确保在获取参数之前锁定相机