Подтвердить что ты не робот

Правильная обработка исключения: "getParameters failed (пустые параметры)"

У меня есть приложение для камеры в магазине 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, чтобы увидеть, как она справляется с ситуацией, также не очень полезно. Этот код, похоже, не обнаруживает исключение RuntimeException при вызове getParameters. (За исключением одного случая, когда они его поймают, закройте камеру, а затем снимите ее).

Есть ли правильный способ справиться с этим?

Если нет, есть ли причина, по которой это происходит так часто?

Примечание: В любой день у меня есть от 5 до 8 тысяч активных пользователей. С где-то между 40-70 из этих исключений. Мне это кажется очень высоким. Я знаю, что есть законные случаи, когда камера может не инициализироваться. Но 1% пользователей кажутся необоснованными. Кроме того, поскольку приложение для камеры Android не обрабатывает исключение, мне действительно интересно узнать, есть ли другая причина.

4b9b3361

Ответ 1

Как упомянул +Eddy Талвала, это происходит, когда камера находится в плохом состоянии.

Как камера попадает в плохое состояние?

1) Вероятно, наиболее распространенной причиной было бы закрытие/отпускание камеры при ее последующем использовании. Это может быть особенно проблематично, если вы используете объект " Camera в нескольких потоках без синхронизации доступа к Camera. Убедитесь, что у вас есть только один поток, доступ к Camera за один раз.

2) В моем случае это было немного сложнее. Я использую SurfaceTexture чтобы использовать выходные данные камеры в качестве текстуры OpenGL. В Android 4.0 (ICS) появился новый метод SurfaceTexture.release(). Этот метод важно использовать при использовании SurfaceTexture поскольку он очищает память быстрее, чем раньше.

Проблема в том, что я вызывал SurfaceTexture.release() когда предварительный просмотр камеры был еще активен. Это приводило к сбою службы " Camera, что вызывало проблему, описанную в вопросе.

В моем случае я исправил это, отложив вызов SurfaceTexture.release() до тех пор, пока не заменил его на SurfaceTexture. Таким образом, я был уверен, что SurfaceTexture можно очистить без каких-либо побочных эффектов.

Ответ 2

В моем случае я получал эту ошибку:

getParameters не удалось (пустые параметры)

когда я вызвал getParameters() после разблокировки камеры. Итак, позвоните getParameters(), прежде чем позвонить camera.unlock().

Ответ 3

Существует ли определенное устройство Android, которое испытывает эту ошибку? Или вы видите это на многих устройствах.

В общем, вы не должны видеть такую ​​ошибку. Возможно, ваше приложение имеет какое-то гоночное состояние, которое приводит к этому, но для этого нужно будет попытаться вызвать getParameters на неинициализированной или уже выпущенной камере.

Это также может быть ошибка в коде камеры, специфичном для устройства, или в случае редкой гонки где-то в стеке кода камеры. Без каких-либо подробностей (logcat или Android bugreport от такого сбоя) невозможно сказать - сама ошибка просто говорит о том, что код камеры, специфичный для устройства, возвратил пустой набор параметров.

Но как только вы получите эту ошибку, вы не можете многое сделать - подсистема камеры находится в некотором нечетном состоянии. Если вы хотите попытаться справиться с этим, все, что я могу предложить, это закрыть и снова открыть устройство камеры.

Ответ 4

Объекты камеры всегда заблокированы по умолчанию поэтому, когда вы можете разблокировать метод, вы позволяете другим процессам использовать ваши параметры поэтому убедитесь, что вы заперли камеру перед получением параметров