androidx.camera.camera2.interop


Interfaces

Classes

Camera2CameraControl

This class is deprecated. Use the CameraControl.applyCamera2Interop or CameraControl.applyCamera2InteropAsync extension functions instead, e.g., 'cameraControl.applyCamera2Interop { setCaptureRequestOption(key, value) }'.

Camera2CameraInfo

This class is deprecated. Use the CameraInfo extension properties instead, e.g., 'cameraInfo.cameraId' or 'cameraInfo.cameraCharacteristics'.

Camera2Interop

Provides utilities to configure and query Camera2 APIs.

Camera2Interop.Extender

This class is deprecated. Use the camera2Interop extension function on UseCase.Builder (e.g., 'builder.camera2Interop { setPhysicalCameraId(physicalCameraId) }') or SessionConfig.Builder for capture request options and callbacks instead.

CameraControlCamera2Configurator

Configures CameraControlCamera2Interop options on a androidx.camera.core.CameraControl.

CaptureRequestOptionTarget

Target class supporting captureRequest[key] = value indexing operator syntax.

CaptureRequestOptions

This class is deprecated. Use the camera2Interop or applyCamera2Interop extension functions instead, e.g., 'builder.camera2Interop { setCaptureRequestOption(key, value) }'.

CaptureRequestOptions.Builder

This class is deprecated. Use the camera2Interop or applyCamera2Interop extension functions instead, e.g., 'builder.camera2Interop { setCaptureRequestOption(key, value) }'.

ImageCaptureCamera2Configurator

Configures ImageCaptureCamera2Interop options on an androidx.camera.core.ImageCapture.Builder.

SessionConfigCamera2Configurator

Configures SessionConfigCamera2Interop options on a androidx.camera.core.SessionConfig.Builder.

SessionParameterTarget

Target class supporting sessionParameter[key] = value indexing operator syntax.

StillCaptureRequestOptionTarget

Target class supporting stillCaptureRequest[key] = value indexing operator syntax.

UseCaseCamera2Configurator

Configures UseCaseCamera2Interop options on androidx.camera.core.UseCase builders.

Annotations

ExperimentalCamera2Interop

Denotes that the annotated method uses the experimental methods which allow direct access to camera2 classes.

Extension functions summary

suspend inline Unit

Applies Camera2 options to a CameraControl asynchronously within a coroutine.

inline ListenableFuture<Void>

Applies Camera2 options to a CameraControl asynchronously.

inline B
<B : UseCase.InteropConfigurable<B>> B.camera2Interop(
    crossinline block: UseCaseCamera2Interop.() -> Unit
)

Applies Camera2 options to a UseCase builder.

inline ImageCapture.Builder

Applies Camera2 options to an ImageCapture.Builder.

inline Unit

Applies Camera2 options inside an InteropConfigurableScope DSL block.

inline Unit

Applies Camera2 options inside an ImageCaptureScope DSL block.

inline SessionConfig.Builder

Applies Camera2 options to a SessionConfig.Builder.

CameraSelector

Creates a CameraSelector targeting this camera ID string.

Extension properties summary

Extension functions

CameraControl.applyCamera2Interop

suspend inline fun CameraControl.applyCamera2Interop(crossinline block: CameraControlCamera2Interop.() -> Unit): Unit

Applies Camera2 options to a CameraControl asynchronously within a coroutine.

Dynamically updates repeating capture request parameters or capture request keys on an active camera session. Options configured within a single block are applied atomically in a single repeating capture request update. Subsequent calls to applyCamera2Interop update parameters incrementally without clearing previously set keys, unless explicitly cleared using CameraControlCamera2Interop.clearCaptureRequestOption or CameraControlCamera2Interop.clearAllCaptureRequestOptions. This overwrites options set with SessionConfigCamera2Interop via androidx.camera.core.SessionConfig.Builder.setInterop (or SessionConfig.Builder.camera2Interop).

This function suspends until all specified interoperability options have been successfully updated in the underlying repeating capture request. Throws CameraControl.OperationCanceledException if a newer configuration is applied before this operation takes effect or if the camera is closed.

Options configured via CameraControlCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior or interfere with 3A routines and camera control APIs.

Warning: Callbacks configured via interop receive raw android.hardware.camera2.CameraCaptureSession instances. Directly invoking state-altering methods on these raw objects (such as android.hardware.camera2.CameraCaptureSession.close or android.hardware.camera2.CameraCaptureSession.abortCaptures) bypasses CameraX pipeline management and may cause state desynchronization, stream interruption, or application crashes.

import androidx.camera.camera2.interop.applyCamera2Interop

cameraControl.applyCamera2Interop {
    captureRequest[CaptureRequest.CONTROL_AE_MODE] = CaptureRequest.CONTROL_AE_MODE_OFF
    repeatingCaptureCallback = object : CameraCaptureSession.CaptureCallback() {}
}
Parameters
crossinline block: CameraControlCamera2Interop.() -> Unit

configuration block setting Camera2 options on CameraControlCamera2Interop

Throws
CameraControl.OperationCanceledException

if a newer configuration is applied before this operation takes effect or if the camera is closed

CameraControl.applyCamera2InteropAsync

inline fun CameraControl.applyCamera2InteropAsync(crossinline block: CameraControlCamera2Interop.() -> Unit): ListenableFuture<Void>

Applies Camera2 options to a CameraControl asynchronously.

Dynamically updates repeating capture request parameters or capture request keys on an active camera session. Options configured within a single block are applied atomically in a single repeating capture request update. Subsequent calls to applyCamera2InteropAsync update parameters incrementally without clearing previously set keys, unless explicitly cleared using CameraControlCamera2Interop.clearCaptureRequestOption or CameraControlCamera2Interop.clearAllCaptureRequestOptions. This overwrites options set with SessionConfigCamera2Interop via androidx.camera.core.SessionConfig.Builder.setInterop (or SessionConfig.Builder.camera2Interop).

Options configured via CameraControlCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior or interfere with 3A routines and camera control APIs.

Warning: Callbacks configured via interop receive raw android.hardware.camera2.CameraCaptureSession instances. Directly invoking state-altering methods on these raw objects (such as android.hardware.camera2.CameraCaptureSession.close or android.hardware.camera2.CameraCaptureSession.abortCaptures) bypasses CameraX pipeline management and may cause state desynchronization, stream interruption, or application crashes.

import androidx.camera.camera2.interop.applyCamera2Interop
import androidx.camera.camera2.interop.applyCamera2InteropAsync

cameraControl.applyCamera2InteropAsync {
    captureRequest[CaptureRequest.CONTROL_AE_MODE] = CaptureRequest.CONTROL_AE_MODE_OFF
    repeatingCaptureCallback = object : CameraCaptureSession.CaptureCallback() {}
}
Parameters
crossinline block: CameraControlCamera2Interop.() -> Unit

configuration block setting Camera2 options on CameraControlCamera2Interop

Returns
ListenableFuture<Void>

ListenableFuture completing with null when all specified interoperability options have been successfully updated in the underlying repeating capture request. The future fails with CameraControl.OperationCanceledException if a newer configuration is applied before this operation takes effect or if the camera is closed. Cancelling the future is a no-op.

B.camera2Interop

inline fun <B : UseCase.InteropConfigurable<B>> B.camera2Interop(
    crossinline block: UseCaseCamera2Interop.() -> Unit
): B

Applies Camera2 options to a UseCase builder.

Configures Camera2 options on builders implementing UseCase.InteropConfigurable (such as androidx.camera.core.Preview.Builder, androidx.camera.core.ImageAnalysis.Builder, or androidx.camera.video.VideoCapture.Builder). For ImageCapture.Builder, use the dedicated ImageCapture.Builder.camera2Interop extension function.

Options configured via UseCaseCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior.

import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.Preview
import androidx.camera.core.preview

val preview =
    Preview.Builder()
        .camera2Interop {
            physicalCameraId = "5"
            mirrorMode = OutputConfiguration.MIRROR_MODE_H
        }
        .build()
Parameters
crossinline block: UseCaseCamera2Interop.() -> Unit

configuration block setting Camera2 options on UseCaseCamera2Interop

Returns
B

this builder

ImageCapture.Builder.camera2Interop

inline fun ImageCapture.Builder.camera2Interop(crossinline block: ImageCaptureCamera2Interop.() -> Unit): ImageCapture.Builder

Applies Camera2 options to an ImageCapture.Builder.

Configures Camera2 options specific to ImageCapture.Builder.

Options configured via ImageCaptureCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. The capture request keys for one-shot still captures (such as androidx.camera.core.ImageCapture.takePicture) are determined by copying all repeating request keys (which may include keys added via androidx.camera.core.SessionConfig.Builder.setInterop or androidx.camera.core.CameraControl.applyInteropAsync) and then overriding them with the still capture request keys configured here. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior.

Warning: Callbacks configured via interop receive raw android.hardware.camera2.CameraCaptureSession instances. Directly invoking state-altering methods on these raw objects (such as android.hardware.camera2.CameraCaptureSession.close or android.hardware.camera2.CameraCaptureSession.abortCaptures) bypasses CameraX pipeline management and may cause state desynchronization, stream interruption, or application crashes.

import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.ImageCapture
import androidx.camera.core.imageCapture

val imageCapture =
    ImageCapture.Builder()
        .camera2Interop {
            stillCaptureRequestTemplateType = CameraDevice.TEMPLATE_STILL_CAPTURE
            stillCaptureRequest[CaptureRequest.CONTROL_AF_MODE] =
                CaptureRequest.CONTROL_AF_MODE_OFF
            stillCaptureCallback =
                object : CameraCaptureSession.CaptureCallback() {
                    override fun onCaptureCompleted(
                        session: CameraCaptureSession,
                        request: CaptureRequest,
                        result: TotalCaptureResult,
                    ) {}
                }
            physicalCameraId = "5"
        }
        .build()
Parameters
crossinline block: ImageCaptureCamera2Interop.() -> Unit

configuration block setting Camera2 options on ImageCaptureCamera2Interop

Returns
ImageCapture.Builder

this builder

InteropConfigurableScope.camera2Interop

inline fun <B : UseCase.InteropConfigurable<B>> InteropConfigurableScope<B>.camera2Interop(
    crossinline block: UseCaseCamera2Interop.() -> Unit
): Unit

Applies Camera2 options inside an InteropConfigurableScope DSL block.

Configures Camera2 options on the underlying UseCase builder within Kotlin DSL blocks such as preview { ... }, imageAnalysis { ... }, or videoCapture { ... }. For imageCapture { ... }, use the dedicated ImageCaptureScope.camera2Interop extension function.

Options configured via UseCaseCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior.

import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.preview

val preview = preview {
    camera2Interop {
        physicalCameraId = "0"
        mirrorMode = OutputConfiguration.MIRROR_MODE_H
    }
}
Parameters
crossinline block: UseCaseCamera2Interop.() -> Unit

configuration block setting Camera2 options on UseCaseCamera2Interop

ImageCaptureScope.camera2Interop

inline fun ImageCaptureScope.camera2Interop(crossinline block: ImageCaptureCamera2Interop.() -> Unit): Unit

Applies Camera2 options inside an ImageCaptureScope DSL block.

Configures Camera2 options on the underlying ImageCapture.Builder within an imageCapture { ... } DSL block.

Options configured via ImageCaptureCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. The capture request keys for one-shot still captures (such as androidx.camera.core.ImageCapture.takePicture) are determined by copying all repeating request keys (which may include keys added via androidx.camera.core.SessionConfig.Builder.setInterop or androidx.camera.core.CameraControl.applyInteropAsync) and then overriding them with the still capture request keys configured here. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior.

Warning: Callbacks configured via interop receive raw android.hardware.camera2.CameraCaptureSession instances. Directly invoking state-altering methods on these raw objects (such as android.hardware.camera2.CameraCaptureSession.close or android.hardware.camera2.CameraCaptureSession.abortCaptures) bypasses CameraX pipeline management and may cause state desynchronization, stream interruption, or application crashes.

import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.imageCapture

val imageCapture = imageCapture {
    camera2Interop {
        stillCaptureRequestTemplateType = CameraDevice.TEMPLATE_PREVIEW
        stillCaptureRequest[CaptureRequest.CONTROL_AF_MODE] = CaptureRequest.CONTROL_AF_MODE_OFF
        stillCaptureCallback =
            object : CameraCaptureSession.CaptureCallback() {
                override fun onCaptureCompleted(
                    session: CameraCaptureSession,
                    request: CaptureRequest,
                    result: TotalCaptureResult,
                ) {}
            }
        physicalCameraId = "5"
    }
}
Parameters
crossinline block: ImageCaptureCamera2Interop.() -> Unit

configuration block setting Camera2 options on ImageCaptureCamera2Interop

SessionConfig.Builder.camera2Interop

inline fun SessionConfig.Builder.camera2Interop(crossinline block: SessionConfigCamera2Interop.() -> Unit): SessionConfig.Builder

Applies Camera2 options to a SessionConfig.Builder.

Configures Camera2 options for a capture session builder. Can be called on a SessionConfig.Builder directly or within a androidx.camera.core.sessionConfig DSL block.

Options configured via SessionConfigCamera2Interop include:

Note: Using Camera2 interop options can override internal CameraX configurations. If an option configured via interop conflicts with options required by CameraX internally, the option from Camera2Interop will override, which may result in unexpected behavior.

Warning: Callbacks configured via interop receive raw android.hardware.camera2.CameraDevice and android.hardware.camera2.CameraCaptureSession instances. Directly invoking state-altering methods on these raw objects (such as android.hardware.camera2.CameraCaptureSession.close, android.hardware.camera2.CameraCaptureSession.abortCaptures, or android.hardware.camera2.CameraDevice.close) bypasses CameraX pipeline management and may cause state desynchronization, stream interruption, or application crashes.

import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.SessionConfig
import androidx.camera.core.preview
import androidx.camera.core.sessionConfig

val sessionConfig =
    SessionConfig.Builder(preview)
        .camera2Interop {
            colorSpace = ColorSpace.Named.DISPLAY_P3.ordinal
            sessionParameter[CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE] = Range(60, 60)
            captureRequest[CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE] = Range(60, 60)
            repeatingCaptureRequestTemplate = CameraDevice.TEMPLATE_PREVIEW
            repeatingCaptureCallback = object : CameraCaptureSession.CaptureCallback() {}
        }
        .build()
import androidx.camera.camera2.interop.camera2Interop
import androidx.camera.core.preview
import androidx.camera.core.sessionConfig

val sessionConfig =
    sessionConfig(listOf(preview)) {
        camera2Interop {
            colorSpace = ColorSpace.Named.DISPLAY_P3.ordinal
            sessionParameter[CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE] = Range(60, 60)
            captureRequest[CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE] = Range(60, 60)
            repeatingCaptureRequestTemplate = CameraDevice.TEMPLATE_PREVIEW
            repeatingCaptureCallback = object : CameraCaptureSession.CaptureCallback() {}
        }
    }
Parameters
crossinline block: SessionConfigCamera2Interop.() -> Unit

configuration block setting Camera2 options on SessionConfigCamera2Interop

Returns
SessionConfig.Builder

this builder

String.toCameraSelector

fun String.toCameraSelector(): CameraSelector

Creates a CameraSelector targeting this camera ID string.

Returns
CameraSelector

CameraSelector matching this camera ID

Extension properties

CameraInfo.cameraCharacteristics

val CameraInfo.cameraCharacteristicsCameraCharacteristics

Returns the CameraCharacteristics from this CameraInfo.

Throws
IllegalArgumentException

if this CameraInfo does not contain Camera2 information

CameraInfo.cameraId

val CameraInfo.cameraIdString

Returns the Camera2 camera ID from this CameraInfo.

Throws
IllegalArgumentException

if this CameraInfo does not contain Camera2 information