Ajouter publicités vidéo avec récompense à une application Android

L’Audience Network vous permet de monétiser vos applications Android avec des publicités Facebook. Les publicités vidéo avec récompense sont une expérience en plein écran dans laquelle les utilisateurs choisissent de regarder une publicité vidéo en échange de quelque chose de valeur, comme une devise virtuelle, des objets dans l’application, des contenus exclusifs, etc. L’expérience publicitaire dure entre 15 et 30 secondes, ne peut pas être ignorée et contient une fiche finale avec un appel à l’action. Lorsque la vidéo complète sera terminée, vous recevrez un rappel vous invitant à accorder la récompense suggérée à l’utilisateur.

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

Étape par étape

Étape 1 : initialisation des publicités vidéo avec récompense dans votre activité

Étape 2 : affichage de publicités vidéo avec récompense dans votre activité

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 : initialisation des publicités vidéo avec récompense dans votre activité publicitaire

Pour importer le SDK Publicités Facebook, ajoutez le code suivant en haut de votre activité :

import com.facebook.ads.*;

Initialisez ensuite l’objet vidéo avec récompense, définissez l’auditeur et chargez le contenu créatif vidéo. La publicité vidéo avec récompense requiert une interface RewardedVideoAdListener qui implémente les méthodes suivantes dans l’exemple de code pour gérer divers évènements. Voici un exemple dans votre activité :

private final String TAG = RewardedVideoAdActivity.class.getSimpleName();
private RewardedVideoAd rewardedVideoAd;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    // Instantiate a RewardedVideoAd 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).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        @Override
        public void onError(Ad ad, AdError error) {
            // Rewarded video ad failed to load
            Log.e(TAG, "Rewarded video ad failed to load: " + error.getErrorMessage());
        }

        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            Log.d(TAG, "Rewarded video ad is loaded and ready to be displayed!");
        }

        @Override
        public void onAdClicked(Ad ad) {
            // Rewarded video ad clicked
            Log.d(TAG, "Rewarded video ad clicked!");
        }

        @Override
        public void onLoggingImpression(Ad ad) {
            // Rewarded Video ad impression - the event will fire when the 
            // video starts playing
            Log.d(TAG, "Rewarded video ad impression logged!");
        }

        @Override
        public void onRewardedVideoCompleted() {
            // Rewarded Video View Complete - the video has been played to the end.
            // You can use this event to initialize your reward
            Log.d(TAG, "Rewarded video completed!");

            // Call method to give reward
            // giveReward();
        }

        @Override
        public void onRewardedVideoClosed() {
            // The Rewarded Video ad was closed - this can occur during the video
            // by closing the app, or closing the end card.
            Log.d(TAG, "Rewarded video ad closed!");
        }
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

Étape 2 : affichage des publicités vidéo avec récompense

Scénario 1 : affichage immédiat de la publicité dès son chargement. Modifiez la méthode onAdLoaded() ci-dessus afin de la diffuser comme suit :

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd 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).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            rewardedVideoAd.show();
        }
        ...
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

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 :

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd 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).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };
    // load the ad
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());

    // Here is just an example for displaying the ad with delay
    // Please call this method at appropriate timing in your project
    showAdWithDelay();
}

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 rewardedVideoAd has been loaded successfully
            if (rewardedVideoAd == null || !rewardedVideoAd.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 (rewardedVideoAd.isAdInvalidated()) {
                return;
            }
            rewardedVideoAd.show();
        }
    }, 1000 * 60 * 15); // Show the ad after 15 minutes
}

Si vous utilisez l’émulateur Google Android par défaut, ajoutez la ligne de code suivante avant de charger une publicité test :
AdSettings.addTestDevice("HASHED ID");.

Utilisez l’ID haché imprimé sur le logcat la première fois que vous effectuez une demande de chargement d’une publicité sur un appareil.

Cette étape n’est pas nécessaire pour Genymotion ni pour les appareils physiques. Si vous souhaitez effectuer un test avec de vraies publicités, consultez notre guide de test.

Enfin, nettoyez l’objet avec sa méthode destroy dans la méthode onDestroy de votre activité. Notez que vous devez également utiliser la méthode destroy pour nettoyer les anciens objets publicitaires avant de l’attribuer à une nouvelle instance pour éviter toute fuite de mémoire.

@Override
protected void onDestroy() {
    if (rewardedVideoAd != null) {
        rewardedVideoAd.destroy();
        rewardedVideoAd = null;
    }
    super.onDestroy();
}

Accélération matérielle pour les publicités vidéo

Les publicités vidéo dans l’Audience Network nécessitent le rendu par accélération matérielle pour être activées. Elles risquent autrement d’afficher un écran noir. Cela concerne les :

  • Contenus vidéo créatifs dans les publicités natives
  • Contenus vidéo créatifs dans les publicités interstitielles
  • Publicités vidéo intégrées
  • Vidéos avec récompenses

L’accélération matérielle est activée par défaut si votre niveau d’API Target est >=14 (Ice Cream Sandwich, Android 4.0.1). Vous pouvez toutefois activer explicitement cette fonction au niveau de l’application ou de l’activité.

Niveau de l’application

Dans votre fichier manifeste Android, ajoutez l’attribut suivant à la balise <application> afin de permettre l’accélération matérielle pour toute votre application :

<application android:hardwareAccelerated="true" ...>

Niveau de l’activité

Si vous ne souhaitez activer la fonction que pour certaines activités dans votre application, ajoutez la fonction suivante à la balise <activity> dans votre manifeste Android. L’exemple suivant permettra l’accélération matérielle pour le AudienceNetworkActivity qui est utilisé pour le rendu des publicités interstitielles et des vidéos avec récompense :

<activity android:name="com.facebook.ads.AudienceNetworkActivity" android:hardwareAccelerated="true" .../>

Validation des récompenses côté serveur

Cette opération est facultative. Vous n’avez pas besoin d’implémenter une validation des récompenses côté serveur pour pouvoir utiliser les publicités vidéo avec récompense. Cela est nécessaire uniquement si vous décidez de valider des récompenses sur votre propre serveur pour améliorer la sécurité en introduisant une étape de validation au niveau de votre serveur. Veuillez communiquer votre point de terminaison d’éditeur à votre représentant Facebook afin d’activer cette fonctionnalité.

Aperçu

Si vous gérez les récompenses de vos utilisateurs côté serveur, Facebook vous propose une solution entièrement sécurisée reposant sur une technique de validation. Notre serveur communiquera avec un point de terminaison https particulier pour valider chaque impression publicitaire et pour valider l’octroi de la récompense.

  1. Le SDK Audience Network demande une publicité vidéo avec récompense avec les paramètres suivants :
    • un ID de placement de l’Audience Network ;
    • un identifiant d’utilisateur unique : un attribut à utiliser pour identifier un utilisateur unique (par exemple, un identifiant numérique) ;
    • une valeur de récompense : la valeur de la récompense que vous souhaitez accorder à l’utilisateur Par exemple, 100 Coins
  2. Lorsque la vidéo est terminée, le serveur Facebook enverra ces valeurs vers votre point de terminaison indiqué, ainsi que la clé secrète et un identifiant de transaction unique.
  3. À réception, le serveur valide la demande et répond comme suit :
    • Réponse 200 : la demande est valide et la récompense doit être fournie.
    • Réponse autre que 200 : la demande n’est pas valide et la récompense ne doit pas être fournie.
  4. Lorsque la vidéo est terminée, la fiche finale est présentée et l’un des évènements suivants se déclenche.
    • onRewardServerSuccess : déclenché uniquement si une réponse 200 a été reçue à l’étape 3.
    • onRewardServerFailed : déclenché si une réponse autre que 200 a été reçue à l’étape 3.

Exemple d’une URL qui parvient au point de terminaison de votre éditeur en partant du serveur de Facebook : https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Le flux de travail se présente comme suit :

Implémentation

Après l’initialisation de l’objet vidéo avec récompense, vous devrez transmettre un identifiant utilisateur et une valeur de récompense dans les données de publicité avec récompense avant de charger une publicité. L’identifiant utilisateur et la valeur de récompense sont des chaînes. Par exemple :

private RewardedVideoAd rewardedVideoAd;

private void loadRewardedVideoAd { 
    // Instantiate a RewardedVideoAd 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).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };

    // Create the rewarded ad data
    RewardData rewardData = new RewardData("YOUR_USER_ID", "YOUR_REWARD");

    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .withRewardData(rewardData)
                    .build());
}

Pour que votre application soit notifiée de la validation ou non de la récompense, vous devez implémenter l’interface S2SRewardedVideoAdListener. Cela inclut tous les évènements notés ci-dessus dans l’interface RewardedVideoAdListener, ainsi que deux évènements supplémentaires. Ce qui suit peut être utilisé avec les évènements mentionnés ci-dessus.

@Override
public void onRewardServerSuccess() {
    // Rewarded video ad validated
}

@Override
public void onRewardServerFailed() {
    // Rewarded video ad not validated or no response from server  
}  

Notez que les rappels de validation du serveur peuvent se produire uniquement après que la fiche finale a été fermée par un utilisateur. Vous ne devez pas désaffecter l’objet vidéo avec récompense avant la survenue de l’un de ces rappels.

Étapes suivantes