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

כדי להשתמש בתכונה 'שיפור התאורה החלשה' של Google, צריך לקוח לשיפור התאורה החלשה. אפשר להשתמש בלקוח כדי לבדוק אם מודול שיפור התמונה בתאורה נמוכה מותקן, ואם המכשיר והמצלמה שבהם פועלת האפליקציה תומכים בשיפור התמונה בתאורה נמוכה של Google. תשתמשו גם בלקוח כדי ליצור LowLightBoostSession. (במהלך הסשן תוכלו להפעיל או להשבית את התכונה 'שיפור איכות הווידאו בתאורה חלשה'). אפשר גם להגדיר מאזין שיקבל קריאות חוזרות כשהשיפור בתאורה חלשה פעיל.

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

יחסי תלות

Kotlin

dependencies {
  val low_light_boost_version = "16.0.0-beta01"
  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.0-beta01"
  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

// 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() קורא לשיטות בקריאה החוזרת הזו כדי לציין את סטטוס ההורדה. לדוגמה, אם ההורדה מושהית, installModule() קורא לשיטה onDownloadPause() של אובייקט ה-callback.
  • בקטע הקוד הזה, אובייקט ה-callback נוצר על ידי השיטה 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(). תצטרכו לכתוב את השיטה הזו בעצמכם.

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

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

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. משתמשים באובייקט הזה כדי להגדיר מאזינים להצלחה ולכישלון. יוצרים את הסשן של הגברת התאורה החלשה בתוך מאזין ההצלחה.