Выпустить Android Camera без перезагрузки? - PullRequest
17 голосов
/ 15 ноября 2011

Я сейчас пытаюсь заставить камеру работать в моем приложении, и у меня возникают проблемы со всем этим camera.release(); Я делаю довольно сложные вещи, и нет простого способа просто позвонить camera.release(), поэтому я должен продолжать пробовать новые способы, но каждый раз, когда я ошибаюсь, мое приложение вылетает (как и ожидалось), оставляя камеру не выпущенной. Итак, чтобы снова протестировать мое приложение, мне нужно перезагрузить телефон, чтобы обновить камеру.

Есть ли способ освободить камеру через терминал или DDMS, или это единственный способ освободить ее, перезагрузив мой телефон? Это становится довольно старым, особенно когда маленькая ошибка приводит к потере времени, ожидающего перезагрузки моего телефона.

Спасибо!

Ответы [ 5 ]

16 голосов
/ 11 ноября 2013

Управление ресурсами камеры осуществляется службой Android Camera (libcameraservice.so). Процесс, который запускает Camera Service, mediaserver. Если вы перезапустите коммуникационный сервер, вы фактически снимите все блокировки камеры.

Для этого у вас должен быть root-доступ adb.

Запустите adb shell; su, чтобы получить командную строку root.

root@m0:/ # ps|grep media
media     1901  1     129268 6168  ffffffff 4026d470 S /system/bin/mediaserver
media_rw  1909  1     3064   1380  ffffffff 4015f1ac S /system/bin/sdcard
u0_a19    22821 1899  484316 21588 ffffffff 4016d574 S android.process.media
root@m0:/ # kill 1901
kill 1901

Медиасервер должен быть запущен автоматически.

Android 7.0

В последней версии Android есть двоичный файл mediaserver, разбитый на несколько выделенных двоичных файлов для обеспечения безопасности. Подробнее читайте в официальной документации .

Так что вместо mediaserver вы должны искать cameraserver. Не проверено, хотя.

3 голосов
/ 24 июня 2013

Я не уверен, есть ли способ перезагрузить камеру через терминал или DDMS, но я добился большого успеха, положив мой вызов на Camera.release() в методе onPause() моей активности, поэтому камера получает выпущен всякий раз, когда приложение переходит в фоновый режим. Точно так же, моя инициализация камеры происходит в onResume(), поэтому камера будет открыта при первом запуске, затем отпущена и повторно инициализирована снова, когда ваше приложение перемещается в фоновый режим и обратно. Эта техника полностью устранила проблему, которую вы описываете для меня.

Если проблема не устранена для вас, также рассмотрите возможность упаковки кода, который может привести к сбою, в try / catch, где вы ловите любой Exception и делаете вызов, чтобы освободить камеру в этом блоке catch. Я обычно использую эту технику для ошибок, которые можно сгладить, не закрывая приложение, однако я считаю, что это будет работать во всех случаях.

3 голосов
/ 10 июля 2012

Я нашел способ решить эту проблему. Настройка -----> Приложения ------> Управление приложениями -----> Камера ---> Очистить данные, тогда проблема решена

1 голос
/ 11 марта 2015

Вот решение, которое устанавливает UncaughtExceptionHandler: https://stackoverflow.com/a/17336974/755804

Выпускает камеру, когда приложение умирает.

0 голосов
/ 27 июня 2013

Ну, я искал похожий ответ, я нашел этот пост ниже, который может решить проблему

Идеальный способ установить глобальный обработчик необработанных исключений в Android

Вы можете отпустить камеру на UncaughtException

...