44

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

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

4 回答 4

36

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

getParameters 失败(空参数)

当我getParameters()解锁相机后打电话时。所以,请在打电话getParameters()之前先打电话camera.unlock()

于 2014-02-25T08:44:43.017 回答
29

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

相机如何进入不良状态?

1) 最常见的原因可能是关闭/释放相机,但之后仍在使用它。如果您Camera在多个线程上使用对象而不同步访问Camera. 确保您一次只有一个线程访问Camera

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

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

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

于 2013-04-20T17:51:15.257 回答
3

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

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

它也可能是特定于设备的相机代码中的错误,或者是相机代码堆栈中某处的罕见竞争条件。如果没有更多详细信息(来自此类崩溃的 logcat 或 Android 错误报告),则无法判断 - 错误本身只是表示特定于设备的相机代码返回了一组空参数。

但是一旦你得到这个错误,你就无能为力了——相机子系统处于某种奇怪的状态。如果您想尝试处理它,我只能建议关闭并重新打开相机设备。

于 2013-02-18T19:39:37.983 回答
1

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

于 2016-08-08T13:31:05.813 回答