יצירת לקוח עם שיפור בתנאי תאורה חלשה ושימוש בו

כדי להשתמש ב-Google Low Light Boost, צריך קליינט של Low Light Boost. אתם יכולים להשתמש בלקוח כדי לבדוק אם המודול של "שיפור בתאורה חלשה" מותקן, ואם המכשיר והמצלמה שהאפליקציה פועלת בהם תומכים ב"שיפור בתאורה חלשה" של Google. משתמשים בלקוח גם כדי ליצור LowLightBoostSession. (תשתמשו בסשן כדי להפעיל ולהשבית את שיפור התאורה החלשה). אתם יכולים גם להגדיר פונקציית listener כדי לקבל קריאות חוזרות (callbacks) כשהתכונה "שיפור בתאורה חלשה" מופעלת.

‫LowLightBoostClient שיטות לא מסמנות הצלחה או כישלון באופן ישיר. במקום זאת, הן מחזירות אובייקט Task. משתמשים ב-Task כדי להגדיר מאזינים להצלחה ולכישלון. כך השיטות יכולות לאותת על הצלחה או כישלון באופן אסינכרוני, וזה הכרחי כי השיטות צריכות לתקשר עם Google Play Services.

פניות קשורות

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")
}

מגניב

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'
}

‫LowLightBoostClient מסופק על ידי החבילה com.google.android.gms.cameralowlight של Google Play Services. במסמכי התיעוד של Google Play Services מוסבר איך לגשת לממשקי ה-API של Google Play Services.

יצירת לקוח

כדי לעשות כל דבר אחר, צריך לקוח של שיפור איכות התאורה. הקוד הבא יוצר לקוח:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

מידע חשוב על הקוד

  • המחלקה LowLightBoost מספקת את השיטה הסטטית getClient, שמחזירה מופע של LowLightBoostClient.

איך בודקים אם המכשיר תומך בשיפור האיכות בתאורה חלשה

אחרי שיש לכם לקוח, אתם יכולים לבדוק אם המכשיר שהאפליקציה פועלת בו תומך בשיפור התאורה. הקוד הבא בודק אם יש תמיכה בשיפור התאורה החלשה:

Kotlin

launch {
  try {
    // Await the result of the Task in a non-blocking way
    val isSupported: Boolean = lowLightBoostClient
      .isCameraSupported(cameraId).await()
    Log.d(TAG, "isCameraSupported: $isSupported")
    if (isSupported) {
      // Create the low light boost session here
    }
  } catch (e: Exception) {
    Log.e(TAG, "isCameraSupported failed", e)
  }
}

Java

lowLightBoostClient
  .isCameraSupported(cameraId)
  .addOnSuccessListener(
    lowLightBoostExecutor,
    (isSupported) -> {
      Log.d(TAG, "isCameraSupported: " + isSupported);
      if (isSupported) {
        // Create the low light boost session here
      }
    )

מידע חשוב על הקוד

  • ההנחה היא ש-cameraId הוא המזהה של מצלמת Camera2, שנוצרה במקום אחר.
  • LowLightBoostClient.isCameraSupported() בודק אם המצלמה ב-Camera2 תומכת בשיפור התאורה. במקרים מסוימים, יכול להיות שהמכשיר תומך בשיפור התאורה אבל אחת מהמצלמות שלו לא תומכת, אז צריך לבדוק את שניהם.
  • השיטה LowLightBoostClient.isCameraSupported() מחזירה אובייקט Task. אתם משתמשים באובייקט הזה כדי להגדיר מאזינים להצלחה ולכישלון. יוצרים את הסשן של שיפור התאורה החלשה בתוך המאזין להצלחה.

בודקים אם מודול שיפור התאורה החלשה מותקן

אחרי שיוצרים לקוח, אפשר לבדוק אם המודול לשיפור התאורה מותקן במכשיר. הקוד הבא בודק אם המודול מותקן:

Kotlin

// Handle the Google Play services Task API with Kotlin coroutines
// (kotlinx-coroutines-play-services)
launch {
  try {
    val isInstalled: Boolean = lowLightBoostClient
      .isModuleInstalled(context).await()

    if (isInstalled) {
      Log.d(TAG, "Module is installed")
      try {
        openCamera(cameraId)
      } catch (e: CameraAccessException) {
        Log.e(TAG, "Failed to open camera", e)
      }
    } else {
      Log.d(TAG, "Module is not installed")
      launchInstallRequest()
    }
  } catch (e: Exception) {
    Log.e(TAG, "Failed to check module availability", e)
  }
}

Java

lowLightBoostClient
  .isModuleInstalled(context)
  .addOnSuccessListener(
    (isInstalled) -> {
      if (isInstalled) {
        Log.d(TAG, "Module is installed");
        try {
          openCamera(cameraId);
        } catch (CameraAccessException e) {
          Log.e(TAG, "Failed to open camera", e);
        }
      } else {
        Log.d(TAG, "Module is not installed");
        launchInstallRequest();
      }
    })
  .addOnFailureListener(
    (e) -> {
      Log.e(TAG, "Failed to check module availability", e);
    });

מידע חשוב על הקוד

  • הקוד הזה פותח סשן של מצלמה שמתחבר למצלמה שמזוהה על ידי cameraId. מידע נוסף זמין במסמכי התיעוד של Camera2.
  • השיטה LowLightBoostClient.isModuleInstalled() מחזירה אובייקט Task. אתם משתמשים באובייקט הזה כדי להגדיר מאזינים להצלחה ולכישלון.
  • משתמשים ב-Task.addOnSuccessListener() כדי להגדיר מאזין שמופעל אם הקריאה ל-isModuleInstalled() מצליחה. חשוב: אם המאזין להצלחה נקרא, זה רק אומר שהלקוח הצליח לגלות אם המודול מותקן במכשיר. בגוף של המאזין, צריך לבדוק אם המודול באמת מותקן או לא.
  • אם המודול עדיין לא מותקן, קטע הקוד הזה מתקין אותו באמצעות קריאה ל-method‏ launchInstallRequest(). השיטה הזו מוגדרת בקטע הקוד שבחלק התקנת המודול לשיפור האיכות בתאורה חלשה.

התקנת המודול "שיפור איכות הווידאו בתאורה חלשה"

אם המודול לשיפור התאורה לא מותקן במכשיר, צריך להוריד ולהתקין אותו מ-Google Play Services. הקוד הבא מראה איך עושים את זה:

Kotlin

private suspend fun launchInstallRequest() {
  Log.v(TAG, "Launching install request")

  try {
    // Check if this device can support Google LLB.
    val isDeviceSupported: Boolean = lowLightBoostClient
      .isDeviceSupported(context).await()

    if (isDeviceSupported) {
      Log.d(TAG, "Device is supported")
      // Show download indicator, if needed.

      try {
        val isInstallSuccessful: Boolean = lowLightBoostClient
          .installModule(context,
                        createInstallStatusCallback()
          ).await()

        if (isInstallSuccessful) {
          Log.d(TAG, "Module installed")
          // Hide download indicator, if needed.
          try {
            openCamera()
          } catch (e: CameraAccessException) {
            Log.e(TAG, "Failed to open camera", e)
          }
        } else {
          Log.d(TAG, "Module install failed")
        }
      } catch (e: Exception) {
        Log.e(TAG, "An error occurred installing the module:", e)
      }
    } else {
      Log.d(TAG, "Device is not supported")
    }
  } catch (e: Exception) {
    Log.e(TAG, "An error occurred checking device support:", e)
  }
}

Java

private void launchInstallRequest() {
  Log.v(TAG, "Launching install request");
  // Check if this device can support Google LLB.
  lowLightBoostClient
    .isDeviceSupported(context)
    .addOnSuccessListener(
      (isDeviceSupported) -> {
        if (isDeviceSupported) {
          Log.d(TAG, "Device is supported");
          // Show download indicator, if needed.
          lowLightBoostClient
            .installModule(
              this,
              createInstallStatusCallback()
            )
            .addOnSuccessListener(
              (result) -> {
                if (result) {
                  Log.d(TAG, "Module installed");
                  // Hide download indicator, if needed.
                  try {
                    openCamera();
                  } catch (CameraAccessException e) {
                    Log.e(TAG, "Failed to open camera", e);
                  }
                } else {
                  Log.d(TAG, "Module install failed");
                }
              }
            );
        } else {
          Log.d(TAG, "Device is not supported");
        }
      })
    .addOnFailureListener(
      (e) -> {
        Log.e(TAG, "Failed to check device support", e);
      });
}

מידע חשוב על הקוד

  • כשמפעילים את LowLightBoostClient.installModule(), מעבירים אובייקט קריאה חוזרת (callback) שמטמיע את LowLightBoostClient.InstallStatusCallback. ‫installModule() מפעיל שיטות בקריאה החוזרת (callback) הזו כדי לציין את סטטוס ההורדה. לדוגמה, אם ההורדה מושהית, installModule() קורא ל-callback object של השיטה onDownloadPause().
  • בקטע הקוד הזה, אובייקט הקריאה החוזרת נוצר על ידי ה-method‏ createInstallStatusCallback(). תצטרכו לכתוב את השיטה הזו בעצמכם, בדומה לזה:

Kotlin

private fun createInstallStatusCallback(): LowLightBoostClient.InstallStatusCallback =
        object : LowLightBoostClient.InstallStatusCallback() {
    override fun onDownloadPending() {
      Log.d(TAG, "onDownloadPending")
      // Code here...
    }

    override fun onDownloadStart() {
      Log.d(TAG, "onDownloadStart")
      // Code here...
    }

    // other overrides here...
  }

Java

private InstallStatusCallback createInstallStatusCallback() {
  new LowLightBoostClient.InstallStatusCallback() {
    @Override
    public void onDownloadPending() {
      Log.d(TAG, "onDownloadPending");
      // Code here...
    }

    @Override
    public void onDownloadStart() {
      Log.d(TAG, "onDownloadStart");
      // Code here...
    }

  // other overrides here...
}
  • ‫LowLightBoostClient.isDeviceSupported() בודק אם המכשיר ומערכת ההפעלה של Android תומכים ב-Google Low Light Boost. אם לא, אל תורידו את המודול.

  • השיטה LowLightBoostClient.installModule() מחזירה אובייקט Task. אתם משתמשים באובייקט הזה כדי להגדיר מאזינים להצלחה ולכישלון.

  • כשההתקנה מסתיימת, המאזין לאירוע ההצלחה פותח את המצלמה כדי לאמת את ההתקנה. בקטע הקוד, הפעולה הזו מתבצעת באמצעות קריאה ל-openCamera(). תצטרכו לכתוב את השיטה הזו בעצמכם.