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

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

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

תלויות

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. מידע על גישה לממשקי API של Google Play Services זמין במסמכי התיעוד של 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() מצליחה. חשוב לדעת: אם מתבצעת קריאה ל-listener של ההצלחה, זה רק אומר שהלקוח הצליח לגלות אם המודול מותקן במכשיר. בגוף של רכיב ה-listener, צריך לבדוק אם המודול מותקן בפועל או לא.
  • אם המודול עדיין לא מותקן, קטע הקוד הזה מתקין אותו על ידי קריאה לשיטה 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() מעבירים אובייקט של קריאה חוזרת, שמטמיע את LowLightBoostClient.InstallStatusCallback. ‫installModule() קוראת לשיטות בקריאה החוזרת כדי לציין את סטטוס ההורדה. לדוגמה, אם ההורדה מושהית, הפונקציה installModule() קוראת לשיטה onDownloadPause() של אובייקט הקריאה החוזרת.
  • ��קטע הקוד הזה, אובייקט הקריאה החוזרת נוצר על ידי השיטה 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. אם לא, אל תורידו את המודול.

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

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