CameraX Extensions API

CameraX یک Extensions API برای دسترسی به افزونه‌هایی که سازندگان دستگاه در دستگاه‌های اندرویدی مختلف پیاده‌سازی کرده‌اند، ارائه می‌کند. برای لیستی از حالت های برنامه افزودنی پشتیبانی شده، به برنامه های افزودنی دوربین مراجعه کنید.

برای فهرستی از دستگاه‌هایی که از برنامه‌های افزودنی پشتیبانی می‌کنند، به دستگاه‌های پشتیبانی‌شده مراجعه کنید.

معماری افزونه ها

تصویر زیر معماری افزونه های دوربین را نشان می دهد.

شکل 1. معماری برنامه های افزودنی دوربین

یک برنامه CameraX می تواند از برنامه های افزودنی از طریق CameraX Extensions API استفاده کند. CameraX Extensions API پرس‌وجو برای برنامه‌های افزودنی موجود، پیکربندی جلسه دوربین افزونه و برقراری ارتباط با کتابخانه OEM Camera Extensions را مدیریت می‌کند. این به برنامه شما اجازه می دهد تا از قابلیت هایی مانند Night، HDR، Auto، Bokeh یا Face Retouch استفاده کند.

یک برنامه افزودنی را برای ضبط و پیش نمایش تصویر فعال کنید

قبل از استفاده از برنامه افزودنی API، یک نمونه ExtensionsManager را با استفاده از روش ExtensionsManager#getInstanceAsync(Context، CameraProvider) بازیابی کنید. این به شما امکان می دهد اطلاعات در دسترس بودن برنامه افزودنی را جستجو کنید. سپس یک پسوند فعال CameraSelector را بازیابی کنید. هنگام فراخوانی متد ()bindToLifecycle با فعال بودن پسوند CameraSelector ، حالت افزونه در موارد استفاده از ضبط و پیش نمایش تصویر اعمال می شود.

برای پیاده سازی پسوند برای موارد استفاده از عکس برداری و پیش نمایش، به نمونه کد زیر مراجعه کنید:

کاتلین

import androidx.camera.extensions.ExtensionMode
import androidx.camera.extensions.ExtensionsManager

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val lifecycleOwner = this

    val cameraProviderFuture = ProcessCameraProvider.getInstance(applicationContext)
    cameraProviderFuture.addListener({
        // Obtain an instance of a process camera provider
        // The camera provider provides access to the set of cameras associated with the device.
        // The camera obtained from the provider will be bound to the activity lifecycle.
        val cameraProvider = cameraProviderFuture.get()

        val extensionsManagerFuture =
            ExtensionsManager.getInstanceAsync(applicationContext, cameraProvider)
        extensionsManagerFuture.addListener({
            // Obtain an instance of the extensions manager
            // The extensions manager enables a camera to use extension capabilities available on
            // the device.
            val extensionsManager = extensionsManagerFuture.get()

            // Select the camera
            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            // Query if extension is available.
            // Not all devices will support extensions or might only support a subset of
            // extensions.
            if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.NIGHT)) {
                // Unbind all use cases before enabling different extension modes.
                try {
                    cameraProvider.unbindAll()

                    // Retrieve a night extension enabled camera selector
                    val nightCameraSelector =
                        extensionsManager.getExtensionEnabledCameraSelector(
                            cameraSelector,
                            ExtensionMode.NIGHT
                        )

                    // Bind image capture and preview use cases with the extension enabled camera
                    // selector.
                    val imageCapture = ImageCapture.Builder().build()
                    val preview = Preview.Builder().build()
                    // Connect the preview to receive the surface the camera outputs the frames
                    // to. This will allow displaying the camera frames in either a TextureView
                    // or SurfaceView. The SurfaceProvider can be obtained from the PreviewView.
                    preview.setSurfaceProvider(surfaceProvider)

                    // Returns an instance of the camera bound to the lifecycle
                    // Use this camera object to control various operations with the camera
                    // Example: flash, zoom, focus metering etc.
                    val camera = cameraProvider.bindToLifecycle(
                        lifecycleOwner,
                        nightCameraSelector,
                        imageCapture,
                        preview
                    )
                } catch (e: Exception) {
                    Log.e(TAG, "Use case binding failed", e)
                }
            }
        }, ContextCompat.getMainExecutor(this))
    }, ContextCompat.getMainExecutor(this))
}

جاوا

import androidx.camera.extensions.ExtensionMode;
import androidx.camera.extensions.ExtensionsManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final LifecycleOwner lifecycleOwner = this;

    final ListenableFuture cameraProviderFuture =
            ProcessCameraProvider.getInstance(getApplicationContext());

    cameraProviderFuture.addListener(() -> {
      try {
          // Obtain an instance of a process camera provider
          // The camera provider provides access to the set of cameras associated with the
          // device. The camera obtained from the provider will be bound to the activity
          // lifecycle.
          final ProcessCameraProvider cameraProvider = cameraProviderFuture.get();

          final ListenableFuture extensionsManagerFuture =
                  ExtensionsManager.getInstanceAsync(getApplicationContext(), cameraProvider);
          extensionsManagerFuture.addListener(() -> {
              // Obtain an instance of the extensions manager
              // The extensions manager enables a camera to use extension capabilities available
              // on the device.
              try {
                  final ExtensionsManager extensionsManager = extensionsManagerFuture.get();

                  // Select the camera
                  final CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;

                  // Query if extension is available.
                  // Not all devices will support extensions or might only support a subset of
                  // extensions.
                  if (extensionsManager.isExtensionAvailable(
                          cameraSelector,
                          ExtensionMode.NIGHT
                  )) {
                      // Unbind all use cases before enabling different extension modes.
                      cameraProvider.unbindAll();

                      // Retrieve extension enabled camera selector
                      final CameraSelector nightCameraSelector = extensionsManager
                              .getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.NIGHT);

                      // Bind image capture and preview use cases with the extension enabled camera
                      // selector.
                      final ImageCapture imageCapture = new ImageCapture.Builder().build();
                      final Preview preview = new Preview.Builder().build();
                      // Connect the preview to receive the surface the camera outputs the frames
                      // to. This will allow displaying the camera frames in either a TextureView
                      // or SurfaceView. The SurfaceProvider can be obtained from the PreviewView.
                      preview.setSurfaceProvider(surfaceProvider);

                      cameraProvider.bindToLifecycle(
                              lifecycleOwner,
                              nightCameraSelector,
                              imageCapture,
                              preview
                      );
                  }
              } catch (ExecutionException | InterruptedException e) {
                  throw new RuntimeException(e);
              }
          }, ContextCompat.getMainExecutor(this));

      } catch (ExecutionException | InterruptedException e) {
          throw new RuntimeException(e);
      }

  }, ContextCompat.getMainExecutor(this));
}

افزونه را غیرفعال کنید

برای غیرفعال کردن برنامه‌های افزودنی فروشنده، همه موارد استفاده را باز کنید و با انتخابگر معمولی دوربین، موارد استفاده از عکس‌برداری و پیش‌نمایش را مجدداً تنظیم کنید. برای مثال، با استفاده از CameraSelector.DEFAULT_BACK_CAMERA به دوربین پشتی متصل شوید.DEFAULT_BACK_CAMERA.

وابستگی ها

CameraX Extensions API در کتابخانه camera-extensions پیاده سازی شده است. برنامه های افزودنی به ماژول های هسته CameraX ( core ، camera2 ، lifecycle ) بستگی دارد.

شیار

dependencies {
  def camerax_version = "1.2.0-rc01"
  implementation "androidx.camera:camera-core:${camerax_version}"
  implementation "androidx.camera:camera-camera2:${camerax_version}"
  implementation "androidx.camera:camera-lifecycle:${camerax_version}"
  //the CameraX Extensions library
  implementation "androidx.camera:camera-extensions:${camerax_version}"
    ...
}

کاتلین

dependencies {
  val camerax_version = "1.2.0-rc01"
  implementation("androidx.camera:camera-core:${camerax_version}")
  implementation("androidx.camera:camera-camera2:${camerax_version}")
  implementation("androidx.camera:camera-lifecycle:${camerax_version}")
  // the CameraX Extensions library
  implementation("androidx.camera:camera-extensions:${camerax_version}")
    ...
}

حذف API قدیمی

با API جدید Extensions که در 1.0.0-alpha26 منتشر شد، API قدیمی Extensions که در آگوست 2019 منتشر شد اکنون منسوخ شده است. با شروع نسخه 1.0.0-alpha28 ، API قدیمی Extensions از کتابخانه حذف شده است. برنامه‌هایی که از Extensions API جدید استفاده می‌کنند، اکنون باید یک CameraSelector با پسوند فعال داشته باشند و از آن برای اتصال موارد استفاده استفاده کنند.

برنامه‌هایی که از API قدیمی Extensions استفاده می‌کنند باید به Extensions API جدید منتقل شوند تا از سازگاری آینده با نسخه‌های CameraX آینده اطمینان حاصل کنند.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد CameraX، به منابع اضافی زیر مراجعه کنید.

Codelab

  • شروع کار با CameraX
  • نمونه کد

    برنامه نمونه برنامه افزودنی CameraX

    سایر مراجع

    برنامه های افزودنی فروشنده CameraX

    ابزار اعتبار سنجی افزونه های فروشنده CameraX