Aggiunta di inserzioni video con premio all'app per Android

Audience Network ti consente di monetizzare le tue app per Android con le inserzioni di Facebook. Le inserzioni video con premio sono un'esperienza a schermo intero in cui gli utenti accettano di visualizzare un'inserzione video in cambio di qualcosa, ad esempio una valuta virtuale, articoli nell'app, contenuti esclusivi e altro ancora. L'esperienza pubblicitaria è di 15-30 secondi, non può essere saltata e contiene un'immagine finale con una call to action. Al termine dell'intero video, riceverai una callback per concedere il premio suggerito all'utente.

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

Istruzioni dettagliate

Passaggio 1: inizializzazione delle inserzioni video con premio nella tua attività

Passaggio 2: visualizzazione delle inserzioni video con premio nella tua attività

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: inizializzazione delle inserzioni video con premio nella tua attività

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

import com.facebook.ads.*;

Quindi, inizializza l'oggetto video con premio, configura il processo di ascolto e carica le creatività video. L'inserzione video con premio richiede un'interfaccia RewardedVideoAdListener che implementa i seguenti metodi nel codice di esempio per gestire vari eventi. Ad esempio nella tua attività:

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

Passaggio 2: visualizzazione delle inserzioni video con premio

Scenario 1: visualizza l'inserzione subito dopo che è stata caricata correttamente. Modifica il metodo onAdLoaded() sopra per mostrarlo come segue:

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

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:

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
}

Se usi l'emulatore Google Android predefinito, aggiungi la riga di codice seguente prima di caricare un'inserzione di prova:
AdSettings.addTestDevice("HASHED ID");.

Usa l'ID con hash che viene visualizzato nel logcat alla prima richiesta di caricamento di un'inserzione sul dispositivo.

Genymotion e i dispositivi fisici non richiedono questo passaggio. Se desideri eseguire il test con inserzioni reali, consulta la nostra guida ai test.

Per ultimo, rimuovi l'oggetto con il relativo metodo destroy nel metodo onDestroy dell'attività. Tieni presente che devi usare il metodo destroy anche per rimuovere oggetti pubblicitari precedenti prima di assegnarlo a una nuova istanza per evitare perdite di memoria.

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

Accelerazione hardware per le inserzioni video

Le inserzioni video in Audience Network richiedono l'abilitazione del rendering con accelerazione hardware, in caso contrario potresti visualizzare una schermata nera nelle visualizzazioni del video. Elementi a cui si applica

  • Creatività dei video nelle inserzioni native
  • Creatività dei video nelle inserzioni insterstitial
  • Inserzioni video in-stream
  • Video con premio

L'accelerazione hardware è abilitata per impostazione predefinita se il livello dell'API di destinazione è maggiore di o uguale a 14 (Ice Cream Sandwich, Android 4.0.1), ma puoi anche abilitare questa funzione in modo esplicito al livello dell'app o dell'attività.

Livello dell'app

Nel file manifest di Android, aggiungi l'attributo seguente al tag <application> per abilitare l'accelerazione hardware per tutta la tua app:

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

Livello di attività

Se vuoi abilitare la funzione solo per attività specifiche nella tua app, puoi aggiungere la funzione seguente al tag <activity> nel tuo file manifest di Android. Nell'esempio seguente, l'accelerazione hardware viene abilitata per l'elemento AudienceNetworkActivity, usato per il rendering delle inserzioni interstitial e dei video con premio:

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

Convalida del premio sul lato server

Questa operazione è facoltativa! Non è obbligatorio implementare la convalida del premio lato server per usare le inserzioni video con premio. Diventa necessario solo se decidi di convalidare i premi sul tuo server per migliorare la sicurezza introducendo un passaggio di convalida sul tuo server. Indica il tuo endpoint dell'editore al rappresentante di Facebook per poter abilitare questa funzione.

Panoramica

Se gestisci i premi per i tuoi utenti sul lato server, Facebook ti offre una soluzione per eseguire questa attività in sicurezza tramite una tecnica di convalida. Il nostro server comunicherà con un endpoint https specificato per la convalida di ogni impression relativa all'inserzione e per stabilire se il premio debba essere concesso o meno.

  1. L'SDK di Audience Network richiede un'inserzione video con premio con i seguenti parametri:
    • ID del posizionamento di Audience Network
    • ID utente unico, ovvero un attributo utilizzato per identificare un utente unico, ad esempio, un identificativo numerico
    • Valore del premio che vuoi concedere all'utente, ad esempio 100 monete
  2. Al completamento del video, il server Facebook trasmette questi valori all'endpoint specificato, insieme alla chiave segreta e a un ID unico della transazione.
  3. Una volta ricevuti, il server convalida la richiesta e risponde nel modo seguente:
    • Codice di risposta 200: la richiesta è valida e il premio verrà assegnato.
    • Codice di risposta non 200: la richiesta non è valida e il premio non verrà assegnato.
  4. Una volta completato il video, viene presentata l'immagine finale e viene attivato uno degli eventi seguenti.
    • onRewardServerSuccess: attivato solo se è stata ricevuta una risposta 200 durante il passaggio 3.
    • onRewardServerFailed: attivato se è stata ricevuta una risposta diversa da 200 durante il passaggio 3.

Un esempio dell'URL che raggiungerà l'endpoint dell'editore, dal server di Facebook: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Il flusso di lavoro sarà simile a questo:

Implementazione

Dopo aver inizializzato l'oggetto video con premio, dovrai inserire un ID utente e un importo premio nei dati delle inserzioni con premio prima di caricare un'inserzione. Sia l'ID utente che l'importo del premio sono stringhe. Ad esempio:

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

Affinché la tua app riceva una notifica in merito alla convalida o meno del premio, dovrai implementare l'interfaccia S2SRewardedVideoAdListener. Ciò include tutti gli eventi sopra indicati nell'interfaccia RewardedVideoAdListener, oltre a due ulteriori eventi. Puoi usare quanto segue insieme agli eventi menzionati in precedenza.

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

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

Tieni presente che le callback di convalida del server potrebbero verificarsi dopo che l'immagine finale è stata ignorata da un utente. Non devi annullare l'allocazione dell'oggetto video con premio finché non si verifica una di queste callback.

Passaggi successivi