Sử dụng phiên tăng cường ánh sáng yếu

Sử dụng phiên tăng cường ánh sáng yếu để bật và tắt tính năng Tăng cường ánh sáng yếu của Google.

Kotlin

dependencies {
  val low_light_boost_version = "16.0.1-beta04"
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")
  implementation("com.google.android.gms:play-services-base:18.7.0")
  implementation("com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}")
  implementation("com.google.android.gms:play-services-tasks:18.3.0")
}

Groovy

dependencies {
  def low_light_boost_version = "16.0.1-beta04"
  implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2'
  implementation 'com.google.android.gms:play-services-base:18.7.0'
  implementation 'com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}'
  implementation 'com.google.android.gms:play-services-tasks:18.3.0'
}

LowLightBoostSession được cung cấp bởi gói com.google.android.gms.cameralowlight của Dịch vụ Google Play. Hãy xem tài liệu về Dịch vụ Google Play để biết thông tin về cách truy cập API Dịch vụ Google Play.

Tạo đối tượng gọi lại

Khi tạo phiên tăng cường ánh sáng yếu, bạn cần truyền cho phiên đó một đối tượng triển khai giao diện LowLightBoostCallback. Các hàm của đối tượng này được gọi khi phiên bị ngắt kết nối hoặc bị huỷ. Mã sau đây cho biết cách tạo lệnh gọi lại:

Kotlin

private fun createLowLightBoostCallback(): LowLightBoostCallback =
  object : LowLightBoostCallback() {
    override fun onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed")
      lowLightBoostSession = null
    }

    override fun onSessionDisconnected(statusCode: Int) {
      Log.d(TAG, "onSessionDisconnected: error=$statusCode")
      lowLightBoostSession = null
    }
  }

Java

private LowLightBoostCallback createLowLightBoostCallback() {
  LowLightBoostCallback lowLightBoostCallback = new LowLightBoostCallback() {
    @Override
    public void onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed");
      lowLightBoostSession = null;
    }

    @Override
    public void onSessionDisconnected(int statusCode) {
      Log.d(TAG, "onSessionCreationFailed: error=" + statusCode);
      lowLightBoostSession = null;
    }
  }
  return lowLightBoostCallback;
}

Các điểm chính về mã này

  • Mã này xác định một phương thức riêng tư, createLowLightBoostCallback(), tạo đối tượng gọi lại. Bạn sẽ gọi phương thức đó khi thực sự tạo phiên tăng cường ánh sáng yếu, như mô tả trong phần Tạo phiên.
  • Lệnh gọi lại được gọi khi phiên bị ngắt kết nối hoặc bị huỷ. Hàm này không được gọi khi phiên được tạo. Để kiểm tra xem phiên đã được tạo thành công hay chưa, hãy kiểm tra đối tượng Task do LowLightBoostClient.createSession trả về.

Tạo phiên

Để tạo một phiên chụp trong điều kiện ánh sáng yếu, hãy gọi phương thức LowLightBoostClient.createSession.

Kotlin

val options = LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost
)

launch {
  try {
    val lowLightBoostSession = lowLightBoostClient
      .createSession(options, createLowLightBoostCallback()).await()

    Log.d(TAG, "Session created successfully")

    // Get the surface from the LLB session;
    // give it to camera so camera can write frames to it
  } catch (e: CancellationException) {
    Log.w(TAG, "Session creation was canceled", e)
    lowLightBoostSession = null
  } catch (e: ApiException) {
    Log.e(TAG, "Session creation failed with ApiException:", e)
    lowLightBoostSession = null
  } catch (e: Exception) {
    Log.e(TAG, "Session creation failed with Exception", e)
    lowLightBoostSession = null
  }
}

Java

LowLightBoostOptions options = new LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost);

lowLightBoostClient
  .createSession(options, createLowLightBoostCallback())
  .addOnSuccessListener(
    lowLightBoostExecutor,
    (session) -> {
      Log.d(TAG, "Session created successfully");

      // Get the surface from the LLB session;
      // give it to camera so camera can write frames to it

    })
  .addOnFailureListener(
    lowLightBoostExecutor,
    (e) -> {
      ApiException apiException = (ApiException) e;
      Log.d(TAG, "Session creation failed: " + e);
      lowLightBoostSession = null;
    })
  .addOnCompleteListener(
    lowLightBoostExecutor,
    (task) -> Log.d(TAG, "Session creation complete"))
  .addOnCanceledListener(
    lowLightBoostExecutor,
    () -> {
      throw new RuntimeException("Session creation canceled");
    });

Các điểm chính về mã này

  • Bạn truyền một đối tượng LowLightBoostOptions đến createSession() để định cấu hình phiên. Đối tượng này chỉ định những thông tin như bề mặt mục tiêu, mã nhận dạng của camera cần sử dụng và kích thước của bản xem trước.
  • Mã này giả định rằng bạn đã mở kết nối với camera Camera2 và sử dụng thông tin đó để đặt giá trị của cameraId, previewWidth, previewHeight. Để biết thêm thông tin, hãy xem tài liệu về Camera2.
  • enableLowLightBoost là một giá trị boolean chỉ định xem tính năng tăng cường ánh sáng yếu có nên bắt đầu bật hay tắt.
  • createLowLightBoostCallback là một phương thức bạn viết để tạo đối tượng gọi lại. Đối tượng này được gọi khi phiên bị ngắt kết nối hoặc bị huỷ.
  • Phương thức LowLightBoostClient.createSession() trả về đối tượng Task. Bạn sử dụng đối tượng này để thiết lập trình nghe thành công và không thành công. Quay video bên trong trình nghe thành công.
  • Bạn có thể chỉ định một Executor để chạy trình nghe. Nếu bạn không chỉ định Executor, trình nghe sẽ chạy trên luồng chính. Trong đoạn mã này, chúng ta giả định lowLightBoostExecutor là một Executor phù hợp.

Truyền kết quả chụp

Tính năng Tăng cường ánh sáng yếu của Google cần một số siêu dữ liệu nhất định của camera để biết mức độ làm sáng chính xác cần áp dụng. Bạn phải truyền TotalCaptureResult vào phương thức processCaptureResult(). Bạn có thể lấy TotalCaptureResult trong phương thức gọi lại onCaptureCompleted().

Kotlin

  val captureCallback = CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      lowLightBoostSession?.processCaptureResult(result)
    }
  }

Java

  CameraCaptureSession.CaptureCallback captureCallback =
    new CameraCaptureSession.CaptureCallback() {
      @Override
      public void onCaptureCompleted(
        @NonNull CameraCaptureSession session,
        @NonNull CaptureRequest request,
        @NonNull TotalCaptureResult result) {
          super.onCaptureCompleted(session, request, result)
          if (lowLightBoostSession != null) {
            lowLightBoostSession.processCaptureResult(result);
          }
        }
      };

Các điểm chính về mã này

  • Mã này chỉ cho thấy mã CaptureCallback liên quan đến Google LLB. Bạn có thể sẽ có mã khác trong các lệnh gọi lại này.
  • Việc truyền TotalCaptureResult cho phép Google LLB phân tích dữ liệu phơi sáng tự động và siêu dữ liệu khác cần thiết để tăng cường ánh sáng yếu nhằm xử lý tính năng phát hiện cảnh và xác định mức tăng cường cần áp dụng cho khung hình.
  • Bạn nên truyền đối tượng captureCallback khi tạo phiên camera, ví dụ: bằng `setSingleRepeatingRequest().

Bắt đầu xem trước camera

Sau khi tạo phiên chụp trong điều kiện ánh sáng yếu, bạn có thể bắt đầu luồng xem trước của máy ảnh. Bạn nên thực hiện việc này bên trong lệnh gọi lại onSuccess() mà bạn truyền đến phiên ánh sáng yếu, như mô tả trong phần Tạo phiên. Đoạn mã sau đây cho biết cách quay video:

Kotlin

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=$boostStrength")
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  )
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface())
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (e: CameraAccessException) {
  Log.e(TAG, "Failed to start capture session", e)
  // Must try again or start the capture session without LLB.
}

Java

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession;
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=" + boostStrength);
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  );
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface());
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (CameraAccessException e) {
  Log.e(TAG, "Failed to start capture session", e);
  // Must try again or start the capture session without LLB.
}

Các điểm chính về mã này

  • lowLightBoostSession là phiên bạn đã tạo trong phần Tạo phiên.
  • setSceneDetectorCallback() xác định một đối tượng gọi lại triển khai giao diện SceneDetectorCallback. Phiên sẽ gọi phương thức onSceneBrightnessChanged() của đối tượng đó khi độ sáng của cảnh thay đổi. Cách triển khai của bạn phải điều chỉnh giao diện người dùng của camera cho phù hợp.
  • Bạn có thể chỉ định một Executor để chạy lệnh gọi lại. Nếu bạn không chỉ định Executor, lệnh gọi lại sẽ chạy trên luồng chính. Trong đoạn mã này, chúng ta giả định lowLightBoostExecutor là một Executor phù hợp.
  • lowLightBoostSession.getCameraSurface() trả về Surface cùng với video đã quay.

Giải phóng phiên

Khi camera không còn hoạt động, hãy giải phóng phiên tăng cường ánh sáng yếu bằng cách gọi LowLightBoostSession.release(). Cụ thể, bạn nên đảm bảo giải phóng phiên khi hoạt động của bạn bị huỷ. Bạn có thể thực hiện việc này bằng cách gọi phương thức trong phương thức onDestroy() của hoạt động:

Kotlin

override protected void onDestroy() {
  super.onDestroy()
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release()
    lowLightBoostSession = null
  }
}

Java

@Override
protected void onDestroy() {
  super.onDestroy();
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release();
    lowLightBoostSession = null;
  }
}

Các điểm chính về mã này

  • Sau khi phiên phát được giải phóng, bạn không nên gọi bất kỳ phương thức nào của phiên phát đó. Bạn nên xoá mọi biến trỏ đến phiên, như mã này thực hiện.