Camera2 Extensions API

注: このページでは、Camera2 パッケージについて説明します。アプリで Camera2 の特定の低レベルの機能を必要とする場合を除き、CameraX を使用することをおすすめします。CameraX と Camera2 は、どちらも Android 5.0(API レベル 21)以降に対応しています。

Camera2 には、デバイス メーカーがさまざまな Android デバイスに実装している拡張機能にアクセスするための拡張機能 API が用意されています。サポートされている拡張機能モードの一覧については、カメラ拡張機能をご覧ください。

拡張機能をサポートするデバイスの一覧については、サポートされているデバイスについての説明をご覧ください。

拡張機能のアーキテクチャ

次の図は、カメラの拡張機能のアーキテクチャを示しています。

図 1. カメラの拡張機能のアーキテクチャ

Camera2 アプリは、Camera2 API を通じて拡張機能を使用できます。Camera2 API では、利用可能な拡張機能のクエリ、拡張機能の構成が可能 カメラセッションを作成し、カメラ拡張機能 OEM ライブラリと通信します。この は、夜間モード、HDR、自動、ボケ味などの拡張機能をアプリケーションで 顔写真加工。

カメラデバイスの Camera2 Extensions API の互換性をテストする

次のコード スニペットは、デバイスが Camera2 をサポートしているかどうかを確認します。 Extensions API。拡張機能は一部のデバイスでサポートされていないか、一部のデバイスでサポートされている可能性があります できます。このスニペットは、サポートされているカメラ ID のリストを返します。 使用できます。

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();
   
}
}

Camera2 Extensions API を使用して CameraExtensionSession を作成する

Camera2 Extensions API を対応デバイスで使用すると、 特定のカメラ拡張機能を使用できます。次のコード スニペットは、 CameraExtensionSession の作成方法 既存の 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
   
);
}

参考情報

詳細については、次をご覧ください: CameraExtensionCharacteristics 一般公開されている Camera2 Extensions API サンプルをご覧ください。 をご覧ください。