Anuncios nativos

Cuando se carga un anuncio nativo, el SDK de anuncios de Google para dispositivos móviles (beta) invoca el objeto de escucha para el formato de anuncio correspondiente. Luego, tu app debe mostrar el anuncio (aunque no necesariamente de inmediato). Para facilitar la visualización de los formatos de anuncios definidos por el sistema, el SDK ofrece algunos recursos útiles, que se describen a continuación.

Define la clase NativeAdView

Define una clase NativeAdView. Esta clase es de tipo ViewGroup y es el contenedor de nivel superior de una clase NativeAdView. Cada vista de anuncio nativo contiene recursos de anuncio de este tipo, como los elementos de vista MediaView o Title, que deben ser un elemento secundario del objeto NativeAdView.

Diseño XML

Agrega un NativeAdView XML a tu proyecto:

<com.google.android.libraries.ads.mobile.sdk.nativead.NativeAdView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
    android:orientation="vertical">
        <LinearLayout
        android:orientation="horizontal">
          <ImageView
          android:id="@+id/ad_app_icon" />
          <TextView
            android:id="@+id/ad_headline" />
        </LinearLayout>
        <!--Add remaining assets such as the image and media view.-->
    </LinearLayout>
</com.google.android.libraries.ads.mobile.sdk.nativead.NativeAdView>

Jetpack Compose

Incluye el módulo JetpackComposeDemo/compose-util, que incluye asistentes para componer el NativeAdView y sus recursos.

Con el módulo compose-util, compón un NativeAdView:

  import com.google.android.gms.compose_util.NativeAdAttribution
  import com.google.android.gms.compose_util.NativeAdView

  @Composable
  /** Display a native ad with a user defined template. */
  fun DisplayNativeAdView(nativeAd: NativeAd) {
      NativeAdView {
          // Display the ad attribution.
          NativeAdAttribution(text = context.getString("Ad"))
          // Add remaining assets such as the image and media view.
        }
    }

Controla el anuncio nativo cargado

Cuando se cargue un anuncio nativo, controla el evento de devolución de llamada, aumenta la vista del anuncio nativo y agrégala a la jerarquía de vistas:

Kotlin

// Build an ad request with native ad options to customize the ad.
val adTypes = listOf(NativeAd.NativeAdType.NATIVE)
val adRequest = NativeAdRequest
  .Builder("/21775744923/example/native", adTypes)
  .build()

val adCallback =
  object : NativeAdLoaderCallback {
    override fun onNativeAdLoaded(nativeAd: NativeAd) {
      activity?.runOnUiThread {

        val nativeAdBinding = NativeAdBinding.inflate(layoutInflater)
        val adView = nativeAdBinding.root
        val frameLayout = myActivityLayout.nativeAdPlaceholder

        // Populate and register the native ad asset views.
        displayNativeAd(nativeAd, nativeAdBinding)

        // Remove all old ad views and add the new native ad
        // view to the view hierarchy.
        frameLayout.removeAllViews()
        frameLayout.addView(adView)
      }
    }
  }

// Load the native ad with our request and callback.
NativeAdLoader.load(adRequest, adCallback)

Java

// Build an ad request with native ad options to customize the ad.
List<NativeAd.NativeAdType> adTypes = Arrays.asList(NativeAd.NativeAdType.NATIVE);
NativeAdRequest adRequest = new NativeAdRequest
                                .Builder("/21775744923/example/native", adTypes)
                                .build();

NativeAdLoaderCallback adCallback = new NativeAdLoaderCallback() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
      if (getActivity() != null) {
        getActivity()
          .runOnUiThread(() -> {
            // Inflate the native ad view and add it to the view hierarchy.
            NativeAdBinding nativeAdBinding = NativeAdBinding.inflate(getLayoutInflater());
            NativeAdView adView = (NativeAdView) nativeAdBinding.getRoot();
            FrameLayout frameLayout = myActivityLayout.nativeAdPlaceholder;

            // Populate and register the native ad asset views.
            displayNativeAd(nativeAd, nativeAdBinding);

            // Remove all old ad views and add the new native ad
            // view to the view hierarchy.
            frameLayout.removeAllViews();
            frameLayout.addView(adView);
        });
      }
    }
};

// Load the native ad with our request and callback.
NativeAdLoader.load(adRequest, adCallback);

Ten en cuenta que todos los recursos de cada anuncio nativo se deben renderizar dentro del diseño de NativeAdView. El SDK de anuncios de Google para dispositivos móviles (beta) intenta registrar una advertencia cuando los recursos nativos se renderizan fuera del diseño de la vista de un anuncio nativo.

Las clases de vistas de anuncios también proporcionan métodos que se usan para registrar la vista utilizada para cada recurso individual y uno para registrar el objeto NativeAd en sí. Registrar las vistas de esta manera permite que el SDK controle automáticamente tareas como las siguientes:

  • Registra clics
  • Registrar impresiones cuando el primer píxel es visible en la pantalla
  • Mostrar la superposición de AdChoices para las creatividades de reabastecimiento nativas (actualmente, solo para un grupo específico de publicadores)

Muestra el anuncio nativo

En el siguiente ejemplo, se indica cómo mostrar un anuncio nativo:

Kotlin

private fun displayNativeAd(nativeAd: NativeAd, nativeAdBinding : NativeAdBinding) {
  // Set the native ad view elements.
  val nativeAdView = nativeAdBinding.root
  nativeAdView.advertiserView = nativeAdBinding.adAdvertiser
  nativeAdView.bodyView = nativeAdBinding.adBody
  nativeAdView.callToActionView = nativeAdBinding.adCallToAction
  nativeAdView.headlineView = nativeAdBinding.adHeadline
  nativeAdView.iconView = nativeAdBinding.adAppIcon
  nativeAdView.priceView = nativeAdBinding.adPrice
  nativeAdView.starRatingView = nativeAdBinding.adStars
  nativeAdView.storeView = nativeAdBinding.adStore

  // Set the view element with the native ad assets.
  nativeAdBinding.adAdvertiser.text = nativeAd.advertiser
  nativeAdBinding.adBody.text = nativeAd.body
  nativeAdBinding.adCallToAction.text = nativeAd.callToAction
  nativeAdBinding.adHeadline.text = nativeAd.headline
  nativeAdBinding.adAppIcon.setImageDrawable(nativeAd.icon?.drawable)
  nativeAdBinding.adPrice.text = nativeAd.price
  nativeAd.starRating?.toFloat().let { value ->
    nativeAdBinding.adStars.rating = value
  }
  nativeAdBinding.adStore.text = nativeAd.store

  // Hide views for assets that don't have data.
  nativeAdBinding.adAdvertiser.visibility = getAssetViewVisibility(nativeAd.advertiser)
  nativeAdBinding.adBody.visibility = getAssetViewVisibility(nativeAd.body)
  nativeAdBinding.adCallToAction.visibility = getAssetViewVisibility(nativeAd.callToAction)
  nativeAdBinding.adHeadline.visibility = getAssetViewVisibility(nativeAd.headline)
  nativeAdBinding.adAppIcon.visibility = getAssetViewVisibility(nativeAd.icon)
  nativeAdBinding.adPrice.visibility = getAssetViewVisibility(nativeAd.price)
  nativeAdBinding.adStars.visibility = getAssetViewVisibility(nativeAd.starRating)
  nativeAdBinding.adStore.visibility = getAssetViewVisibility(nativeAd.store)

  // Inform Google Mobile Ads SDK (beta) that you have finished populating
  // the native ad views with this native ad.
  nativeAdView.registerNativeAd(nativeAd, nativeAdBinding.adMedia)
}

/**
* Determines the visibility of an asset view based on the presence of its asset.
*
* @param asset The native ad asset to check for nullability.
* @return [View.VISIBLE] if the asset is not null, [View.INVISIBLE] otherwise.
*/
private fun getAssetViewVisibility(asset: Any?): Int {
  return if (asset == null) View.INVISIBLE else View.VISIBLE
}

Java

private void displayNativeAd(ad: NativeAd, nativeAdBinding : NativeAdBinding) {
  // Set the native ad view elements.
  NativeAdView nativeAdView = nativeAdBinding.getRoot();
  nativeAdView.setAdvertiserView(nativeAdBinding.adAdvertiser);
  nativeAdView.setBodyView(nativeAdBinding.adBody);
  nativeAdView.setCallToActionView(nativeAdBinding.adCallToAction);
  nativeAdView.setHeadlineView(nativeAdBinding.adHeadline);
  nativeAdView.setIconView(nativeAdBinding.adAppIcon);
  nativeAdView.setPriceView(nativeAdBinding.adPrice);
  nativeAdView.setStarRatingView(nativeAdBinding.adStars);
  nativeAdView.setStoreView(nativeAdBinding.adStore);

  // Set the view element with the native ad assets.
  nativeAdBinding.adAdvertiser.setText(nativeAd.getAdvertiser());
  nativeAdBinding.adBody.setText(nativeAd.getBody());
  nativeAdBinding.adCallToAction.setText(nativeAd.getCallToAction());
  nativeAdBinding.adHeadline.setText(nativeAd.getHeadline());
  if (nativeAd.getIcon() != null) {
      nativeAdBinding.adAppIcon.setImageDrawable(nativeAd.getIcon().getDrawable());
  }
  nativeAdBinding.adPrice.setText(nativeAd.getPrice());
  if (nativeAd.getStarRating() != null) {
      nativeAdBinding.adStars.setRating(nativeAd.getStarRating().floatValue());
  }
  nativeAdBinding.adStore.setText(nativeAd.getStore());

  // Hide views for assets that don't have data.
  nativeAdBinding.adAdvertiser.setVisibility(getAssetViewVisibility(nativeAd.getAdvertiser()));
  nativeAdBinding.adBody.setVisibility(getAssetViewVisibility(nativeAd.getBody()));
  nativeAdBinding.adCallToAction.setVisibility(getAssetViewVisibility(nativeAd.getCallToAction()));
  nativeAdBinding.adHeadline.setVisibility(getAssetViewVisibility(nativeAd.getHeadline()));
  nativeAdBinding.adAppIcon.setVisibility(getAssetViewVisibility(nativeAd.getIcon()));
  nativeAdBinding.adPrice.setVisibility(getAssetViewVisibility(nativeAd.getPrice()));
  nativeAdBinding.adStars.setVisibility(getAssetViewVisibility(nativeAd.getStarRating()));
  nativeAdBinding.adStore.setVisibility(getAssetViewVisibility(nativeAd.getStore()));

  // Inform Google Mobile Ads SDK (beta) that you have finished populating
  // the native ad views with this native ad.
  nativeAdView.registerNativeAd(nativeAd, nativeAdBinding.adMedia);
}

/**
* Determines the visibility of an asset view based on the presence of its asset.
*
* @param asset The native ad asset to check for nullability.
* @return {@link View#VISIBLE} if the asset is not null, {@link View#INVISIBLE} otherwise.
*/
private int getAssetViewVisibility(Object asset) {
    return (asset == null) ? View.INVISIBLE : View.VISIBLE;
}

Superposición de AdChoices

El SDK agrega una superposición de AdChoices como una vista de anuncio cuando se devuelve un anuncio de reabastecimiento. Si tu app usa el reabastecimiento de anuncios nativos, deja espacio en la esquina que prefieras de la vista de anuncio nativo para el logotipo de AdChoices que se inserta automáticamente. Además, es importante que se vea la superposición de AdChoices, por lo que debes elegir imágenes y colores de fondo adecuados. Para obtener más información sobre la apariencia y la función de la superposición, consulta los lineamientos para la implementación de anuncios programáticos nativos.

Atribución de anuncios programáticos nativos

Cuando se publican anuncios programáticos nativos, se debe mostrar una atribución de anuncio para indicar que la vista corresponde a un anuncio. Obtén más información en nuestros lineamientos de políticas.

Cómo controlar los clics

No implementes ningún controlador de clics personalizado en ninguna vista sobre la vista del anuncio nativo o dentro de ella. El SDK controla los clics en los recursos de vistas de anuncios, siempre y cuando completes y registres correctamente las vistas de recursos.

Para escuchar los clics, implementa la devolución de llamada de clics del SDK de anuncios de Google para dispositivos móviles (beta):

Kotlin

private fun setEventCallback(nativeAd: NativeAd) {
  nativeAd.adEventCallback =
    object : NativeAdEventCallback {
      override fun onAdClicked() {
        Log.d(Constant.TAG, "Native ad recorded a click.")
      }
    }
}

Java

private void setEventCallback(NativeAd nativeAd) {
  nativeAd.setAdEventCallback(new NativeAdEventCallback() {
      @Override
      public void onAdClicked() {
        Log.d(Constant.TAG, "Native ad recorded a click.");
      }
  });
}

ImageScaleType

La clase MediaView tiene una propiedad ImageScaleType cuando se muestran imágenes. Si quieres cambiar la forma en que se ajusta el tamaño de una imagen en el MediaView, establece el ImageView.ScaleType correspondiente con el método setImageScaleType() del MediaView:

Kotlin

nativeAdViewBinding.mediaView.imageScaleType = ImageView.ScaleType.CENTER_CROP

Java

nativeAdViewBinding.mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);

MediaContent

La clase MediaContent contiene los datos relacionados con el contenido multimedia del anuncio nativo, que se muestra con la clase MediaView. Cuando la propiedad MediaView mediaContent se establece con una instancia de MediaContent, ocurre lo siguiente:

  • Si hay un recurso de video disponible, se almacena en el búfer y comienza a reproducirse dentro de MediaView. Para saber si un recurso de video está disponible, consulta hasVideoContent().

  • Si el anuncio no contiene un recurso de video, el recurso mainImage se descarga y se coloca en el MediaView.

Cómo destruir un anuncio

Después de mostrar un anuncio nativo, destrúyelo. En el siguiente ejemplo, se destruye un anuncio nativo:

Kotlin

nativeAd.destroy()

Java

nativeAd.destroy();

Prueba el código de anuncios nativos

Anuncios de venta directa

Si deseas probar cómo son los anuncios nativos de venta directa, puedes usar este ID de unidad de anuncios de Ad Manager:

/21775744923/example/native

Está configurado para publicar anuncios de contenido y de instalación de apps de ejemplo, así como un formato de anuncio nativo personalizado con los siguientes recursos:

  • Título (texto)
  • MainImage (imagen)
  • Caption (texto)

El ID de la plantilla para el formato de anuncio nativo personalizado es 10063170.

Anuncios nativos de reabastecimiento

El reabastecimiento de Ad Exchange se limita a un grupo específico de publicadores. Para probar el comportamiento de los anuncios nativos de reabastecimiento, usa esta unidad de anuncios de Ad Manager:

/21775744923/example/native-backfill

Publica anuncios de contenido y de instalación de apps de ejemplo que incluyen la superposición de AdChoices.

Recuerda actualizar el código para que haga referencia a tus IDs de unidad de anuncios y de plantilla reales antes de lanzar tu app.

Próximos pasos

Explora los siguientes temas:

Ejemplo

Descarga y ejecuta la app de ejemplo que demuestra el uso del SDK de anuncios de Google para dispositivos móviles (beta).