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

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

Ответ 1

Вы можете проверить его, используя метод Camera.open(cameraId).

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

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

Update:

Пример:

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

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

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

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

Ответ 2

Если версия вашего устройства 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.

Ответ 3

Заглядывая в исходный код камеры, его коллега 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;
}

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