Implementa anuncis de pantalla dins de pantalla (beta)

Imatge dins d'imatge

Els anuncis de imatge dins de pantalla (PiP) es mostren en una finestra flotant que es manté a sobre del contingut de la pantalla, com ara articles, canals o partides de joc. Aquest format permet als usuaris interactuar amb la vostra aplicació mentre l'anunci roman visible. Per mostrar anuncis que no ocupin tota la pantalla, trieu aquest format. Més informació sobre els anuncis de imatge dins de pantalla .

Aquesta guia explica com sol·licitar i mostrar anuncis de imatge dins de imatge a la vostra aplicació mitjançant GMA Next-Gen SDK .

Abans de començar

Abans de continuar, feu el següent:

Carrega un anunci

Per carregar un PictureInPictureAd , creeu una sol·licitud d'anunci i crideu el mètode 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);
        }
      });
}

Substitueix AD_UNIT_ID pel teu ID de bloc d'anuncis.

Mostra l'anunci

Per mostrar l'anunci de imatge dins de la imatge a la pantalla, configureu les opcions d'imatge dins de la imatge i crideu el mètode show . L'exemple següent estableix la posició predeterminada de l'anunci i l'àmbit de presentació a la pantalla:

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

Estableix la posició

Per defecte, GMA Next-Gen SDK mostra un anunci de imatge dins de imatge a la cantonada inferior dreta de la pantalla quan es mostra per primera vegada o a l'última posició coneguda si s'ha mostrat anteriorment. Per personalitzar on apareix l'anunci, definiu la posició a les opcions de imatge dins de imatge. L'exemple següent defineix la posició a la part superior del contingut a la cantonada superior esquerra de la pantalla:

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();
}

Per a totes les posicions disponibles, consulteu PictureInPictureAdPosition .

Establir l'abast de la presentació

Per defecte, GMA Next-Gen SDK vincula un anunci de imatge dins d'imatge a la pantalla amfitriona actual. GMA Next-Gen SDK descarta l'anunci quan la jerarquia de visualització de la pantalla amfitriona ja no és a la memòria. Per mantenir l'anunci visible després que la pantalla amfitriona s'elimini de la memòria, definiu l'àmbit de presentació a l'aplicació:

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();
}

Per obtenir més informació, consulteu Mantenir l'anunci visible a través de les pantalles .

Defineix la retrollamada de l'esdeveniment de l'anunci

Per gestionar els esdeveniments del cicle de vida dels anuncis de imatge dins de imatge, configureu la retrollamada de l'esdeveniment a l'anunci abans de mostrar-lo. Aquesta retrollamada informa d'esdeveniments estàndard, com ara clics i impressions. Aquesta retrollamada també informa d'esdeveniments específics de la imatge dins de imatge, com ara quan es mostra o s'amaga l'anunci:

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());
        }
      });
}

Amaga l'anunci

Per eliminar l'anunci flotant de la pantalla, crideu el mètode hide . Aquest mètode invoca la retrollamada de l'esdeveniment ad hidden:

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

Neteja els recursos publicitaris

Per evitar pèrdues de memòria, elimineu la referència a l'objecte de l'anunci quan l'aplicació acabi d'utilitzar l'anunci. Per exemple, quan l'aplicació ja no mostri l'anunci ni hi interactuï. Per als anuncis amb abast de pantalla, elimineu la referència quan l'aplicació elimini la pantalla amfitriona de la memòria. Per als anuncis amb abast d'aplicació, conserveu la referència de l'anunci mentre l'usuari navega per les pantalles i elimineu la referència quan l'usuari tanqui l'anunci:

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

Mantenir l'anunci visible a través de les pantalles

Quan definiu l'abast de la presentació per a l'aplicació, l'anunci de imatge dins de imatge continua sent visible fins i tot quan l'aplicació elimina la pantalla amfitriona de la memòria. Per interactuar amb l'anunci o ignorar-lo quan l'usuari surt de la pantalla amfitriona, l'aplicació ha de conservar l'accés a l'anunci de imatge dins de imatge. Us recomanem que mantingueu l'anunci en un singleton a nivell d'aplicació o en un gestor d'estat compartit en lloc d'una variable d'instància de pantalla única.

Per veure un exemple de com mantenir un anunci visible a través de les pantalles, consulteu les nostres aplicacions de mostra: