Camera2 Extensions API
Stay organized with collections
Save and categorize content based on your preferences.
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.
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.