API Camera2 Extensions

Remarque : Cette page fait référence au package Camera2. À moins que votre application ne nécessite des fonctionnalités spécifiques de bas niveau de Camera2, nous vous recommandons d'utiliser CameraX. CameraX et Camera2 sont compatibles avec Android 5.0 (niveau d'API 21) ou version ultérieure.

Camera2 fournit une API Extensions pour accéder aux extensions que les fabricants d'appareils ont implémentées sur divers appareils Android. Pour obtenir la liste des modes d'extension compatibles, consultez Extensions Camera.

Pour obtenir la liste des appareils compatibles avec les extensions, consultez Appareils compatibles.

Architecture des extensions

L'image suivante illustre l'architecture des extensions Camera.

Figure 1. Architecture des extensions Camera

Une application Camera2 peut utiliser des extensions par le biais de l'API Camera2. L'API Camera2 permet d'interroger les extensions disponibles, de configurer une session d'appareil photo d'extension et de communiquer avec la bibliothèque OEM d'extensions Camera. Votre application peut ainsi utiliser des extensions telles que Nuit, HDR, Auto, Bokeh ou Retouche du visage.

Tester la compatibilité d'un appareil photo avec l'API Camera2 Extensions

L'extrait de code suivant vérifie si l'appareil est compatible avec l'API Camera2 Extensions. Les extensions ne sont pas compatibles avec tous les appareils, ou l'appareil peut n'être compatible qu'avec un sous-ensemble d'extensions. L'extrait renvoie une liste d'ID de caméras compatibles avec les extensions Camera.

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()

Créer une CameraExtensionSession avec l'API Camera2 Extensions

L'API Camera2 Extensions, lorsqu'elle est utilisée avec des appareils compatibles, vous permet d'accéder à certaines extensions de l'appareil photo. L'extrait de code suivant montre comment créer un CameraExtensionSession pour utiliser le mode de capture de nuit dans une application Camera2 existante.

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)
}

Ressources supplémentaires

Pour en savoir plus, consultez CameraExtensionCharacteristics et les exemples d'API d'extensions Camera2 publics.