Interfejs API rozszerzeń Camera2

Uwaga: ta strona dotyczy pakietu Aparat2. Jeśli Twoja aplikacja nie wymaga konkretnych, niskopoziomowych funkcji z Aparatu 2, zalecamy używanie AparatuX. Aparaty CameraX i Aparat 2 obsługują Androida 5.0 (poziom interfejsu API 21) i nowsze wersje.

Camera2 udostępnia interfejs API rozszerzeń do uzyskiwania dostępu do rozszerzeń, które producenci wdrożyli na różnych urządzeniach z Androidem. Listę obsługiwanych trybów rozszerzeń znajdziesz w artykule Rozszerzenia aparatu.

Listę urządzeń obsługujących rozszerzenia znajdziesz w sekcji Obsługiwane urządzenia.

Architektura rozszerzeń

Ilustracja poniżej przedstawia architekturę rozszerzeń aparatu.

Rysunek 1. Architektura rozszerzeń aparatu

Aplikacja Camera2 może używać rozszerzeń przez interfejs Camera2 API. Aparat 2 Interfejs API umożliwia zadawanie pytań dotyczących dostępnych rozszerzeń, konfigurowanie rozszerzeń sesja kamery i komunikowanie się z biblioteką OEM rozszerzeń aparatu. Ten umożliwia aplikacji korzystanie z rozszerzeń takich jak Noc, HDR, Auto, Bokeh Retusz twarzy.

Testowanie zgodności aparatu z interfejsem Camera2 Extensions API

Ten fragment kodu sprawdza, czy urządzenie obsługuje Aparat2 Rozszerzenia API. Rozszerzenia nie są obsługiwane przez niektóre urządzenia lub urządzenie może obsługiwać podzbiór z innymi rozszerzeniami. Fragment kodu zwraca listę zgodnych identyfikatorów kamer, które obsługują rozszerzenia aparatu.

KotlinJava

private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> =
   
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        cameraManager
.cameraIdList.filter { cameraId ->
           
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
           
val extensionCharacteristics =
                cameraManager
.getCameraExtensionCharacteristics(cameraId)
           
val capabilities =
                characteristics
.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
            extensionCharacteristics
.supportedExtensions.isNotEmpty() &&
                    capabilities
?.contains(
                       
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                   
) ?: false
       
}
   
} else emptyList()


private List<String> getExtensionCameraIds(CameraManager cameraManager)
       
throws CameraAccessException {
   
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
       
return Arrays.stream(cameraManager.getCameraIdList()).filter(cameraId -> {
           
try {
               
CameraCharacteristics characteristics =
                        cameraManager
.getCameraCharacteristics(cameraId);
               
CameraExtensionCharacteristics extensionCharacteristics =
                        cameraManager
.getCameraExtensionCharacteristics(cameraId);
               
IntStream capabilities =
                   
Arrays.stream(
                                characteristics
.get(
                                       
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES
                               
)
                       
);
               
return !extensionCharacteristics.getSupportedExtensions().isEmpty() &&
                       capabilities
.anyMatch(capability -> capability == CameraCharacteristics
                                       
.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                       
);
           
} catch (CameraAccessException e) {
               
throw new RuntimeException(e);
           
}
       
}).collect(Collectors.toList());
   
} else {
       
return Collections.emptyList();
   
}
}

Tworzenie obiektu CameraExtensionSession przy użyciu interfejsu Camera2 Extensions API

Interfejs Camera2 Extensions API, jeśli jest używany ze zgodnymi urządzeniami, pozwala określonych rozszerzeń do aparatu. Fragment kodu poniżej zawiera przykładową jak utworzyć CameraExtensionSession za korzystanie z trybu nocnego w istniejącej aplikacji Camera2.

KotlinJava

private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() {
   
// Implement Capture Callbacks
}
private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() {
   
override fun onConfigured(session: CameraExtensionSession) {
        cameraExtensionSession
= session
       
try {
           
val captureRequest =
                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()
       
}
   
}

   
override fun onClosed(session: CameraExtensionSession) {
       
super.onClosed(session)
        cameraDevice
.close()
   
}

   
override fun onConfigureFailed(session: CameraExtensionSession) {
       
Snackbar.make(
            previewView
,
           
"Failed to start camera extension preview",
           
Snackbar.LENGTH_SHORT
       
).show()
        requireActivity
().finish()
   
}
}

private fun startExtensionSession() {
   
val outputConfig = arrayListOf(
       
OutputConfiguration(stillImageReader.surface),
       
OutputConfiguration(previewSurface)
   
)
   
val extensionConfiguration = ExtensionSessionConfiguration(
       
CameraExtensionCharacteristics.EXTENSION_NIGHT,
        outputConfig
,
       
Dispatchers.IO.asExecutor(),
        extensionSessionStateCallback
   
)
    cameraDevice
.createExtensionSession(extensionConfiguration)
}


private CameraExtensionSession.ExtensionCaptureCallback captureCallbacks =
       
new CameraExtensionSession.ExtensionCaptureCallback() {
           
// Implement Capture Callbacks
       
};

private CameraExtensionSession.StateCallback extensionSessionStateCallback =
       
new CameraExtensionSession.StateCallback() {
           
@Override
           
public void onConfigured(@NonNull CameraExtensionSession session) {
                cameraExtensionSession
= session;
               
try {
                   
CaptureRequest.Builder captureRequestBuilder =
                            cameraDevice
.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    captureRequestBuilder
.addTarget(previewSurface);
                   
CaptureRequest captureRequest = captureRequestBuilder.build();
                    session
.setRepeatingRequest(captureRequest, backgroundExecutor, captureCallbacks);
               
} catch (CameraAccessException e) {
                   
Snackbar.make(
                            previewView
,
                           
"Failed to preview capture request",
                           
Snackbar.LENGTH_SHORT
                   
).show();
                    requireActivity
().finish();
               
}
           
}

           
@Override
           
public void onClosed(@NonNull CameraExtensionSession session) {
               
super.onClosed(session);
                cameraDevice
.close();
           
}

           
@Override
           
public void onConfigureFailed(@NonNull CameraExtensionSession session) {
               
Snackbar.make(
                        previewView
,
                       
"Failed to start camera extension preview",
                       
Snackbar.LENGTH_SHORT
               
).show();
                requireActivity
().finish();
           
}
       
};

private void startExtensionSession() {
   
ArrayList<OutputConfiguration> outputConfig = new ArrayList<>();
    outputConfig
.add(new OutputConfiguration(stillImageReader.getSurface()));
    outputConfig
.add(new OutputConfiguration(previewSurface));
   
ExtensionSessionConfiguration extensionConfiguration = new ExtensionSessionConfiguration(
           
CameraExtensionCharacteristics.EXTENSION_NIGHT,
            outputConfig
,
            backgroundExecutor
,
            extensionSessionStateCallback
   
);
}

Dodatkowe materiały

Więcej informacji: CameraExtensionCharacteristics i obejrzyj publiczne przykłady interfejsu Camera2 Extensions API. aby dowiedzieć się więcej.