Agregar banners publicitarios nativos a una app 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 imágenes, videos o secuencias. Al igual que sucede con los anuncios nativos, recibirás un grupo de propiedades de anuncios, como un título, un ícono y una llamada a la acción, y las utilizarás para crear una vista personalizada en la que se mostrará el anuncio. Sin embargo, a diferencia de los banners publicitarios, la API de banners publicitarios nativos proporciona una experiencia de diseño nativo que te ofrece un control pleno para personalizar el diseño de los componentes del anuncio.

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

En esta guía implementaremos la siguiente ubicación de banners publicitarios nativos. Crearás un banner publicitario nativo con los siguientes componentes:

Vista n.º 1: AdOptionsView

Vista n.° 2: etiqueta "Publicidad"

Vista n.° 3: ícono del anuncio

Vista n.° 4: título del anuncio

Vista n.° 5: contexto social

Vista n.° 6: botón de llamada a la acción




Pasos del banner publicitario nativo

Paso 1: solicitar un banner publicitario nativo

Paso 2: crear el diseño de tu banner publicitario nativo

Paso 3: completar tu diseño usando los metadatos del anuncio

Inicializar el SDK de Audience Network

Este método se agregó 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 obligatoria a partir de la versión 5.3.0. Consulta este documento sobre cómo inicializar el SDK de Audience Network para Android.

Antes de crear un objeto de anuncio y cargar anuncios, debes inicializar el SDK de Audience Network. Se recomienda hacerlo durante el inicio de 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

Agrega el siguiente código en la parte superior de la actividad para importar el SDK de anuncios de Facebook:

import com.facebook.ads.*;

A continuación, crea una instancia del objeto NativeBannerAd, crea 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());
    }
}

Más adelante agregaremos código al método onAdLoaded().

Paso 2: crear el diseño de tu 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 agregar elementos en el código.

Consulta nuestras normas para anuncios nativos cuando diseñes banners publicitarios nativos en tu app.

En el diseño de la actividad activity_main.xml, agrega un contenedor para tu banner publicitario nativo. El contenedor debe ser "com.facebook.ads.NativeAdLayout", que es un contenedor adicional a FrameLayout con más funcionalidades, que nos permite generar un proceso de creación de informes de anuncios nativos sobre el anuncio. Más adelante, con el método onAdLoaded(), tendrás que completar la vista de tu anuncio nativo 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 diseño personalizado native_banner_ad_unit.xml para tu banner publicitario nativo:



El siguiente es un ejemplo de diseño personalizado para tu 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: completar tu diseño usando los metadatos del anuncio

Situación 1: el anuncio se muestra de inmediato una vez que se carga correctamente. Modifica el método onAdLoaded() anterior para recuperar las propiedades del Native Banner Ad's y que se muestre de la siguiente manera:

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 controlará el clic de manera automática. Ten en cuenta que debes registrar la vista del anuncio con la instancia NativeBannerAd para activarla. Para que se pueda hacer clic en los elementos del anuncio, registra la vista de la siguiente manera:

registerViewForInteraction(View view, MediaView adIconView)

Situación 2: mostrar el anuncio varios segundos o minutos después de que se haya cargado correctamente. Comprueba si el anuncio se invalidó antes de que se muestre.

En caso de que el anuncio no se muestre de forma automática después de cargarse, el desarrollador es responsable de verificar si el anuncio fue invalidado. Una vez que se carga satisfactoriamente, el anuncio es válido por 60 minutos. Si muestras un anuncio invalidado, no recibirás el pago. Debes hacer una llamada a isAdInvalidated() para validar el anuncio.

Te recomendamos que sigas el modelo que aparece a continuación, pero no copies el código en tu proyecto, ya que es solo 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 el área en la que se puede hacer clic

Para lograr una mejor experiencia de usuario y mejores resultados, siempre debes considerar controlar la zona interactiva de tu anuncio para evitar clics involuntarios. Para obtener más información sobre el cumplimiento con el espacio en blanco donde no se puede hacer clic, consulta la Política del SDK de Audience Network.

Para un control más preciso de las áreas en las que se puede hacer clic, puedes usar registerViewForInteraction(View view, AdIconView adIconView, List<View> clickableViews) para registrar una lista de 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 lo siguiente:

@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 vuelvas a usar la vista para mostrar diferentes anuncios a lo largo del tiempo, asegúrate de llamar a unregisterView() antes de registrar la misma vista en una instancia diferente de NativeBannerAd.

Al ejecutar el código, deberías ver un banner publicitario nativo:

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


Cuando no haya ningún anuncio para mostrar, se llamará a onError con un error.code. Si usas tu propia capa de informes o mediación personalizada, es posible que quieras comprobar el valor del código y detectar este caso. En este caso, puedes recurrir a otra red publicitaria, pero no puedes volver a enviar una solicitud de un anuncio de inmediato.


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

Próximos pasos

  • Consulta la guía Plantilla de anuncios nativos para agregar anuncios nativos a tu app.

  • Consulta nuestros ejemplos de códigos donde se muestra cómo utilizar anuncios nativos. La muestra NativeBannerAdSample está disponible como parte del SDK en la carpeta AudienceNetwork/samples. Importa el proyecto en tu entorno de desarrollo integrado y ejecútalo en un dispositivo o en el emulador.

Más recursos

Guía introductoria

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

Ejemplos de código

Ejemplos de integración de anuncios de Audience Network

Preguntas frecuentes

Preguntas frecuentes sobre Audience Network

Plantilla de anuncios nativos

Un enfoque más práctico para la integración de anuncios nativos