Camera2 Extensions API

Note: This page refers to the Camera2 package. Unless your app requires specific, low-level features from Camera2, we recommend using CameraX. Both CameraX and Camera2 support Android 5.0 (API level 21) and higher.

Camera2 provides an Extensions API for accessing extensions that device manufacturers have implemented on various Android devices. For a list of supported extension modes, see Camera extensions.

For a list of devices that support extensions, see Supported devices.

Extensions architecture

The following image shows the camera extensions architecture.

Figure 1. Camera Extensions architecture

A Camera2 application can use extensions through the Camera2 API. The Camera2 API provides ways to query for available extensions, configure an extension camera session, and communicate with the Camera Extensions OEM library. This allows your application to use extensions like Night, HDR, Auto, Bokeh, or Face Retouch.

Test a camera device for Camera2 Extensions API compatibility

The following code snippet checks if the device supports the Camera2 Extensions API. Extensions are not supported by all devices or the device might support a subset of extensions. The snippet returns a list of compatible camera IDs which support camera extensions.

Kotlin

privatefungetExtensionCameraIds(cameraManager:CameraManager):List<String>=
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.S){
cameraManager.cameraIdList.filter{cameraId->
valcharacteristics=cameraManager.getCameraCharacteristics(cameraId)
valextensionCharacteristics=
cameraManager.getCameraExtensionCharacteristics(cameraId)
valcapabilities=
characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
extensionCharacteristics.supportedExtensions.isNotEmpty()&&
capabilities?.contains(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
)?:false
}
}elseemptyList()

Java

privateList<String>getExtensionCameraIds(CameraManagercameraManager)
throwsCameraAccessException{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.S){
returnArrays.stream(cameraManager.getCameraIdList()).filter(cameraId->{
try{
CameraCharacteristicscharacteristics=
cameraManager.getCameraCharacteristics(cameraId);
CameraExtensionCharacteristicsextensionCharacteristics=
cameraManager.getCameraExtensionCharacteristics(cameraId);
IntStreamcapabilities=
Arrays.stream(
characteristics.get(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES
)
);
return!extensionCharacteristics.getSupportedExtensions().isEmpty()&&
capabilities.anyMatch(capability->capability==CameraCharacteristics
.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
);
}catch(CameraAccessExceptione){
thrownewRuntimeException(e);
}
}).collect(Collectors.toList());
}else{
returnCollections.emptyList();
}
}

Create a CameraExtensionSession with the Camera2 Extensions API

The Camera2 Extensions API, when used with compatible devices, lets you access certain camera extensions. The following code snippet showcases an example of how to create a CameraExtensionSession for using night capture mode for an existing Camera2 application.

Kotlin

privatevalcaptureCallbacks=object:CameraExtensionSession.ExtensionCaptureCallback(){
// Implement Capture Callbacks
}
privatevalextensionSessionStateCallback=object:CameraExtensionSession.StateCallback(){
overridefunonConfigured(session:CameraExtensionSession){
cameraExtensionSession=session
try{
valcaptureRequest=
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()
}
}
overridefunonClosed(session:CameraExtensionSession){
super.onClosed(session)
cameraDevice.close()
}
overridefunonConfigureFailed(session:CameraExtensionSession){
Snackbar.make(
previewView,
"Failed to start camera extension preview",
Snackbar.LENGTH_SHORT
).show()
requireActivity().finish()
}
}
privatefunstartExtensionSession(){
valoutputConfig=arrayListOf(
OutputConfiguration(stillImageReader.surface),
OutputConfiguration(previewSurface)
)
valextensionConfiguration=ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
Dispatchers.IO.asExecutor(),
extensionSessionStateCallback
)
cameraDevice.createExtensionSession(extensionConfiguration)
}

Java

privateCameraExtensionSession.ExtensionCaptureCallbackcaptureCallbacks=
newCameraExtensionSession.ExtensionCaptureCallback(){
// Implement Capture Callbacks
};
privateCameraExtensionSession.StateCallbackextensionSessionStateCallback=
newCameraExtensionSession.StateCallback(){
@Override
publicvoidonConfigured(@NonNullCameraExtensionSessionsession){
cameraExtensionSession=session;
try{
CaptureRequest.BuildercaptureRequestBuilder=
cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(previewSurface);
CaptureRequestcaptureRequest=captureRequestBuilder.build();
session.setRepeatingRequest(captureRequest,backgroundExecutor,captureCallbacks);
}catch(CameraAccessExceptione){
Snackbar.make(
previewView,
"Failed to preview capture request",
Snackbar.LENGTH_SHORT
).show();
requireActivity().finish();
}
}
@Override
publicvoidonClosed(@NonNullCameraExtensionSessionsession){
super.onClosed(session);
cameraDevice.close();
}
@Override
publicvoidonConfigureFailed(@NonNullCameraExtensionSessionsession){
Snackbar.make(
previewView,
"Failed to start camera extension preview",
Snackbar.LENGTH_SHORT
).show();
requireActivity().finish();
}
};
privatevoidstartExtensionSession(){
ArrayList<OutputConfiguration>outputConfig=newArrayList<>();
outputConfig.add(newOutputConfiguration(stillImageReader.getSurface()));
outputConfig.add(newOutputConfiguration(previewSurface));
ExtensionSessionConfigurationextensionConfiguration=newExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
}

Additional resources

For more information, see CameraExtensionCharacteristics and view the public Camera2 Extensions API samples for more.

Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Last updated 2025年03月04日 UTC.