Правильная обработка исключения: "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 не обрабатывает исключение, мне действительно интересно узнать, есть ли другая причина.
Ответы
Ответ 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
Объекты камеры всегда заблокированы по умолчанию
поэтому, когда вы можете разблокировать метод, вы позволяете другим процессам использовать ваши параметры
поэтому убедитесь, что вы заперли камеру перед получением параметров