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: AdOptionsViewVista n.° 2: etiqueta "Publicidad"Vista n.° 3: ícono del anuncio | Vista n.° 4: título del anuncioVista n.° 5: contexto socialVista n.° 6: botón de llamada a la acción |

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);
}
...
}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().
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>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)
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
}
}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.
Los códigos de ejemplo relevantes en Swift y Objective-C están disponibles en nuestro repositorio de apps de ejemplo de GitHub.
Prueba la integración de tus anuncios con tu app.
Tan pronto como recibamos una solicitud de anuncio de parte de tu app o sitio web, la revisaremos para asegurarnos de que cumpla con las políticas de Audience Network y las Normas comunitarias de Facebook.
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 introductoriaGuía técnica para empezar a usar Audience Network Ejemplos de códigoEjemplos de integración de anuncios de Audience Network | Preguntas frecuentesPreguntas frecuentes sobre Audience Network Plantilla de anuncios nativosUn enfoque más práctico para la integración de anuncios nativos |