Intereting Posts
Как разрешить java.lang.AssertionError при создании OkHttpClient в mockito? Скрыть верхнюю панель меню в моем устройстве Android & Tablet Nexus 4 не показывает файлы через MTP Не останавливайте анимацию в списке Элемент Android ActionBar с текстом Как всегда отображать вкладки ActionBar ниже ActionBar в Android Не удается полностью избавиться от цвета подсветки клавиш в приложении Phonegap 3.0 на Android 4.1.2 Android – Как определить, выбрал ли пользователь, чтобы поделиться с Facebook или Twitter с помощью намерений? Как проверить, включено ли местоположение и приоритет API 18 и ниже Предоставление приложения Android разрешения android.permission.INTERNET при отладке на устройстве Соотношение сторон ConstraintLayout Не удается найти класс com.google.android.gms.location.LocationClient (android) Метод android finish () не очищает приложение из памяти «Аниматоры могут запускаться только в потоках Looper» во время тестирования внутриутробного интрументации RecyclerView onClick

Как проверить, открыта ли камера любым приложением

Есть ли способ проверить, открыта ли камера или нет? Я не хочу открывать камеру, я просто хочу проверить ее статус .

Solutions Collecting From Web of "Как проверить, открыта ли камера любым приложением"

Вы можете проверить его с помощью метода Camera.open(cameraId) .

Создает новый объект камеры для доступа к конкретной аппаратной камере. Если одна и та же камера открыта другими приложениями, это вызовет исключение RuntimeException.

Выбрасывает RuntimeException
Если сбой камеры невозможен (например, если камера используется другим процессом или диспетчер политики устройства отключил камеру).

Обновить:

Пример:

 public boolean isCameraUsebyApp() { Camera camera = null; try { camera = Camera.open(); } catch (RuntimeException e) { return true; } finally { if (camera != null) camera.release(); } return false; } 

Вы можете использовать этот метод для использования, как предложил Павел, но помните, что этот метод сначала приобретает камеру.

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

Его RuntimeException означает, что камера используется другим процессом или диспетчер политики устройства отключил камеру.

Если версия вашего устройства API выше 21, CameraManager.AvailabilityCallback может быть хорошим выбором.

Вам необходимо сначала получить диспетчер камеры системы со следующим кодом:

 CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

Затем вам необходимо зарегистрировать AvailabilityCallback :

 CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() { @Override public void onCameraAvailable(String cameraId) { super.onCameraAvailable(cameraId); //Do your work } @Override public void onCameraUnavailable(String cameraId) { super.onCameraUnavailable(cameraId); //Do your work } }, yourHandler); } 

Это работает лучше, если версия API выше 21. Вы можете обратиться к CameraManager , CameraManager.AvailabilityCallback и всему пакету

Пытаться открыть камеру, чтобы проверить, не выбрасывается ли исключение, хорошо работает, если уровень API ниже 23. На уровне API 23 служба камеры отличается от предыдущей , начиная с официальных документов :

Доступ к ресурсам подсистемы камеры, включая открытие и настройку устройства камеры, присуждается на основе «приоритета» процесса клиентского приложения. Процессы приложений с видимыми на вид пользователя или переднего плана обычно получают более высокий приоритет, что делает приобретение ресурсов камеры и более надежным.

Активные клиенты камеры для приложений с более низким приоритетом могут быть «выселены», когда приложение с более высоким приоритетом пытается использовать камеру. В устаревшем API-интерфейсе камеры это приводит к вызову onError () для выведенного клиента. В API Camera2 это приводит к вызову onDisconnected () для выведенного клиента.

Мы видим, что в API 23 или выше попытка открыть камеру, используемую другим приложением / процессом, приведет к захвату камеры из приложения / процесса, который ее использует, вместо получения RuntimeException .

Заглядывая в исходный код камеры , ее коллеги JNI и, наконец, собственный код для подключения камеры к сервису, кажется, что единственный способ определить, используется ли камера непосредственно, – это результат Camera::connect(jint) .

Проблема в том, что этот родной код доступен только через функцию JNI android_hardware_Camera_native_setup(JNIEnv*, jobject, jobject, jint) , которая устанавливает камеру для использования при создании экземпляра камеры из Java в new Camera(int) .

Короче говоря, это не представляется возможным. Вам придется попытаться открыть камеру, и если она не удалась, предположите, что она используется другим приложением. Например:

 public boolean isCameraInUse() { Camera c = null; try { c = Camera.open(); } catch (RuntimeException e) { return true; } finally { if (c != null) c.release(); } return false; } 

Чтобы лучше понять базовый поток собственного кода камеры, см. Эту тему .