Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

# android.hardware.camera2

*** ** * ** ***

The android.hardware.camera2 package provides an interface to
individual camera devices connected to an Android device. It replaces
the deprecated `https://developer.android.com/reference/android/hardware/Camera` class.

This package models a camera device as a pipeline, which takes in
input requests for capturing a single frame, captures the single image
per the request, and then outputs one capture result metadata packet,
plus a set of output image buffers for the request. The requests are
processed in-order, and multiple requests can be in flight at
once. Since the camera device is a pipeline with multiple stages,
having multiple requests in flight is required to maintain full
framerate on most Android devices.

To enumerate, query, and open available camera devices, obtain a
`https://developer.android.com/reference/android/hardware/camera2/CameraManager` instance.

Individual `https://developer.android.com/reference/android/hardware/camera2/CameraDevice` provide a set of static property information that
describes the hardware device and the available settings and output
parameters for the device. This information is provided through the
`https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics` object, and is
available through `https://developer.android.com/reference/android/hardware/camera2/CameraManager#getCameraCharacteristics(java.lang.String)`

To capture or stream images from a camera device, the application
must first create a `https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession`
with a set of output Surfaces for use with the camera device, with
`https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createCaptureSession(android.hardware.camera2.params.SessionConfiguration)`. Each
Surface has to be pre-configured with an `https://developer.android.com/reference/android/hardware/camera2/params/StreamConfigurationMap` (if applicable) to match the sizes and formats
available from the camera device. A target Surface can be obtained
from a variety of classes, including `https://developer.android.com/reference/android/view/SurfaceView`,
`https://developer.android.com/reference/android/graphics/SurfaceTexture` via
`https://developer.android.com/reference/android/view/Surface#Surface(android.graphics.SurfaceTexture)`,
`https://developer.android.com/reference/android/media/MediaCodec`, `https://developer.android.com/reference/android/media/MediaRecorder`,
`https://developer.android.com/reference/android/renderscript/Allocation`, and `https://developer.android.com/reference/android/media/ImageReader`.

Generally, camera preview images are sent to `https://developer.android.com/reference/android/view/SurfaceView` or `https://developer.android.com/reference/android/view/TextureView` (via its
`https://developer.android.com/reference/android/graphics/SurfaceTexture`). Capture of JPEG images or
RAW buffers for `https://developer.android.com/reference/android/hardware/camera2/DngCreator` can be
done with `https://developer.android.com/reference/android/media/ImageReader` with the `https://developer.android.com/reference/android/graphics/ImageFormat#JPEG` and `https://developer.android.com/reference/android/graphics/ImageFormat#RAW_SENSOR` formats. Application-driven
processing of camera data in OpenGL ES, or directly in managed or
native code is best done through `https://developer.android.com/reference/android/graphics/SurfaceTexture`, or `https://developer.android.com/reference/android/media/ImageReader`
with a `https://developer.android.com/reference/android/graphics/ImageFormat#YUV_420_888` format,
respectively.

By default, YUV-format buffers provided by the camera are using the
JFIF YUV\<-\>RGB transform matrix (equivalent to Rec.601 full-range
encoding), and after conversion to RGB with this matrix, the resulting
RGB data is in the sRGB colorspace. Captured JPEG images may contain
an ICC profile to specify their color space information; if not, they
should be assumed to be in the sRGB space as well. On some devices,
the output colorspace can be changed via `https://developer.android.com/reference/android/hardware/camera2/params/SessionConfiguration#setColorSpace(android.graphics.ColorSpace.Named)`.


Note that although the YUV-\>RGB transform is the JFIF matrix (Rec.601
full-range), due to legacy and compatibility reasons, the output is in
the sRGB colorspace, which uses the Rec.709 color primaries. Image
processing code can safely treat the output RGB as being in the sRGB
colorspace.

The application then needs to construct a `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest`, which defines all the
capture parameters needed by a camera device to capture a single
image. The request also lists which of the configured output Surfaces
should be used as targets for this capture. The CameraDevice has a
`https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createCaptureRequest(int)` for creating a `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder` for a
given use case, which is optimized for the Android device the
application is running on.

Once the request has been set up, it can be handed to the active
capture session either for a one-shot `https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession#capture(android.hardware.camera2.CaptureRequest,%20android.hardware.camera2.CameraCaptureSession.CaptureCallback,%20android.os.Handler)` or for
an endlessly `https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession#setRepeatingRequest(android.hardware.camera2.CaptureRequest,%20android.hardware.camera2.CameraCaptureSession.CaptureCallback,%20android.os.Handler)` use. Both methods also have a variant that accepts a list
of requests to use as a burst capture / repeating burst. Repeating
requests have a lower priority than captures, so a request submitted
through `capture()` while there's a repeating request
configured will be captured before any new instances of the currently
repeating (burst) capture will begin capture.

After processing a request, the camera device will produce a `https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult` object, which contains
information about the state of the camera device at time of capture,
and the final settings used. These may vary somewhat from the request,
if rounding or resolving contradictory parameters was necessary. The
camera device will also send a frame of image data into each of the
output `Surfaces` included in the request. These are produced
asynchronously relative to the output CaptureResult, sometimes
substantially later.

## Interfaces

|---|---|
| [MultiResolutionImageReader.OnActiveOutputSurfacesListener](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader.OnActiveOutputSurfacesListener) | Callback interface for being notified of the surfaces used for the capture. |

## Classes

|---|---|
| [CameraCaptureSession](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession) | A configured capture session for a `https://developer.android.com/reference/android/hardware/camera2/CameraDevice`, used for capturing images from the camera or reprocessing images captured from the camera in the same session previously. |
| [CameraCaptureSession.CaptureCallback](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.CaptureCallback) | A callback object for tracking the progress of a `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest` submitted to the camera device. |
| [CameraCaptureSession.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback) | A callback object for receiving updates about the state of a camera capture session. |
| [CameraCharacteristics](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics) | The properties describing a `https://developer.android.com/reference/android/hardware/camera2/CameraDevice`. |
| [CameraCharacteristics.Key](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.Key)\<T\> | A `Key` is used to do camera characteristics field lookups with `https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics#get(android.hardware.camera2.CameraCharacteristics.Key<T>)`. |
| [CameraConstrainedHighSpeedCaptureSession](https://developer.android.com/reference/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession) | A constrained high speed capture session for a `https://developer.android.com/reference/android/hardware/camera2/CameraDevice`, used for capturing high speed images from the `https://developer.android.com/reference/android/hardware/camera2/CameraDevice` for high speed video recording use case. |
| [CameraDevice](https://developer.android.com/reference/android/hardware/camera2/CameraDevice) | The CameraDevice class is a representation of a single camera connected to an Android device, allowing for fine-grain control of image capture and post-processing at high frame rates. |
| [CameraDevice.CameraDeviceSetup](https://developer.android.com/reference/android/hardware/camera2/CameraDevice.CameraDeviceSetup) | CameraDeviceSetup is a limited representation of `https://developer.android.com/reference/android/hardware/camera2/CameraDevice` that can be used to query device specific information which would otherwise need a CameraDevice instance. |
| [CameraDevice.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraDevice.StateCallback) | A callback objects for receiving updates about the state of a camera device. |
| [CameraExtensionCharacteristics](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionCharacteristics) | Allows clients to query availability and supported resolutions of camera extensions. |
| [CameraExtensionSession](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession) | A camera capture session that enables access to device-specific camera extensions, which often use multi-frame bursts and sophisticated post-process algorithms for image capture. |
| [CameraExtensionSession.ExtensionCaptureCallback](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.ExtensionCaptureCallback) | A callback object for tracking the progress of a `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest` submitted to the camera device. |
| [CameraExtensionSession.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.StateCallback) | A callback object for receiving updates about the state of a camera extension session. |
| [CameraExtensionSession.StillCaptureLatency](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.StillCaptureLatency) | Realtime calculated still `https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession#capture(android.hardware.camera2.CaptureRequest,%20java.util.concurrent.Executor,%20android.hardware.camera2.CameraExtensionSession.ExtensionCaptureCallback)` latency. |
| [CameraManager](https://developer.android.com/reference/android/hardware/camera2/CameraManager) | A system service manager for detecting, characterizing, and connecting to `https://developer.android.com/reference/android/hardware/camera2/CameraDevice`. |
| [CameraManager.AvailabilityCallback](https://developer.android.com/reference/android/hardware/camera2/CameraManager.AvailabilityCallback) | A callback for camera devices becoming available or unavailable to open. |
| [CameraManager.TorchCallback](https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback) | A callback for camera flash torch modes becoming unavailable, disabled, or enabled. |
| [CameraMetadata](https://developer.android.com/reference/android/hardware/camera2/CameraMetadata)\<TKey\> | The base class for camera controls and information. |
| [CameraOfflineSession](https://developer.android.com/reference/android/hardware/camera2/CameraOfflineSession) | A camera capture session that was switched to offline mode via successful call to `https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession#switchToOffline(java.util.Collection<android.view.Surface>,%20java.util.concurrent.Executor,%20android.hardware.camera2.CameraOfflineSession.CameraOfflineSessionCallback)`. |
| [CameraOfflineSession.CameraOfflineSessionCallback](https://developer.android.com/reference/android/hardware/camera2/CameraOfflineSession.CameraOfflineSessionCallback) |   |
| [CaptureFailure](https://developer.android.com/reference/android/hardware/camera2/CaptureFailure) | A report of failed capture for a single image capture from the image sensor. |
| [CaptureRequest](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest) | An immutable package of settings and outputs needed to capture a single image from the camera device. |
| [CaptureRequest.Builder](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder) | A builder for capture requests. |
| [CaptureRequest.Key](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Key)\<T\> | A `Key` is used to do capture request field lookups with `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#get(android.hardware.camera2.CaptureRequest.Key<T>)` or to set fields with `https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder#set(android.hardware.camera2.CaptureRequest.Key<T>,%20T)`. |
| [CaptureResult](https://developer.android.com/reference/android/hardware/camera2/CaptureResult) | The subset of the results of a single image capture from the image sensor. |
| [CaptureResult.Key](https://developer.android.com/reference/android/hardware/camera2/CaptureResult.Key)\<T\> | A `Key` is used to do capture result field lookups with `https://developer.android.com/reference/android/hardware/camera2/CaptureResult#get(android.hardware.camera2.CaptureResult.Key<T>)`. |
| [DngCreator](https://developer.android.com/reference/android/hardware/camera2/DngCreator) | The `https://developer.android.com/reference/android/hardware/camera2/DngCreator` class provides functions to write raw pixel data as a DNG file. |
| [MultiResolutionImageReader](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader) | The MultiResolutionImageReader class wraps a group of `https://developer.android.com/reference/android/media/ImageReader` with the same format and different sizes, source camera Id, or camera sensor modes. |
| [MultiResolutionImageReader.Builder](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader.Builder) | Builder class for `https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader` objects. |
| [TotalCaptureResult](https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult) | The total assembled results of a single image capture from the image sensor. |

## Exceptions

|---|---|
| [CameraAccessException](https://developer.android.com/reference/android/hardware/camera2/CameraAccessException) | `CameraAccessException` is thrown if a camera device could not be queried or opened by the `https://developer.android.com/reference/android/hardware/camera2/CameraManager`, or if the connection to an opened `https://developer.android.com/reference/android/hardware/camera2/CameraDevice` is no longer valid. |

-

  ## Interfaces

  - [MultiResolutionImageReader.OnActiveOutputSurfacesListener](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader.OnActiveOutputSurfacesListener)
-

  ## Classes

  - [CameraCaptureSession](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession)
  - [CameraCaptureSession.CaptureCallback](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.CaptureCallback)
  - [CameraCaptureSession.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback)
  - [CameraCharacteristics](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics)
  - [CameraCharacteristics.Key](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.Key)
  - [CameraConstrainedHighSpeedCaptureSession](https://developer.android.com/reference/android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession)
  - [CameraDevice](https://developer.android.com/reference/android/hardware/camera2/CameraDevice)
  - [CameraDevice.CameraDeviceSetup](https://developer.android.com/reference/android/hardware/camera2/CameraDevice.CameraDeviceSetup)
  - [CameraDevice.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraDevice.StateCallback)
  - [CameraExtensionCharacteristics](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionCharacteristics)
  - [CameraExtensionSession](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession)
  - [CameraExtensionSession.ExtensionCaptureCallback](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.ExtensionCaptureCallback)
  - [CameraExtensionSession.StateCallback](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.StateCallback)
  - [CameraExtensionSession.StillCaptureLatency](https://developer.android.com/reference/android/hardware/camera2/CameraExtensionSession.StillCaptureLatency)
  - [CameraManager](https://developer.android.com/reference/android/hardware/camera2/CameraManager)
  - [CameraManager.AvailabilityCallback](https://developer.android.com/reference/android/hardware/camera2/CameraManager.AvailabilityCallback)
  - [CameraManager.TorchCallback](https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback)
  - [CameraMetadata](https://developer.android.com/reference/android/hardware/camera2/CameraMetadata)
  - [CameraOfflineSession](https://developer.android.com/reference/android/hardware/camera2/CameraOfflineSession)
  - [CameraOfflineSession.CameraOfflineSessionCallback](https://developer.android.com/reference/android/hardware/camera2/CameraOfflineSession.CameraOfflineSessionCallback)
  - [CaptureFailure](https://developer.android.com/reference/android/hardware/camera2/CaptureFailure)
  - [CaptureRequest](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest)
  - [CaptureRequest.Builder](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder)
  - [CaptureRequest.Key](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Key)
  - [CaptureResult](https://developer.android.com/reference/android/hardware/camera2/CaptureResult)
  - [CaptureResult.Key](https://developer.android.com/reference/android/hardware/camera2/CaptureResult.Key)
  - [DngCreator](https://developer.android.com/reference/android/hardware/camera2/DngCreator)
  - [MultiResolutionImageReader](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader)
  - [MultiResolutionImageReader.Builder](https://developer.android.com/reference/android/hardware/camera2/MultiResolutionImageReader.Builder)
  - [TotalCaptureResult](https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult)
-

  ## Exceptions

  - [CameraAccessException](https://developer.android.com/reference/android/hardware/camera2/CameraAccessException)