Agregar anuncios con video con premio a una app de Android

Audience Network te permite monetizar tus aplicaciones para Android mediante anuncios de Facebook. Los anuncios con video con premio son una experiencia en pantalla completa que ofrece a los usuarios la opción de ver un anuncio con video a cambio de recibir una recompensa, como divisa virtual, artículos en la app, contenido exclusivo, etc. La experiencia de anuncios dura entre 15 y 30 segundos, no se puede omitir y contiene una tarjeta final con una llamada a la acción. Una vez que finalice el video, recibirás una devolución de llamada para otorgar la recompensa sugerida al usuario.

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

Paso a paso

Paso 1: Inicializar anuncios con video con premio en la actividad

Paso 2: Mostrar anuncios con video con premio en la actividad

Inicializar el SDK de Audience Network

Este método se agregó 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 obligatoria a partir de la versión 5.3.0. Consulta este documento sobre cómo inicializar el SDK de Audience Network para Android.

Antes de crear un objeto de anuncio y cargar anuncios, debes inicializar el SDK de Audience Network. Se recomienda hacerlo durante el inicio de 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 anuncios con video con premio en la actividad

Agrega el siguiente código en la parte superior de la actividad para importar el SDK de anuncios de Facebook:

import com.facebook.ads.*;

A continuación, inicializa el objeto de video, define el destinatario y carga el contenido de video. El anuncio con video con premio requiere una interfaz RewardedVideoAdListener que implemente los siguientes métodos en el código de ejemplo para gestionar varios eventos. Por ejemplo, en la actividad:

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 con video con premio

Situación 1: El anuncio se muestra de inmediato una vez que se carga correctamente. Modifica el método onAdLoaded() anterior para mostrarlo de la siguiente manera:

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: Mostrar el anuncio varios segundos o minutos después de que se haya cargado correctamente. Comprueba si el anuncio se invalidó antes de que se muestre.

En caso de que el anuncio no se muestre de forma automática después de cargarse, el desarrollador es responsable de verificar si el anuncio fue invalidado. Una vez que se carga satisfactoriamente, el anuncio es válido por 60 minutos. Si muestras un anuncio invalidado, no recibirás el pago. Debes hacer una llamada a isAdInvalidated() para validar el anuncio.

Te recomendamos que sigas el modelo que aparece a continuación, pero no copies el código en tu proyecto, ya que es solo 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 estás usando el emulador predeterminado de Google Android, debes agregar la siguiente 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.

Genymotion y los dispositivos físicos no necesitan este paso. Si quieres probar con anuncios reales, consulta nuestra guía de pruebas.

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

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

Aceleración de hardware para los anuncios con video

Los anuncios con video en Audience Network requieren que se active la función de aceleración de hardware, ya que, de lo contrario, las reproducciones de video podrían mostrar una pantalla negra. Esto se aplica a:

  • Contenido de video en los anuncios nativos
  • Contenido de video en los anuncios intersticiales
  • Anuncios con video instream
  • Videos con premio

La aceleración de hardware se activa de forma predeterminada si el nivel de API objetivo es mayor o igual a 14 (Ice Cream Sandwich, Android 4.0.1), pero también puedes activar explícitamente esta función en la aplicación o actividad.

En la aplicación

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

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

En la actividad

Si solo quieres activar la función para actividades concretas de tu aplicación, puedes agregar la siguiente función a la etiqueta <activity> en el archivo de manifiesto de Android. El siguiente ejemplo activará la aceleración de hardware para AudienceNetworkActivity, que se usa para mostrar anuncios intersticiales y videos con premio:

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

Validación de premios en el servidor

Esto es opcional. No es necesario que implementes validación de premios en el servidor para usar anuncios con video con premio. Esta acción solo es necesario si decides validar los premios en tu propio servidor como paso adicional para mejorar la seguridad. Proporciona tu punto de conexión de editor a a tu representante de Facebook para habilitar esta función.

Información general

Si administras los premios de tus usuarios en el servidor, Facebook ofrece una solución para hacerlo de forma segura usando una técnica de validación. Nuestro servidor se comunicará con un punto de conexión https especificado para validar cada impresión de anuncio y determinar si se debe otorgar un premio.

  1. El SDK de Audience Network solicita un anuncio de video con premio con los siguientes parámetros:
    • Identificador de ubicación de Audience Network
    • Identificador de usuario único: atributo que se usa para identificar un usuario único. Por ejemplo, un identificador numérico.
    • Valor de recompensa: valor del premio que desearías otorgar al usuario. Por ejemplo, 100 monedas
  2. Cuando el video finaliza, el servidor de Facebook transmite estos valores a tu punto de conexión especificado junto con el secreto de la app y un identificador de transacción único.
  3. Después de la recepción, el servidor valida la solicitud y responde de la siguiente manera:
    • Respuesta con código 200: la respuesta es válida y el premio se debe entregar.
    • Respuesta sin código 200: la respuesta no es válida y el premio no se debe entregar.
  4. Una vez que el video finaliza, la tarjeta final se presenta y se activa uno de los siguientes eventos.
    • onRewardServerSuccess: se activa solo si se recibe a una respuesta con código 200 durante el paso 3.
    • onRewardServerFailed: se activa si se recibe a una respuesta sin código 200 durante el paso 3.

Un ejemplo de la URL que llegará a tu punto de conexión 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

El flujo de trabajo tendrá un aspecto como este:

Implementación

Después de inicializar el objeto de video con premio, deberás pasar una cantidad de identificadores de usuario y premios a los datos de anuncios con premio antes de cargar un anuncio. La cantidad de identificadores de usuario y premios 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());
}

Para que tu app reciba notificaciones si el premio se validó o no, deberás implementar la interfaz S2SRewardedVideoAdListener. Esto incluye todos los eventos observados anteriormente en la interfaz RewardedVideoAdListener y dos eventos adicionales. Lo siguiente se puede usar junto con los eventos antes mencionados.

@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 lo siguiente: las devoluciones de llamadas de servidor podrían tener lugar después de que un usuario descarte la tarjeta final. No debes desasignar el objeto de video con premio hasta después de una de estas devoluciones de llamadas.

Próximos pasos