CameraCharacteristicsWrappers


object CameraCharacteristicsWrappers


Custom metadata keys for CameraCharacteristicsWrapper.

Summary

Public functions

CameraCharacteristicsWrapper
loadFrom(
    context: Context,
    cameraId: CameraId,
    dynamicKeys: Set<CameraCharacteristics.Key<*>>
)

Loads CameraCharacteristicsWrapper for the given cameraId using Context.

CameraCharacteristicsWrapper
loadFrom(
    cameraManager: CameraManager,
    cameraId: CameraId,
    isRestricted: Boolean,
    dynamicKeys: Set<CameraCharacteristics.Key<*>>
)

Loads CameraCharacteristicsWrapper for the given cameraId using CameraManager.

CameraCharacteristicsWrapper
wrap(
    cameraId: CameraId,
    characteristics: CameraCharacteristics,
    isRestricted: Boolean,
    dynamicKeys: Set<CameraCharacteristics.Key<*>>
)

Wraps a native CameraCharacteristics into a CameraCharacteristicsWrapper.

Public functions

loadFrom

Added in 1.7.0-rc01
fun loadFrom(
    context: Context,
    cameraId: CameraId,
    dynamicKeys: Set<CameraCharacteristics.Key<*>> = emptySet()
): CameraCharacteristicsWrapper

Loads CameraCharacteristicsWrapper for the given cameraId using Context.

This method will perform an instantaneous check to determine if the camera permission is granted, setting CameraCharacteristicsWrapper.isRestricted accordingly.

import androidx.camera.common.CameraCharacteristicsWrapper
import androidx.camera.common.CameraCharacteristicsWrappers
import androidx.camera.common.CameraId

val cameraId = CameraId(cameraIdString)

// Load CameraCharacteristicsWrapper directly using Context.
// This checks camera permissions and marks isRestricted accordingly.
val characteristicsFromContext: CameraCharacteristicsWrapper =
    CameraCharacteristicsWrappers.loadFrom(context, cameraId)

// Or load directly using CameraManager:
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristicsFromManager: CameraCharacteristicsWrapper =
    CameraCharacteristicsWrappers.loadFrom(cameraManager, cameraId)

loadFrom

Added in 1.7.0-rc01
fun loadFrom(
    cameraManager: CameraManager,
    cameraId: CameraId,
    isRestricted: Boolean = false,
    dynamicKeys: Set<CameraCharacteristics.Key<*>> = emptySet()
): CameraCharacteristicsWrapper

Loads CameraCharacteristicsWrapper for the given cameraId using CameraManager.

import androidx.camera.common.CameraCharacteristicsWrapper
import androidx.camera.common.CameraCharacteristicsWrappers
import androidx.camera.common.CameraId

val cameraId = CameraId(cameraIdString)

// Load CameraCharacteristicsWrapper directly using Context.
// This checks camera permissions and marks isRestricted accordingly.
val characteristicsFromContext: CameraCharacteristicsWrapper =
    CameraCharacteristicsWrappers.loadFrom(context, cameraId)

// Or load directly using CameraManager:
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristicsFromManager: CameraCharacteristicsWrapper =
    CameraCharacteristicsWrappers.loadFrom(cameraManager, cameraId)

wrap

Added in 1.7.0-rc01
fun wrap(
    cameraId: CameraId,
    characteristics: CameraCharacteristics,
    isRestricted: Boolean = false,
    dynamicKeys: Set<CameraCharacteristics.Key<*>> = emptySet()
): CameraCharacteristicsWrapper

Wraps a native CameraCharacteristics into a CameraCharacteristicsWrapper.

import androidx.camera.common.CameraCharacteristicsWrapper
import androidx.camera.common.CameraCharacteristicsWrappers
import androidx.camera.common.CameraId

val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristics = cameraManager.getCameraCharacteristics(cameraIdString)
val cameraId = CameraId(cameraIdString)

// Wrap the native CameraCharacteristics instance into a CameraCharacteristicsWrapper.
val cameraCharacteristics: CameraCharacteristicsWrapper =
    CameraCharacteristicsWrappers.wrap(cameraId, characteristics)

Public properties

CameraCharacteristicsMetadata.availableColorSpaceProfiles

val CameraCharacteristicsMetadata.availableColorSpaceProfiles: ColorSpaceProfilesWrapper

Returns the ColorSpaceProfilesWrapper supported by the camera device.

import androidx.camera.common.CameraCharacteristicsWrappers.availableColorSpaceProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.availableDynamicRangeProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.streamConfigurationMap

// Access standard CameraCharacteristics keys using the get/bracket operator:
val sensorOrientation = cameraCharacteristics[CameraCharacteristics.SENSOR_ORIENTATION]
val lensFacing = cameraCharacteristics[CameraCharacteristics.LENS_FACING]

// Access extended/custom properties using the extension properties.
// Note: Querying these properties will query custom/compatibility metadata keys first
// (such as STREAM_CONFIGURATION_MAP, AVAILABLE_COLOR_SPACE_PROFILES,
// AVAILABLE_DYNAMIC_RANGE_PROFILES) and fallback to creating internal wrappers from the
// native platform characteristics. In unit tests, test fakes supply the custom wrapped
// versions via these metadata keys.
val streamConfigurationMap = cameraCharacteristics.streamConfigurationMap
val colorSpaceProfiles = cameraCharacteristics.availableColorSpaceProfiles
val dynamicRangeProfiles = cameraCharacteristics.availableDynamicRangeProfiles

CameraCharacteristicsMetadata.availableDynamicRangeProfiles

val CameraCharacteristicsMetadata.availableDynamicRangeProfiles: DynamicRangeProfilesWrapper

Returns the DynamicRangeProfilesWrapper supported by the camera device.

import androidx.camera.common.CameraCharacteristicsWrappers.availableColorSpaceProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.availableDynamicRangeProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.streamConfigurationMap

// Access standard CameraCharacteristics keys using the get/bracket operator:
val sensorOrientation = cameraCharacteristics[CameraCharacteristics.SENSOR_ORIENTATION]
val lensFacing = cameraCharacteristics[CameraCharacteristics.LENS_FACING]

// Access extended/custom properties using the extension properties.
// Note: Querying these properties will query custom/compatibility metadata keys first
// (such as STREAM_CONFIGURATION_MAP, AVAILABLE_COLOR_SPACE_PROFILES,
// AVAILABLE_DYNAMIC_RANGE_PROFILES) and fallback to creating internal wrappers from the
// native platform characteristics. In unit tests, test fakes supply the custom wrapped
// versions via these metadata keys.
val streamConfigurationMap = cameraCharacteristics.streamConfigurationMap
val colorSpaceProfiles = cameraCharacteristics.availableColorSpaceProfiles
val dynamicRangeProfiles = cameraCharacteristics.availableDynamicRangeProfiles

CameraCharacteristicsMetadata.streamConfigurationMap

val CameraCharacteristicsMetadata.streamConfigurationMap: StreamConfigurationMapWrapper?

Extension property to query StreamConfigurationMapWrapper directly.

This is the preferred way to access the StreamConfigurationMapWrapper in Kotlin. It will fallback to creating a wrapper from the standard CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP if the compatibility key is not populated.

import androidx.camera.common.CameraCharacteristicsWrappers.availableColorSpaceProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.availableDynamicRangeProfiles
import androidx.camera.common.CameraCharacteristicsWrappers.streamConfigurationMap

// Access standard CameraCharacteristics keys using the get/bracket operator:
val sensorOrientation = cameraCharacteristics[CameraCharacteristics.SENSOR_ORIENTATION]
val lensFacing = cameraCharacteristics[CameraCharacteristics.LENS_FACING]

// Access extended/custom properties using the extension properties.
// Note: Querying these properties will query custom/compatibility metadata keys first
// (such as STREAM_CONFIGURATION_MAP, AVAILABLE_COLOR_SPACE_PROFILES,
// AVAILABLE_DYNAMIC_RANGE_PROFILES) and fallback to creating internal wrappers from the
// native platform characteristics. In unit tests, test fakes supply the custom wrapped
// versions via these metadata keys.
val streamConfigurationMap = cameraCharacteristics.streamConfigurationMap
val colorSpaceProfiles = cameraCharacteristics.availableColorSpaceProfiles
val dynamicRangeProfiles = cameraCharacteristics.availableDynamicRangeProfiles
import androidx.camera.common.CameraCharacteristicsWrapper
import androidx.camera.common.CameraCharacteristicsWrappers.streamConfigurationMap
import androidx.camera.common.CameraId
import androidx.camera.common.testing.FakeCameraCharacteristics
import androidx.camera.common.testing.FakeStreamConfigurationMap
import androidx.camera.common.testing.FakeStreamConfigurationMap.OutputKey
import androidx.camera.common.testing.FakeStreamConfigurationMap.OutputValues

// Create a fake stream configuration map with custom resolutions and formats.
val fakeStreamConfigurationMap =
    FakeStreamConfigurationMap(
        outputsTable =
            linkedMapOf(
                OutputKey(ImageFormat.YUV_420_888, Size(1920, 1080)) to OutputValues(),
                OutputKey(ImageFormat.JPEG, Size(1920, 1080)) to
                    OutputValues(
                        stallDuration = 200_000_000L // 200ms stall duration
                    ),
            )
    )

// Supply the fake stream configuration map via STREAM_CONFIGURATION_MAP metadata key.
val fakeCharacteristics: CameraCharacteristicsWrapper =
    FakeCameraCharacteristics(
        cameraId = CameraId("0"),
        cameraCharacteristics =
            mapOf(
                CameraCharacteristics.LENS_FACING to CameraCharacteristics.LENS_FACING_BACK,
                CameraCharacteristics.SENSOR_ORIENTATION to 90,
            ),
        cameraMetadata =
            mapOf(
                CameraCharacteristicsWrapper.Keys.STREAM_CONFIGURATION_MAP to
                    fakeStreamConfigurationMap
            ),
    )

// The extension property accesses the wrapped version (STREAM_CONFIGURATION_MAP) first,
// returning the FakeStreamConfigurationMap in unit tests without needing real camera hardware.
val streamConfigMap = checkNotNull(fakeCharacteristics.streamConfigurationMap)
val supportedFormats = streamConfigMap.getOutputFormats()
val yuvSizes = streamConfigMap.getOutputSizes(ImageFormat.YUV_420_888)