Custom Native Ad Formats

Formatos de anuncios nativos personalizados

Además de los formatos nativos definidos por el sistema, los editores de Ad Manager pueden definir listas personalizadas de recursos para crear sus propios formatos de anuncios nativos, lo que se conoce como formatos de anuncios nativos personalizados, que se pueden usar con anuncios reservados. Así, los editores pueden transferir datos estructurados arbitrarios a sus aplicaciones. Estos anuncios se representan con el objeto NativeCustomTemplateAd.

Cargar formatos de anuncios nativos personalizados

En esta guía te explicamos cómo puedes cargar y mostrar formatos de anuncios nativos personalizados.

Crear un AdLoader

Al igual que con los anuncios nativos unificados, para cargar los formatos de anuncios nativos personalizados se utiliza la clase AdLoader:

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
          @Override
          public void onCustomTemplateAdLoaded(NativeCustomTemplateAd ad) {
              // Show the custom template and record an impression.
          }
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String s) {
              // Handle the click action
          }
      })
    .withAdListener( ... )
    .withNativeAdOptions( ... )
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
        .forCustomTemplateAd("10063170",
            { ad ->
                // Show the custom template and record an impression.
            },
            { ad, s ->
            // Handle the click action
            })
        .withAdListener( ... )
        .withNativeAdOptions( ... )
        .build()

Igual que el método forUnifiedNativeAd configura el AdLoader para solicitar un anuncio de descarga de aplicaciones, el método forCustomTemplateAd lo configura para gestionar anuncios de plantilla personalizada. Se transmiten tres parámetros al método:

  • El ID de la plantilla personalizada que el AdLoader debe solicitar. Cada formato de anuncio nativo personalizado tiene un valor de ID de plantilla asociado. Este parámetro indica la plantilla que tu aplicación quiere que el AdLoader solicite.
  • OnCustomTemplateAdLoadedListener, que se invoca cuando se carga correctamente un anuncio.
  • OnCustomClickListener, que es opcional y se invoca cuando el usuario toca o hace clic en el anuncio. Para obtener más información sobre este listener, consulta la sección "Gestionar clics e impresiones" más abajo.

Puesto que un solo bloque de anuncios se puede configurar para que sirva más de una plantilla de creatividad, es posible invocar a forCustomTemplateAd varias veces con diferentes ID de plantilla de modo que el cargador de anuncios esté preparado para enviar más de un posible formato de anuncio nativo personalizado.

IDs de plantilla

Son los ID de plantilla que se utilizan para hacer referencia únicamente a los formatos de anuncios nativos personalizados, y se pueden encontrar en la interfaz de usuario de Ad Manager, en la sección Creatividades > Formatos de anuncio nativo de la pestaña Entrega:

Los ID de plantilla de los formatos de anuncios nativos personalizados aparecen debajo de su nombre. Al hacer clic en uno de sus nombres, se muestra una pantalla con información sobre los campos que incluye la plantilla:

Desde aquí, se pueden añadir, editar y eliminar campos específicos. Fíjate en la columna ID de variable que está a la derecha. Estos ID se usan para acceder a recursos específicos y los veremos en la siguiente sección.

Mostrar formatos de anuncios nativos personalizados

Los formatos de anuncios nativos personalizados difieren de los definidos por el sistema en que los editores pueden definir sus propias "plantillas", o listas de recursos, que conforman un anuncio. El proceso para mostrarlos, por tanto, se diferencia del de los formatos definidos por el sistema en varios aspectos:

  1. Como la clase NativeCustomTemplateAd está diseñada para gestionar cualquier formato de anuncio nativo personalizado que se defina en Ad Manager, no tiene "captadores" ("getters") con nombre para los recursos. En su lugar, ofrece métodos como getText y getImage, que utilizan el ID de variable de un campo de plantilla como parámetro.
  2. No hay ninguna clase de vista de anuncio específica similar a NativeContentAdView que pueda utilizarse con NativeCustomTemplateAd. Puedes usar FrameLayout, RelativeLayout o cualquier otra que consideres apropiada según la experiencia que ofreces a tus usuarios.
  3. Como no hay ninguna clase ViewGroup específica, no tienes que registrar ninguna de las vistas que utilizas para mostrar los recursos de los anuncios. De esta forma, te puedes ahorrar algunas líneas de código al mostrarlos, pero tendrás más trabajo a la hora de gestionar clics.

Aquí tienes una función de ejemplo para mostrar un NativeCustomTemplateAd:

Java

public void displayCustomTemplateAd (ViewGroup parent,
                                     NativeCustomTemplateAd customTemplateAd) {
    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View adView = inflater.inflate(R.layout.custom_template_ad, parent);

    // Locate the TextView that will hold the value for "Headline" and
    // set its text.
    TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline);
    myHeadlineView.setText(customTemplateAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            nativeCustomTemplateAd.getImage("MainImage").getDrawable());

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

Kotlin

public fun displayCustomTemplateAd (parent: ViewGroup,
                                customTemplateAd: NativeCustomTemplateAd) {
    val adView = layoutInflater
            .inflate(R.layout.ad_simple_custom_template, null)

    val myHeadlineView = adView.findViewById<TextView>(R.id.headline)
    myHeadlineView.setText(customTemplateAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    val myMainImageView = adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            customTemplateAd.getImage("MainImage").drawable;

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

Vídeo nativo en formatos de anuncios nativos personalizados

Al crear un nuevo formato de anuncio nativo, puedes hacerlo apto para mostrar vídeo.

Solo tienes que marcar la casilla para habilitar el formato de vídeo en cuestión y, al crear una creatividad en este formato, podrás introducir un recurso de vídeo.

Al implementar la aplicación, puedes usar NativeCustomTemplateAd.getVideoMediaView() para obtener la vista del vídeo. y añadirla después a tu jerarquía de vistas. Si el anuncio no tiene contenido de vídeo, considera otras opciones para mostrarlo sin vídeo.

En el siguiente ejemplo se comprueba si el anuncio tiene contenido de vídeo y, si no es el caso, se muestra una imagen en su lugar:

Java

// Called when a custom native ad loads.
@Override
public void onCustomTemplateAdLoaded(NativeCustomTemplateAd ad) {
    VideoController videoController = ad.getVideoController();
    // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder.
    FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder);
    if (videoController.hasVideoContent()) {
        mediaPlaceholder.addView(ad.getVideoMediaView());
    } else {
        ImageView mainImage = new ImageView(this);
        mainImage.setAdjustViewBounds(true);
        // Assumes your native format has an image asset with the name MainImage.
        mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable());
        mediaPlaceholder.addView(mainImage);
    }
}

Kotlin

NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener { ad ->
    val videoController = ad.videoController
    // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder.
    val mediaPlaceholder = adView.findViewById<FrameLayout>(R.id.media_placeholder)
    if (videoController.hasVideoContent())
    {
        mediaPlaceholder.addView(ad.videoMediaView)
    }
    else
    {
        val mainImage = ImageView(this)
        mainImage.adjustViewBounds = true
        // Assumes your native format has an image asset with the name MainImage.
        mainImage.setImageDrawable(ad.getImage("MainImage").drawable)
        mediaPlaceholder.addView(mainImage)
    }
}

Consulta VideoController para obtener más información sobre cómo personalizar la experiencia de vídeo de un anuncio nativo personalizado.

Descarga el ejemplo de renderizado personalizado de Ad Manager para ver un vídeo nativo en acción.

Clics e impresiones de formatos de anuncios nativos personalizados

Con los formatos de anuncios nativos personalizados, la aplicación debe registrar las impresiones e informar de los eventos de clics al SDK de anuncios de Google para móviles.

Registrar impresiones

Para registrar una impresión de un anuncio de plantilla personalizada, llama al método recordImpression en el NativeCustomTemplateAd correspondiente:

myCustomTemplateAd.recordImpression();

Si tu aplicación llama dos veces al método por el mismo anuncio por error, el SDK evita que la misma solicitud de impresión se registre dos veces.

Registrar clics

Para informar al SDK de que se ha hecho clic en una vista de recurso, llama al método performClick en el NativeCustomTemplateAd correspondiente y transmite el nombre del recurso en el que se ha hecho clic. Por ejemplo, si en tu plantilla personalizada tienes un recurso llamado "MainImage" y quieres informar de que se ha hecho clic en el elemento ImageView correspondiente a ese recurso, el código será parecido a este:

myCustomTemplateAd.performClick("MainImage");

No tienes que llamar a este método con cada vista asociada al anuncio. Si tienes otro campo llamado "Caption" diseñado para mostrarse sin que el usuario tenga que tocarlo ni hacer clic en él, la aplicación no tiene que llamar a performClick para informar sobre la vista de ese recurso.

Responder a acciones de clic personalizadas

Al hacer clic en un anuncio de plantilla personalizada, el SDK puede dar tres respuestas, que se prueban en el siguiente orden:

  1. Invocar al OnCustomClickListener desde AdLoader, si se ha proporcionado uno.
  2. Intentar localizar una resolución de contenido correspondiente a cada una de las URL de enlace profundo del anuncio e iniciar la primera que se resuelva.
  3. Abrir un navegador y acceder a la URL de destino tradicional del anuncio.

El método forCustomTemplateAd acepta un OnCustomClickListener. Si transmites un objeto listener, el SDK invoca a su método onCustomClick sin hacer nada más. Sin embargo, si transfieres un valor nulo como listener, el SDK recurre a las URL de enlace profundo o de destino que se registran con el anuncio.

Los listener de clics personalizados permiten que la aplicación decida qué hacer como respuesta a un clic, ya sea actualizar la interfaz de usuario, lanzar una nueva actividad o simplemente registrar el clic. Este es un ejemplo en el que solo se registra un clic:

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
        // Display the ad.
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String assetName) {
            Log.i("MyApp", "A custom click just happened for " + assetName + "!");
          }
      }).build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
    .forCustomTemplateAd("10063170",
        { ad ->
            // Display the ad.
        },
        { ad, assetName ->
                Log.i("MyApp", "A custom click just happened for $assetName!")
    }).build()

Al principio puede parecer raro que haya listeners de clics personalizados. Después de todo, si tu aplicación avisa al SDK de que se ha hecho clic en un anuncio, ¿para qué sirve que el SDK se lo comunique a la aplicación?

Este flujo de información es útil por varias razones, pero la más importante es que permite que el SDK siga teniendo el control sobre las respuestas a los clics. Por ejemplo, puede hacer ping automáticamente a las URL de seguimiento de terceros de la creatividad y realizar otras tareas en segundo plano sin necesidad de añadir más código.

Enviar comentarios sobre...

Mobile Ads SDK for Android
Mobile Ads SDK for Android
Si necesitas ayuda, visita nuestra página de asistencia.