Agregar anuncios con vídeo con premio a una aplicación de Android

Audience Network te permite monetizar tus aplicaciones para Android con anuncios de Facebook. Los anuncios que incluyen vídeos con premio son una experiencia a pantalla completa en la que los usuarios tienen la opción de ver un anuncio con vídeo a cambio de recibir una recompensa, como divisa virtual, artículos en la aplicación, contenido exclusivo, etc. Esta experiencia publicitaria, que dura entre 15 y 30 segundos y no se puede omitir, contiene una imagen final con una llamada a la acción. Una vez visualizado el vídeo completo, recibirás una devolución de llamada para conceder el premio sugerido al usuario.

Asegúrate de haber completado las guías de primeros pasos de Audience Network y Android antes de continuar.

Paso a paso

Paso 1: inicializar los anuncios que incluyen vídeo con premio en tu actividad

Paso 2: mostrar anuncios que incluyen vídeo con premio en tu actividad

Inicializar el SDK de Audience Network

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

Paso 1: inicializar los anuncios que incluyen vídeo con premio en tu actividad

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, inicializa el objeto de vídeo con premio, define el agente de escucha y carga el contenido del vídeo. Los anuncios que incluyen vídeos con premio requieren una interfaz RewardedVideoAdListener que implemente los métodos siguientes en el código de ejemplo para gestionar diferentes eventos. Tu actividad tendrá un aspecto similar a este:

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

Paso 2: mostrar anuncios que incluyen vídeo con premio

Situación 1: muestra el anuncio inmediatamente una vez que se cargue correctamente. Modifica el método onAdLoaded() anterior para mostrarlo como se indica a continuación:

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

Situación 2: muestra el anuncio unos segundos o minutos después de que se cargue correctamente. Deberías comprobar si el anuncio ha quedado invalidado antes de mostrarlo.

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 siguiente, pero no copies el código en el proyecto, ya que se trata solo de un ejemplo:

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 usas el emulador predeterminado de Android de Google, debes añadir esta línea de código antes de cargar un anuncio de prueba:
AdSettings.addTestDevice("HASHED ID");.

Utiliza el identificador con hash que figura en el logcat la primera vez que realices una solicitud para cargar un anuncio en un dispositivo.

Este paso no es necesario si se utiliza el emulador Genymotion o dispositivos físicos. Si quieres realizar pruebas con anuncios reales, consulta nuestra guía para pruebas.

Por último, borra el objeto con su método destroy en el método onDestroy de tu actividad. Ten en cuenta que también debes usar el método destroy para borrar objetos de anuncio antiguos antes de asignarlo a una nueva instancia para evitar una fuga de memoria.

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

Aceleración por hardware para anuncios con vídeo

Para evitar la posibilidad de que se muestre una pantalla en negro al reproducir los anuncios con vídeo de Audience Network, es necesario activar la renderización con aceleración por hardware. Este requerimiento se aplica a:

  • contenido de vídeo en anuncios nativos,
  • contenido de vídeo en intersticiales,
  • anuncios en vídeos in-stream,
  • vídeos con premio.

La aceleración por hardware se activa de forma predeterminada si la versión de la API a la que te diriges es la 14 o posterior (Ice Cream Sandwich, Android 4.0.1), pero también puedes activarla de forma explícita en el nivel de la aplicación o de la actividad.

Nivel de la aplicación

En el archivo de manifiesto de Android, añade el siguiente atributo a la etiqueta <application> para activar la aceleración por hardware en toda la aplicación:

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

Nivel de la actividad

Si solo quieres activar la función para determinadas actividades de la aplicación, puedes añadir la siguiente función a la etiqueta <activity> en el archivo de manifiesto de Android. En el siguiente ejemplo, se muestra cómo activar la aceleración por hardware para la actividad AudienceNetworkActivity, que se utiliza para mostrar anuncios intersticiales y vídeos con premio:

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

Validación de los premios en el lado del servidor

Es opcional. No es necesario que implementes la validación de las recompensas en el lado del servidor para poder usar los anuncios que incluyen vídeos con premio. Esta acción solo es obligatoria si decides validar las recompensas en tu propio servidor a fin de mejorar la seguridad. Proporciona a tu representante de Facebook el extremo de editor para activar esta función.

Información general

En el caso de aquellos que gestionan las recompensas a los usuarios en el lado del servidor, Facebook ofrece una solución para llevar dicho proceso a cabo de forma segura mediante una técnica de validación. Nuestro servidor se comunicará con el extremo HTTPS especificado con el objetivo de validar cada impresión de anuncio y el hecho de si una recompensa debe concederse o no.

  1. El SDK de Audience Network solicita un anuncio que incluye vídeos con premio con los parámetros siguientes:
    • Un identificador de ubicación de Audience Network.
    • Un identificador de usuario único: un atributo que se usa para identificar a un usuario único (por ejemplo, un identificador numérico).
    • El valor de la recompensa: el valor de la recompensa que quieres conceder al usuario Por ejemplo, 100 monedas
  2. Una vez finalizado el vídeo, el servidor de Facebook transmite estos valores al extremo que has especificado junto con la clave secreta de la aplicación y un identificador de transacción único.
  3. Cuando se reciben, el servidor valida la solicitud y responde de la siguiente manera:
    • Código de respuesta 200: la solicitud es válida y debe concederse la recompensa.
    • Código de respuesta no 200: la solicitud no es válida y no debe concederse la recompensa.
  4. Al finalizar el vídeo, se muestra la imagen final y se activa uno de los siguientes eventos.
    • onRewardServerSuccess: se activa únicamente si se recibe un código de respuesta 200 en el paso 3.
    • onRewardServerFailed: se activa si se recibe un código de respuesta distinto a 200 en el paso 3.

Este es un ejemplo de la URL que se recibirá en tu extremo de editor desde el servidor de Facebook: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Este es el aspecto que tendrá el proceso:

Implementación

Tras inicializar el objeto de vídeo con premio, deberás pasar un identificador de usuario y un importe para la recompensa en los datos del anuncio antes de cargarlo. Tanto el identificador de usuario como el importe para la recompensa son cadenas. Por ejemplo:

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

Deberás implementar la interfaz S2SRewardedVideoAdListener a fin de que tu aplicación reciba una notificación para confirmar si se ha validado el premio. Esta interfaz incluye todos los eventos que figuran más arriba en la interfaz RewardedVideoAdListener, así como otros dos adicionales. Los eventos mencionados anteriormente pueden usarse con el siguiente fragmento de código:

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

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

Ten en cuenta que las devoluciones de llamada de validación del servidor pueden producirse después de que el usuario haya descartado la tarjeta final. No es recomendable anular el objeto de vídeo con premio antes de que se produzca alguna de estas devoluciones de llamada.

Siguientes pasos