Ajouter des bandeaux publicitaires natifs à une application Android

Grâce à l’API des bandeaux publicitaires natifs, vous pouvez créer une expérience personnalisée permettant de présenter une publicité native sans les éléments de contenu publicitaire de l’annonceur de type image, vidéo ou carrousel. Comme dans le cas des publicités natives, vous recevrez un groupe de propriétés de publicité telles qu’un titre, une icône et un bouton call-to-action, que vous utiliserez pour créer une vue personnalisée dans laquelle la publicité s’affichera. Toutefois, contrairement aux bandeaux publicitaires, l’API des bandeaux publicitaires natifs vous offre une expérience de composition native qui vous permet de personnaliser entièrement la disposition des composants de la publicité.

Assurez-vous d’avoir terminé le Guide de démarrage et le guide Démarrer avec Android avant de commencer.

Ce guide vous indique comment placer le bandeau publicitaire natif indiqué ci-dessous. Vous allez créer un bandeau publicitaire natif au moyen des composants suivants :

Vue n° 1 : AdOptionsView

Vue n° 2 : Étiquette de publicité sponsorisée

Vue n° 3 : Icône de la publicité

Vue n° 4 : Titre de la publicité

Vue n° 5 : Contexte social

Vue n° 6 : Bouton call-to-action




Étapes du bandeau publicitaire natif

Étape 1 : Demande d’un bandeau publicitaire natif

Étape 2 : Création de la composition de votre bandeau publicitaire natif

Étape 3 : Remplissage de votre composition à l’aide des métadonnées de la publicité

Initialiser le SDK Audience Network

La méthode a été ajoutée à la version 5.1 du SDK Audience Network pour Android.

L’initialisation explicite du SDK Audience Network pour Android est requise à partir de la version 5.3.0. Veuillez consulter ce document pour savoir comment initialiser le SDK Audience Network pour Android.

Avant de télécharger un objet publicitaire et de charger des publicités, vous devez initialiser le SDK Audience Network. Il est recommandé de le faire lors du démarrage de l’application.

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

Étape 1 : Demande d’un bandeau publicitaire natif

Ajoutez le code suivant en haut de votre activité pour importer le SDK Facebook Ads :

import com.facebook.ads.*;

Ensuite, instanciez un objet NativeBannerAd, créez un élément AdListener, puis appelez loadAd(...) dans votre activité :

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

Nous y reviendrons plus tard pour ajouter du code à la méthode onAdLoaded().

Étape 2 : Création de la composition de votre bandeau publicitaire natif

Ensuite, vous devez extraire les métadonnées de la publicité et utiliser ses propriétés pour créer votre interface native sur mesure. Vous pouvez créer votre vue sur mesure au format .xml ou ajouter des éléments dans le code.

Veuillez consulter nos règles concernant les bandeaux publicitaires natifs lorsque vous en créez dans votre application.

Dans la composition activity_main.xml de votre activité, ajoutez un conteneur pour votre bandeau publicitaire natif. Le conteneur doit être un com.facebook.ads.NativeAdLayout, c’est-à-dire un wrapper par dessus un FrameLayout avec une fonctionnalité supplémentaire qui nous a permis d’ajouter un flux de rapports de publicité. Par la suite, dans la méthode onAdLoaded(), vous devrez remplir votre vue de publicité native dans ce conteneur.

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

Créez une composition personnalisée native_banner_ad_unit.xml pour votre bandeau publicitaire natif :



Voici un exemple de disposition personnalisée pour votre bandeau publicitaire natif :

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

Étape 3 : Remplissage de votre composition à l’aide des métadonnées de la publicité

Scénario 1 : Affichage immédiat de la publicité dès son chargement. Modifiez la méthode onAdLoaded() ci-dessus pour récupérer les propriétés de Native Banner Ad's et les afficher comme suit :

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

Le SDK enregistrera l’impression et gérera le clic automatiquement. Notez que vous devez enregistrer la vue de la publicité avec l’instance NativeBannerAd pour activer cette fonctionnalité. Pour rendre cliquables les éléments de votre publicité, enregistrez-la avec :

registerViewForInteraction(View view, MediaView adIconView)

Scénario 2 : Affichage de la publicité dans les secondes ou les minutes qui suivent son chargement. Avant d’afficher la publicité, assurez-vous qu’elle n’a pas été invalidée.

Si la publicité s’affiche non pas immédiatement, mais quelques secondes ou quelques minutes après son chargement, le développeur doit vérifier si celle-ci a été invalidée ou non. Une fois chargée, la publicité est valide pendant 60 minutes. Vous ne recevrez pas de paiement en cas d’affichage d’une publicité invalidée. Vous devez appeler isAdInvalidated() pour valider la publicité.

Suivez l’idée ci-dessous, mais ne copiez surtout pas le code dans votre projet, car il s’agit d’un exemple :

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

Contrôler les zones cliquables

Pour garantir une meilleure expérience utilisateur et de meilleurs résultats, vous devez toujours penser à contrôler la zone cliquable de votre publicité pour éviter les clics accidentels. N’hésitez pas à consulter la page Politique relative au SDK de l’Audience Network pour obtenir des détails sur la mise en application du règlement sur les espaces blancs non cliquables.

Pour contrôler plus précisément les zones cliquables, vous pouvez utiliser l’élément registerViewForInteraction(View view, MediaView adIconView, List<View> clickableViews) afin d’enregistrer une liste des vues sur lesquelles il est possible de cliquer. Par exemple, si vous souhaitez uniquement que le titre de la publicité et le bouton d’appel à l’action soient cliquables dans l’exemple précédent, vous pouvez l’écrire comme suit :

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

Lorsque vous réutilisez la vue pour présenter différentes publicités au fil du temps, veillez à appeler unregisterView() avant d’enregistrer la même vue avec une autre instance de NativeBannerAd.

Exécutez le code ; vous devriez voir un bandeau publicitaire natif :

Lorsqu’une publicité est chargée, les propriétés suivantes incluent certaines valeurs : title, icon et callToAction. D’autres propriétés peuvent être nulles ou vides. Assurez-vous que votre code est suffisamment robuste pour gérer ces cas.


Lorsqu’il n’y a aucune publicité à présenter, onError est appelé, accompagné d’un élément error.code. Si vous utilisez votre propre couche de médiation ou de rapport personnalisée, nous vous conseillons de vérifier la valeur du code et de détecter ce cas. Vous pouvez utiliser un autre réseau publicitaire dans ce cas, mais ne renvoyez pas de demande de publicité immédiatement après.


Les métadonnées de la publicité que vous recevez peuvent être mises en cache et réutilisées pendant 30 minutes au maximum. Après cela, si vous souhaitez utiliser les métadonnées, vous devez faire un appel pour charger une nouvelle publicité.

Étapes suivantes

  • Pour ajouter des bandeaux publicitaires natifs à votre application, consultez le guide des modèles de publicités natives.

  • Découvrez nos exemples de code qui montrent le fonctionnement des publicités natives. L’exemple NativeBannerAdSample fait partie du SDK et se situe dans le dossier AudienceNetwork/samples. Importez le projet dans votre environnement de développement intégré, et lancez-le sur un appareil ou sur le simulateur.

Ressources supplémentaires

Guide de démarrage

Guide technique pour démarrer avec Audience Network

Exemples de code

Exemples d’intégration de publicités de l’Audience Network

Questions/réponses

Questions/réponses sur l’Audience Network

Modèle de publicités natives

Une approche plus pratique lors de l’intégration de publicités natives