Aggiunta di banner nativi a un'app Android

L'API Native Banner Ad ti consente di creare un'esperienza personalizzata per la visualizzazione di un'inserzione nativa senza le risorse creative dell'inserzionista, come il contenuto di immagini, video o carosello. Come per altre inserzioni native, riceverai un gruppo di proprietà dell'inserzione come titolo, icona e call to action, che dovrai usare per creare una visualizzazione personalizzata nel punto in cui verrà mostrata l'inserzione. Tuttavia, a differenza dei banner, l'API, Native Banner Ad fornisce un'esperienza di layout nativo che ti consente di avere il pieno controllo della personalizzazione del layout per i componenti all'interno dell'inserzione.

Prima di proseguire, assicurati di aver consultato le guide Primi passi di Audience Network e Primi passi su Android.

In questa guida implementeremo il seguente posizionamento dei banner nativi. Potrai creare un banner nativo con i seguenti componenti:

Visualizzazione 1: AdOptionsView

Visualizzazione 2: etichetta sponsorizzata

Visualizzazione 3: icona dell'inserzione

Visualizzazione 4: titolo dell'inserzione

Visualizzazione 5: contesto social

Visualizzazione 6: pulsante di call to action




Passaggi per i banner nativi

Passaggio 1: richiesta di un banner nativo

Passaggio 2: creazione del layout del banner nativo

Passaggio 3: compilazione del layout utilizzando i metadati dell'inserzione

Inizializzare l'SDK di Audience Network

Questo metodo è stato aggiunto nell'SDK Android Audience Network versione 5.1.

L'inizializzazione esplicita dell'SDK Audience Network per Android è obbligatoria a partire dalla versione 5.3.0. Consulta questo documento per informazioni su come inizializzare l'SDK Audience Network per Android.

Prima di creare un oggetto pubblicitario e caricare le inserzioni, devi inizializzare l'SDK di Audience Network. È consigliabile eseguire questa operazione all'avvio dell'app.

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

Passaggio 1: richiesta di un banner nativo

Aggiungi il codice seguente nella parte superiore della tua attività per importare l'SDK Facebook Ads:

import com.facebook.ads.*;

In seguito, istanzia un oggetto NativeBannerAd, crea un AdListener e chiama loadAd(...) nella tua attività:

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());
    }
}

Torneremo in seguito per aggiungere il codice al metodo onAdLoaded().

Passaggio 2: creazione del layout del banner nativo

Il passaggio successivo consiste nell'estrazione dei metadati dell'inserzione e nell'utilizzarne le relative proprietà per creare l'interfaccia utente nativa personalizzata. Puoi creare la visualizzazione personalizzata in un file .xml del layout oppure puoi aggiungere degli elementi nel codice.

Per la progettazione di banner nativi nell'app, consulta le nostre linee guida per le inserzioni native.

Nel layout della tua attività activity_main.xml, aggiungi un contenitore per il banner nativo. Il contenitore deve essere un com.facebook.ads.NativeAdLayout, che è un wrapper basato su un FrameLayout con alcune funzionalità extra che ci hanno consentito di visualizzare un flusso di report di inserzioni native basato sull'inserzione. Più avanti, nel metodo onAdLoaded() dovrai popolare la visualizzazione dell'inserzione nativa in questo contenitore.

<?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 layout personalizzato native_banner_ad_unit.xml per il banner nativo:



Di seguito è riportato un esempio di layout personalizzato per il banner 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>

Passaggio 3: compilazione del layout utilizzando i metadati dell'inserzione

Scenario 1: visualizza l'inserzione subito dopo che è stata caricata correttamente. Modifica il metodo precedente onAdLoaded() per recuperare le proprietà Native Banner Ad's e visualizzarle nel modo seguente:

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);
    }
}

L'SDK registrerà l'impression e gestirà automaticamente il clic. Tieni presente che devi registrare la visualizzazione dell'inserzione con l'istanza NativeBannerAd per abilitarla. Per rendere cliccabili gli elementi dell'inserzione, registrala utilizzando:

registerViewForInteraction(View view, MediaView adIconView)

Scenario 2: visualizza l'inserzione alcuni secondi o minuti dopo che è stata caricata correttamente. Devi controllare se l'inserzione è stata invalidata prima della visualizzazione.

In caso di mancata visualizzazione dell'inserzione subito dopo il caricamento, lo sviluppatore è responsabile di verificare se l'inserzione è stata ritenuta non valida. Dopo aver caricato correttamente l'inserzione, questa sarà valida per 60 minuti. Non riceverai alcun pagamento se l'inserzione visualizzata non è valida. Devi chiamare isAdInvalidated() per convalidare l'inserzione.

Prendi spunto dal codice seguente, ma non copiarlo nel progetto poiché è solo un esempio:

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
    }
}

Controllo dell'area cliccabile

Per un'esperienza utente e risultati migliori, controlla sempre l'area cliccabile dell'inserzione, per evitare clic accidentali. Consulta la pagina della normativa dell'SDK di Audience Network per maggiori dettagli in merito all'applicazione degli spazi bianchi non cliccabili.

Per un controllo più capillare degli elementi cliccabili, usa il metodo registerViewForInteraction(View view, MediaView adIconView, List<View> clickableViews) per registrare una lista di visualizzazioni cliccabili. Ad esempio, se desideri rendere cliccabili solo il titolo dell'inserzione e il pulsante di call to action nell'esempio precedente, puoi scrivere così:

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

Nei casi in cui riutilizzi la visualizzazione per mostrare inserzioni diverse nel tempo, assicurati di chiamare unregisterView() prima della registrazione della stessa visualizzazione con un'istanza differente di NativeBannerAd.

Eseguendo il codice, dovresti vedere un banner nativo:

Durante il caricamento di un'inserzione, le seguenti proprietà includeranno alcuni valori: title, icon e callToAction. Altre proprietà potrebbero invece essere nulle o vuote. Assicurati che il codice sia sufficientemente affidabile per gestire questi casi.


Quando non c'è alcuna inserzione da mostrare, onError verrà chiamato con un error.code. Se utilizzi il tuo livello di report o mediazione personalizzato, potresti voler controllare il valore del codice e rilevare questo caso. In questo caso puoi eseguire il fallback a un'altra rete di inserzioni, ma non richiedere nuovamente un'inserzione subito dopo.


I metadati delle inserzioni ricevuti possono essere memorizzati nella cache e usati nuovamente per 30 minuti al massimo. Se programmi di utilizzarli dopo questo lasso di tempo, effettua una chiamata per caricare una nuova inserzione.

Passaggi successivi

  • Consulta la guida Modello di inserzione nativa per aggiungere inserzioni native nell'app.

  • Esplora i nostri esempi di codice che dimostrano come utilizzare le inserzioni native. NativeBannerAdSample è disponibile come parte dell'SDK ed è presente nella cartella AudienceNetwork/samples. Importa il progetto nell'IDE ed eseguilo su un dispositivo o sull'emulatore.

Altre risorse

Guida introduttiva

Guida tecnica per muovere i primi passi con Audience Network

Esempi di codice

Esempi di integrazione delle inserzioni di Audience Network

FAQ

FAQ di Audience Network

Modello delle inserzioni native

Un approccio più libero all'integrazione delle inserzioni native