Примечание. На этой странице рассматривается пакет Camera2. Если вашему приложению не требуются определенные низкоуровневые функции Camera2, рекомендуем использовать CameraX. Обе библиотеки поддерживают Android 5.0 (API уровня 21) и более поздние версии.
Camera2 предоставляет Extensions API для доступа к расширениям, которые производители устройств реализовали на различных устройствах Android. Список поддерживаемых режимов расширения приведен в разделе Расширения камеры.
Список устройств, поддерживающих расширения, можно найти в статье Поддерживаемые устройства.
Архитектура расширений
На изображении ниже показана архитектура расширений камеры.
Приложение Camera2 может использовать расширения через Camera2 API. Camera2 API позволяет запрашивать доступные расширения, настраивать сеанс камеры с расширениями и взаимодействовать с OEM-библиотекой расширений камеры. Это позволяет приложению использовать такие расширения, как "Ночь", HDR, "Авто", "Боке" и "Ретушь лица".
Как проверить совместимость камеры с Camera2 Extensions API
В следующем фрагменте кода показано, как проверить, поддерживает ли устройство Camera2 Extensions API. Расширения поддерживаются не всеми устройствами, или устройство может поддерживать только некоторые из них. Фрагмент кода возвращает список идентификаторов совместимых камер, которые поддерживают расширения камеры.
private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { cameraManager.cameraIdList.filter { cameraId -> val characteristics = cameraManager.getCameraCharacteristics(cameraId) val extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(cameraId) val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) extensionCharacteristics.supportedExtensions.isNotEmpty() && capabilities?.contains( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE ) ?: false } } else emptyList()
Создайте CameraExtensionSession с помощью Camera2 Extensions API
API Camera2 Extensions позволяет использовать некоторые расширения камеры на совместимых устройствах. В следующем фрагменте кода показано, как создать CameraExtensionSession для использования режима ночной съемки в существующем приложении Camera2.
private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() { // Implement Capture Callbacks. } private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() { override fun onConfigured(session: CameraExtensionSession) { cameraExtensionSession = session try { val captureRequest = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(previewSurface) }.build() session.setRepeatingRequest( captureRequest, Dispatchers.IO.asExecutor(), captureCallbacks ) } catch (e: CameraAccessException) { Snackbar.make( previewView, "Failed to preview capture request", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } override fun onClosed(session: CameraExtensionSession) { super.onClosed(session) cameraDevice.close() } override fun onConfigureFailed(session: CameraExtensionSession) { Snackbar.make( previewView, "Failed to start camera extension preview", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } private fun startExtensionSession() { val outputConfig = arrayListOf( OutputConfiguration(stillImageReader.surface), OutputConfiguration(previewSurface) ) val extensionConfiguration = ExtensionSessionConfiguration( CameraExtensionCharacteristics.EXTENSION_NIGHT, outputConfig, Dispatchers.IO.asExecutor(), extensionSessionStateCallback ) cameraDevice.createExtensionSession(extensionConfiguration) }
Дополнительные ресурсы
Дополнительную информацию можно найти в статье CameraExtensionCharacteristics и в общедоступных примерах использования Camera2 Extensions API.