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: AdOptionsViewElemento n.º 2: etiqueta "Publicidad"Elemento n.º 3: icono del anuncio | Elemento n.º 4: título del anuncioElemento n.º 5: contexto socialElemento n.º 6: botón de llamada a la acción |
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); } ... }
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()
.
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>
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)
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 } }
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 onError
con 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.
Examina nuestros ejemplos de código de Audience Network para Android en GitHub. Importa los proyectos a tu IDE y ejecútalos en un dispositivo o en el emulador.
Cuando estés listo para publicar tu aplicación y monetizarla, envíala a revisión tras asegurarte de que cumpla la Política de Audience Network y las Normas comunitarias de Facebook.
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ónGuía técnica para empezar a usar Audience Network Ejemplos de códigoEjemplos de la integración de anuncios de Audience Network | Preguntas frecuentesPreguntas frecuentes sobre Audience Network Plantilla de anuncios nativosEnfoque más práctico para integrar los anuncios nativos |