2013-04-07 3 views

ответ

8

Вы можете проверить его, используя метод 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

Глядя в the source code of Camera, its JNI counterpart, и, наконец, the native code для подключения камеры с помощью службы, оказывается, что единственный способ определить, если камера используется непосредственно через результат 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; 
} 

Чтобы лучше понять основные потоки нативного кода камеры, see this thread.

6

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

Попытка открыть камеру, чтобы проверить, если исключение работает хорошо, если уровень API ниже 23. В уровне API 23, обслуживание камеры отличается, чем раньше, от official docs:

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

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

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

Смежные вопросы