Añadir banners publicitarios nativos a una aplicación de Android

La API de banners publicitarios nativos te permite crear una experiencia personalizada para mostrar un anuncio nativo sin los activos de contenido del anunciante, como el contenido de una secuencia, una imagen o un vídeo. De forma similar a lo que ocurre con los anuncios nativos, recibirás un grupo de propiedades de anuncios, como un título, un icono y una llamada a la acción, que utilizarás para crear una vista personalizada en la que se muestre el anuncio. Sin embargo, a diferencia de los banners publicitarios, la API de banners publicitarios nativos proporciona una experiencia de diseño nativo a fin de que tengas control completo para personalizar el diseño de los componentes del anuncio.

Asegúrate de haber completado las guías de primeros pasos de Audience Network y Android antes de continuar.

En esta guía explicaremos cómo implementar la siguiente ubicación de banner publicitario nativo. Crearás un banner publicitario nativo con estos componentes:

Elemento n.º 1: AdOptionsView

Elemento n.º 2: etiqueta "Publicidad"

Elemento n.º 3: icono del anuncio

Elemento n.º 4: título del anuncio

Elemento n.º 5: contexto social

Elemento n.º 6: botón de llamada a la acción




Pasos para crear un banner publicitario nativo

Paso 1: Solicitar un banner publicitario nativo

Paso 2: Crear un diseño para el banner publicitario nativo

Paso 3: Rellenar el diseño con los metadatos del anuncio

Inicializar el SDK de Audience Network

Este método se añadió en la versión 5.1 del SDK de Audience Network para Android.

La inicialización explícita del SDK de Audience Network para Android es necesaria para la versión 5.3.0 y versiones posteriores. Consulta este documento, que contiene información sobre cómo inicializar el SDK de Audience Network para Android.

Antes de crear un objeto publicitario y cargar anuncios, debes inicializar el SDK de Audience Network. Te recomendamos que lo hagas al iniciar la aplicación.

public class YourApplication extends Application {
    ...
    @Override
    public void onCreate() {
        super.onCreate();
        // Initialize the Audience Network SDK
        AudienceNetworkAds.initialize(this);       
    }
    ...
}

Paso 1: Solicitar un banner publicitario nativo

Añade el siguiente código en la parte superior de tu actividad para importar el SDK de anuncios de Facebook:

import com.facebook.ads.*;

A continuación, crea una instancia de un objeto NativeBannerAd, crea un objeto AdListener y llama a loadAd(...) en tu actividad:

public class NativeBannerAdActivity extends Activity {

    private final String TAG = NativeBannerAdActivity.class.getSimpleName();
    private NativeBannerAd nativeBannerAd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate a NativeBannerAd object. 
        // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
        // now, while you are testing and replace it later when you have signed up.
        // While you are using this temporary code you will only get test ads and if you release
        // your code like this to the Google Play your users will not receive ads (you will get a no fill error).
        nativeBannerAd = new NativeBannerAd(this, "YOUR_PLACEMENT_ID");
        NativeAdListener nativeAdListener = new NativeAdListener() {

            @Override
            public void onMediaDownloaded(Ad ad) {
                // Native ad finished downloading all assets
                Log.e(TAG, "Native ad finished downloading all assets.");
            }

            @Override
            public void onError(Ad ad, AdError adError) {
                // Native ad failed to load
                Log.e(TAG, "Native ad failed to load: " + adError.getErrorMessage());
            }

            @Override
            public void onAdLoaded(Ad ad) {
                // Native ad is loaded and ready to be displayed
                Log.d(TAG, "Native ad is loaded and ready to be displayed!");
            }

            @Override
            public void onAdClicked(Ad ad) {
                // Native ad clicked
                Log.d(TAG, "Native ad clicked!");
            }

            @Override
            public void onLoggingImpression(Ad ad) {
                // Native ad impression
                Log.d(TAG, "Native ad impression logged!");
            }
        });
        // load the ad
        nativeBannerAd.loadAd(
                nativeBannerAd.buildLoadAdConfig()
                        .withAdListener(nativeAdListener)
                        .build());
    }
}

Volveremos para añadir código al método onAdLoaded().

Paso 2: Crear un diseño para el banner publicitario nativo

El siguiente paso es extraer los metadatos del anuncio y utilizar sus propiedades para crear la interfaz de usuario nativa personalizada. Puedes crear una vista personalizada en un .xml de diseño o añadir elementos en el código.

Consulta nuestras normas para anuncios nativos al diseñar banners publicitarios nativos en tu aplicación.

En el archivo activity_main.xml del diseño de tu actividad, añade un contenedor para el banner publicitario nativo. El contenedor debe ser un elemento com.facebook.ads.NativeAdLayout, que es un contenedor por encima de FrameLayout con funcionalidad extra y nos permite representar un flujo de notificación de anuncios nativos en la parte superior del anuncio. Más tarde, en el método onAdLoaded(), tendrás que rellenar la vista de anuncios nativos en este contenedor.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
    <com.facebook.ads.NativeAdLayout
        android:id="@+id/native_banner_ad_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />
    ...
</RelativeLayout>

Crea un archivo native_banner_ad_unit.xml de diseño personalizado para tu banner publicitario nativo:



Este es un ejemplo de diseño personalizado para un banner publicitario nativo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RelativeLayout
            android:id="@+id/ad_choices_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="2dp" />

        <TextView
            android:id="@+id/native_ad_sponsored_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:ellipsize="end"
            android:lines="1"
            android:padding="2dp"
            android:textColor="@android:color/darker_gray"
            android:textSize="12sp" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white">

        <com.facebook.ads.MediaView
            android:id="@+id/native_icon_view"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:gravity="center" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:orientation="vertical"
            android:paddingLeft="53dp"
            android:paddingRight="83dp">

            <TextView
                android:id="@+id/native_ad_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:textColor="@android:color/black"
                android:textSize="15sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/native_ad_social_context"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:textSize="12sp" />
        </LinearLayout>

        <Button
            android:id="@+id/native_ad_call_to_action"
            android:layout_width="80dp"
            android:layout_height="50dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:background="#4286F4"
            android:gravity="center"
            android:paddingLeft="3dp"
            android:paddingRight="3dp"
            android:textColor="@android:color/white"
            android:textSize="12sp"
            android:visibility="gone" />

    </RelativeLayout>
</LinearLayout>

Paso 3: Rellenar el diseño con los metadatos del anuncio

Situación 1: muestra el anuncio inmediatamente una vez que se cargue correctamente. Modifica el método onAdLoaded() señalado anteriormente para recuperar las propiedades Native Banner Ad's y mostrarlo como se indica a continuación:

public class NativeBannerAdActivity extends Activity {

    private NativeAdLayout nativeAdLayout;
    private LinearLayout adView;
    private NativeBannerAd nativeBannerAd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate a NativeBannerAd object. 
        // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
        // now, while you are testing and replace it later when you have signed up.
        // While you are using this temporary code you will only get test ads and if you release
        // your code like this to the Google Play your users will not receive ads (you will get a no fill error).
        nativeBannerAd = new NativeBannerAd(this, "YOUR_PLACEMENT_ID");
        NativeAdListener nativeAdListener = new NativeAdListener() {
            ...
            @Override
            public void onAdLoaded(Ad ad) {
                // Race condition, load() called again before last ad was displayed
                if (nativeBannerAd == null || nativeBannerAd != ad) {
                    return;
                 }
                // Inflate Native Banner Ad into Container
                inflateAd(nativeBannerAd);
            }
            ...
        });
        // load the ad
        nativeBannerAd.loadAd(
                nativeBannerAd.buildLoadAdConfig()
                        .withAdListener(nativeAdListener)
                        .build());
    }

    private void inflateAd(NativeBannerAd nativeBannerAd) {
        // Unregister last ad
        nativeBannerAd.unregisterView();

        // Add the Ad view into the ad container.
        nativeAdLayout = findViewById(R.id.native_banner_ad_container);
        LayoutInflater inflater = LayoutInflater.from(NativeBannerAdActivity.this);
        // Inflate the Ad view.  The layout referenced is the one you created in the last step.
        adView = (LinearLayout) inflater.inflate(R.layout.native_banner_ad_layout, nativeAdLayout, false);
        nativeAdLayout.addView(adView);

        // Add the AdChoices icon
        RelativeLayout adChoicesContainer = adView.findViewById(R.id.ad_choices_container);
        AdOptionsView adOptionsView = new AdOptionsView(NativeBannerAdActivity.this, nativeBannerAd, nativeAdLayout);
        adChoicesContainer.removeAllViews();
        adChoicesContainer.addView(adOptionsView, 0);

        // Create native UI using the ad metadata.
        TextView nativeAdTitle = adView.findViewById(R.id.native_ad_title);
        TextView nativeAdSocialContext = adView.findViewById(R.id.native_ad_social_context);
        TextView sponsoredLabel = adView.findViewById(R.id.native_ad_sponsored_label);
        MediaView nativeAdIconView = adView.findViewById(R.id.native_icon_view);
        Button nativeAdCallToAction = adView.findViewById(R.id.native_ad_call_to_action);

        // Set the Text.
        nativeAdCallToAction.setText(nativeBannerAd.getAdCallToAction());
        nativeAdCallToAction.setVisibility(
                nativeBannerAd.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
        nativeAdTitle.setText(nativeBannerAd.getAdvertiserName());
        nativeAdSocialContext.setText(nativeBannerAd.getAdSocialContext());
        sponsoredLabel.setText(nativeBannerAd.getSponsoredTranslation());

        // Register the Title and CTA button to listen for clicks.
        List<View> clickableViews = new ArrayList<>();
        clickableViews.add(nativeAdTitle);
        clickableViews.add(nativeAdCallToAction);
        nativeBannerAd.registerViewForInteraction(adView, nativeAdIconView, clickableViews);
    }
}

El SDK registrará la impresión y gestionará el clic automáticamente. Ten en cuenta que debes registrar la vista del anuncio con la instancia NativeBannerAd para activarlo. Para que se pueda hacer clic en los elementos del anuncio, regístralo usando el siguiente fragmento de código:

registerViewForInteraction(View view, MediaView adIconView)

Situación 2: muestra el anuncio unos segundos o minutos después de que se cargue correctamente. Deberías comprobar si el anuncio ha quedado invalidado antes de mostrarlo.

En caso de que el anuncio no se muestre inmediatamente una vez se haya cargado, el desarrollador será responsable de comprobar si ha quedado invalidado o no. Una vez se cargue correctamente, el anuncio será válido durante 60 minutos. No recibirás pagos si muestras un anuncio invalidado. Para validar el anuncio, debes llamar al método isAdInvalidated().

Debes seguir la idea que se indica a continuación, pero no copies el código en el proyecto, ya que se trata solo de un ejemplo:

public class NativeBannerAdActivity extends Activity {

    private NativeBannerAd nativeBannerAd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate a NativeBannerAd object. 
        // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
        // now, while you are testing and replace it later when you have signed up.
        // While you are using this temporary code you will only get test ads and if you release
        // your code like this to the Google Play your users will not receive ads (you will get a no fill error).
        nativeBannerAd = new NativeBannerAd(this, "YOUR_PLACEMENT_ID");
         NativeAdListener nativeAdListener = new NativeAdListener() {
            ...
        });
        // load the ad
        nativeBannerAd.loadAd(
                nativeBannerAd.buildLoadAdConfig()
                        .withAdListener(nativeAdListener)
                        .build());
    }

    private void showAdWithDelay() {
       /**
        * Here is an example for displaying the ad with delay;
        * Please do not copy the Handler into your project
       */
       // Handler handler = new Handler();
       handler.postDelayed(new Runnable() {
           public void run() {
             // Check if nativeBannerAd has been loaded successfully
               if(nativeBannerAd == null || !nativeBannerAd.isAdLoaded()) {
                   return;
               }
             // Check if ad is already expired or invalidated, and do not show ad if that is the case. You will not get paid to show an invalidated ad.
               if(nativeBannerAd.isAdInvalidated()) {
                   return;
               }
               inflateAd(nativeBannerAd); // Inflate Native Banner Ad into Container same as in previous code example
           }
       }, 1000 * 60 * 15); // Show the ad after 15 minutes
    }
}

Controlar la zona interactiva

Para conseguir unos resultados y una experiencia de usuario mejores, considera la posibilidad de controlar la zona interactiva del anuncio para evitar los clics no intencionados. Consulta la página de la Política del SDK de Audience Network para obtener más información sobre las normas relativas a los espacios en blanco en los que no se puede hacer clic.

Para tener un mayor control de la zona interactiva, puedes usar el método registerViewForInteraction(View view, MediaView adIconView, List<View> clickableViews) para registrar una lista de las vistas en las que se puede hacer clic. Por ejemplo, si quieres que solo se pueda hacer clic en el título del anuncio y en el botón de llamada a la acción del ejemplo anterior, puedes escribir esto:

@Override
public void onAdLoaded(Ad ad) {
  ...
  List<View> clickableViews = new ArrayList<>();
  clickableViews.add(nativeAdTitle);
  clickableViews.add(nativeAdCallToAction);
  nativeBannerAd.registerViewForInteraction(mAdView, nativeAdIconView, clickableViews);
  ...
}

En aquellos casos en los que reutilices la vista para mostrar diferentes anuncios a lo largo del tiempo, asegúrate de llamar al método unregisterView() antes de registrar la misma vista con una instancia diferente de NativeBannerAd.

Ejecuta el código; debería mostrarse un banner publicitario nativo:

Cuando se cargue un anuncio, las siguientes propiedades incluirán algún valor: title, icon y callToAction. Es posible que el resto de las propiedades sean nulas o estén vacías. Asegúrate de que el código sea suficientemente sólido para gestionar estos casos.


Cuando no haya ningún anuncio que mostrar, se llamará a onErrorcon un objeto error.code. Si utilizas tu propia capa personalizada de informes o mediación, es recomendable que compruebes el valor del código y detectes este caso. Puedes recurrir a otra red publicitaria en este caso, pero no vuelvas a solicitar un anuncio inmediatamente después.


Los metadatos del anuncio que recibas pueden almacenarse en caché y volverse a utilizar en un plazo máximo de 30 minutos. Si tienes pensado utilizar los metadatos transcurrido este período, realiza una llamada para cargar un nuevo anuncio.

Siguientes pasos

  • Consulta la guía Plantilla de anuncios nativos para añadir anuncios nativos en tu aplicación.

  • Examina los ejemplos de código que muestran cómo utilizar anuncios nativos. El elemento NativeBannerAdSample está disponible como parte del SDK y lo puedes encontrar en la carpeta AudienceNetwork/samples. Importa el proyecto a tu IDE y ejecútalo en un dispositivo o en el emulador.

Más recursos

Guía de introducción

Guía técnica para empezar a usar Audience Network

Ejemplos de código

Ejemplos de la integración de anuncios de Audience Network

Preguntas frecuentes

Preguntas frecuentes sobre Audience Network

Plantilla de anuncios nativos

Enfoque más práctico para integrar los anuncios nativos