Triển khai quảng cáo trong chế độ hình trong hình (thử nghiệm)

Hình trong hình

Quảng cáo hình trong hình (PiP) xuất hiện trong một cửa sổ nổi nằm phía trên nội dung trên màn hình, chẳng hạn như bài viết, nguồn cấp dữ liệu hoặc nội dung chơi trò chơi. Định dạng này cho phép người dùng tương tác với ứng dụng của bạn trong khi quảng cáo vẫn hiển thị. Để hiển thị quảng cáo không chiếm toàn bộ màn hình, hãy chọn định dạng này. Tìm hiểu thêm về quảng cáo trong chế độ hình trong hình.

Hướng dẫn này trình bày cách yêu cầu và hiển thị quảng cáo ở chế độ hình trong hình trong ứng dụng của bạn bằng GMA Next-Gen SDK.

Trước khi bắt đầu

Trước khi tiếp tục, hãy làm như sau:

Tải một quảng cáo

Để tải PictureInPictureAd, hãy tạo một yêu cầu quảng cáo và gọi phương thức load:

Kotlin

private fun loadPictureInPictureAd() {
  val request = PictureInPictureAdRequest.Builder(AD_UNIT_ID).build()

  PictureInPictureAd.load(
    request,
    object : AdLoadCallback<PictureInPictureAd> {
      override fun onAdFailedToLoad(adError: LoadAdError) {
        Log.w(TAG, "Picture-in-Picture ad failed to load: $adError")
      }

      override fun onAdLoaded(ad: PictureInPictureAd) {
        Log.d(TAG, "Picture-in-Picture ad loaded.")

        // Capture the PictureInPictureAd reference for later use.
        pipAd = ad
        setAdEventCallback(ad)
      }
    },
  )
}

Java

private void loadPictureInPictureAd() {
  PictureInPictureAdRequest request = new PictureInPictureAdRequest.Builder(AD_UNIT_ID).build();

  PictureInPictureAd.load(
      request,
      new AdLoadCallback<PictureInPictureAd>() {
        @Override
        public void onAdFailedToLoad(@NonNull LoadAdError adError) {
          Log.w(TAG, "Picture-in-Picture ad failed to load: " + adError);
        }

        @Override
        public void onAdLoaded(@NonNull PictureInPictureAd ad) {
          Log.d(TAG, "Picture-in-Picture ad loaded.");

          // Capture the PictureInPictureAd reference for later use.
          pipAd = ad;
          setAdEventCallback(ad);
        }
      });
}

Thay thế AD_UNIT_ID bằng mã đơn vị quảng cáo của bạn.

Hiển thị quảng cáo

Để hiển thị quảng cáo ở chế độ PiP trên màn hình, hãy định cấu hình các lựa chọn PiP và gọi phương thức show. Ví dụ sau đây đặt vị trí mặc định của quảng cáo và phạm vi trình bày thành màn hình:

Kotlin

private fun showPictureInPictureAd(activity: Activity) {
  // Capture the ad reference saved from the onAdLoaded callback.
  val ad = pipAd
  if (ad != null) {
    val options =
      PictureInPictureAdOptions.Builder()
        // Uses the Google Mobile Ads SDK's default screen position.
        .setPosition(PictureInPictureAdPosition.DEFAULT)
        // Binds the ad lifecycle to the host screen.
        .setPresentationScope(PictureInPictureAdPresentationScope.SCREEN)
        .build()
    ad.show(activity, options)
  } else {
    Log.d(TAG, "No ad to show.")
  }
}

Java

private void showPictureInPictureAd(@NonNull Activity activity) {
  // Use the ad reference saved from the onAdLoaded callback.
  if (pipAd != null) {
    PictureInPictureAdOptions options =
        new PictureInPictureAdOptions.Builder()
            // Uses the Google Mobile Ads SDK's default screen position.
            .setPosition(PictureInPictureAdPosition.DEFAULT)
            // Binds the ad lifecycle to the host screen.
            .setPresentationScope(PictureInPictureAdPresentationScope.SCREEN)
            .build();
    pipAd.show(activity, options);
  } else {
    Log.d(TAG, "No ad to show.");
  }
}

Đặt vị trí

Theo mặc định, GMA Next-Gen SDK sẽ hiển thị quảng cáo ở chế độ hình trong hình ở góc dưới cùng bên phải màn hình khi quảng cáo xuất hiện lần đầu hoặc ở vị trí đã biết gần đây nhất nếu quảng cáo đã xuất hiện trước đó. Để tuỳ chỉnh vị trí xuất hiện của quảng cáo, hãy đặt vị trí trong chế độ hình trong hình. Ví dụ sau đây đặt vị trí ở trên cùng của nội dung ở góc trên cùng bên trái màn hình:

Kotlin

private fun createTopLeftPositionOptions(): PictureInPictureAdOptions {
  return PictureInPictureAdOptions.Builder()
    // Sets the ad position to the top-left corner of the screen.
    .setPosition(PictureInPictureAdPosition.TOP_LEFT)
    .build()
}

Java

private PictureInPictureAdOptions createTopLeftPositionOptions() {
  return new PictureInPictureAdOptions.Builder()
      // Sets the ad position to the top-left corner of the screen.
      .setPosition(PictureInPictureAdPosition.TOP_LEFT)
      .build();
}

Để biết tất cả các vị trí có sẵn, hãy xem PictureInPictureAdPosition.

Đặt phạm vi trình bày

Theo mặc định, GMA Next-Gen SDK sẽ liên kết quảng cáo trong chế độ hình trong hình với màn hình máy chủ hiện tại. GMA Next-Gen SDK đóng quảng cáo khi hệ phân cấp view của màn hình lưu trữ không còn trong bộ nhớ. Để quảng cáo vẫn hiển thị sau khi màn hình lưu trữ bị xoá khỏi bộ nhớ, hãy đặt phạm vi trình bày thành ứng dụng:

Kotlin

private fun createApplicationScopedOptions(): PictureInPictureAdOptions {
  return PictureInPictureAdOptions.Builder()
    // Keeps the ad visible beyond the host screen's lifecycle.
    .setPresentationScope(PictureInPictureAdPresentationScope.APPLICATION)
    .build()
}

Java

private PictureInPictureAdOptions createApplicationScopedOptions() {
  return new PictureInPictureAdOptions.Builder()
      // Keeps the ad visible beyond the host screen's lifecycle.
      .setPresentationScope(PictureInPictureAdPresentationScope.APPLICATION)
      .build();
}

Để biết thêm thông tin, hãy xem bài viết Duy trì khả năng hiển thị của quảng cáo trên nhiều màn hình.

Đặt lệnh gọi lại sự kiện quảng cáo

Để xử lý các sự kiện trong vòng đời của quảng cáo ở chế độ hình trong hình, hãy đặt lệnh gọi lại sự kiện trên quảng cáo trước khi hiển thị. Lệnh gọi lại này báo cáo các sự kiện tiêu chuẩn, chẳng hạn như lượt nhấp và lượt hiển thị. Lệnh gọi lại này cũng báo cáo các sự kiện dành riêng cho chế độ hình trong hình, chẳng hạn như khi quảng cáo hiển thị hoặc bị ẩn:

Kotlin

private fun setAdEventCallback(pipAd: PictureInPictureAd) {
  pipAd.adEventCallback =
    object : PictureInPictureAdEventCallback {
      override fun onAdShown() {
        Log.d(TAG, "Picture-in-Picture ad shown.")
      }

      override fun onAdHidden() {
        Log.d(TAG, "Picture-in-Picture ad hidden.")
      }

      override fun onAdImpression() {
        Log.d(TAG, "Picture-in-Picture ad recorded an impression.")
      }

      override fun onAdClicked() {
        Log.d(TAG, "Picture-in-Picture ad recorded a click.")
      }

      override fun onAdShowedFullScreenContent() {
        Log.d(TAG, "Picture-in-Picture ad showed full screen content.")
      }

      override fun onAdDismissedFullScreenContent() {
        Log.d(TAG, "Picture-in-Picture ad dismissed full screen content.")
      }

      override fun onAdFailedToShowFullScreenContent(
        fullScreenContentError: FullScreenContentError
      ) {
        Log.w(
          TAG,
          "Picture-in-Picture ad failed to show full screen content: $fullScreenContentError",
        )
      }

      override fun onAdPaid(value: AdValue) {
        Log.d(TAG, "Picture-in-Picture ad paid: ${value.valueMicros} ${value.currencyCode}")
      }
    }
}

Java

private void setAdEventCallback(@NonNull PictureInPictureAd pipAd) {
  pipAd.setAdEventCallback(
      new PictureInPictureAdEventCallback() {
        @Override
        public void onAdShown() {
          Log.d(TAG, "Picture-in-Picture ad shown.");
        }

        @Override
        public void onAdHidden() {
          Log.d(TAG, "Picture-in-Picture ad hidden.");
        }

        @Override
        public void onAdImpression() {
          Log.d(TAG, "Picture-in-Picture ad recorded an impression.");
        }

        @Override
        public void onAdClicked() {
          Log.d(TAG, "Picture-in-Picture ad recorded a click.");
        }

        @Override
        public void onAdShowedFullScreenContent() {
          Log.d(TAG, "Picture-in-Picture ad showed full screen content.");
        }

        @Override
        public void onAdDismissedFullScreenContent() {
          Log.d(TAG, "Picture-in-Picture ad dismissed full screen content.");
        }

        @Override
        public void onAdFailedToShowFullScreenContent(
            @NonNull FullScreenContentError fullScreenContentError) {
          Log.w(
              TAG,
              "Picture-in-Picture ad failed to show full screen content: "
                  + fullScreenContentError);
        }

        @Override
        public void onAdPaid(@NonNull AdValue value) {
          Log.d(
              TAG,
              "Picture-in-Picture ad paid: "
                  + value.getValueMicros()
                  + " "
                  + value.getCurrencyCode());
        }
      });
}

Ẩn quảng cáo

Để xoá quảng cáo nổi khỏi màn hình, hãy gọi phương thức hide. Phương thức này gọi lệnh gọi lại sự kiện quảng cáo bị ẩn:

Kotlin

private fun hidePictureInPictureAd() {
  // Capture the ad reference saved from the onAdLoaded callback.
  val ad = pipAd
  if (ad != null) {
    ad.hide()
  } else {
    Log.d(TAG, "No ad to hide.")
  }
}

Java

private void hidePictureInPictureAd() {
  // Use the ad reference saved from the onAdLoaded callback.
  if (pipAd != null) {
    pipAd.hide();
  } else {
    Log.d(TAG, "No ad to hide.");
  }
}

Dọn dẹp tài nguyên quảng cáo

Để tránh làm rò rỉ bộ nhớ, hãy thả tham chiếu đến đối tượng quảng cáo khi ứng dụng của bạn hoàn tất việc sử dụng quảng cáo. Ví dụ: khi ứng dụng của bạn không còn hiển thị hoặc tương tác lại với quảng cáo. Đối với quảng cáo có phạm vi là màn hình, hãy thả tham chiếu khi ứng dụng của bạn xoá màn hình lưu trữ khỏi bộ nhớ. Đối với quảng cáo có phạm vi trong ứng dụng, hãy giữ lại giá trị tham chiếu quảng cáo trong khi người dùng di chuyển giữa các màn hình và thả giá trị tham chiếu khi người dùng đóng quảng cáo:

Kotlin

private fun cleanUpPictureInPictureAd() {
  pipAd?.destroy()
  pipAd = null
}

Java

private void cleanUpPictureInPictureAd() {
  // Use the ad reference saved from the onAdLoaded callback.
  if (pipAd != null) {
    pipAd.destroy();
    pipAd = null;
  }
}

Đảm bảo quảng cáo hiển thị trên nhiều màn hình

Khi bạn đặt phạm vi trình bày thành ứng dụng, quảng cáo ở chế độ hình trong hình vẫn hiển thị ngay cả khi ứng dụng của bạn xoá màn hình lưu trữ khỏi bộ nhớ. Để tương tác hoặc đóng quảng cáo khi người dùng rời khỏi màn hình lưu trữ, ứng dụng của bạn phải giữ quyền truy cập vào quảng cáo ở chế độ hình trong hình. Bạn nên giữ quảng cáo trong một trình quản lý trạng thái dùng chung hoặc singleton ở cấp ứng dụng thay vì trong biến thực thể của một màn hình.

Để xem ví dụ về cách giữ cho quảng cáo hiển thị trên nhiều màn hình, hãy xem các ứng dụng mẫu của chúng tôi: