Adicionar anúncios em vídeo com incentivo a um app Android

O Audience Network permite que você monetize seus apps Android usando os anúncios do Facebook. Os anúncios de vídeo com incentivo são uma experiência em tela cheia em que os usuários optam por visualizar um anúncio de vídeo em troca de algo de valor, como moeda virtual, itens no app, conteúdo exclusivo e muito mais. A experiência do anúncio dura de 15 a 30 segundos, é não ignorável e contém um cartão ao final com uma chamada para ação. Após a visualização completa do vídeo, você receberá um retorno de chamada para dar a recompensa sugerida ao usuário.

Certifique-se de ter concluído os guias de Introdução do Audience Network e Introdução do Android antes de continuar.

Passo a passo

Etapa 1: inicializar anúncios em vídeo com incentivo na sua atividade

Etapa 2: exibir anúncios em vídeo com incentivo na sua atividade

Inicialize o SDK do Audience Network

Este método foi adicionado ao SDK do Audience Network para Android versão 5.1.

A inicialização explícita do SDK do Audience Network para Android é exigida para a versão 5.3.0 e superiores. Consulte este documento sobre como inicializar o SDK do Audience Network para Android.

Inicialize o SDK do Audience Network antes de criar um objeto de anúncio e carregar anúncios. É recomendado fazer isso durante a inicialização do aplicativo.

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

Etapa 1: inicializar anúncios em vídeo com incentivo na sua atividade

Adicione o seguinte código na parte superior de sua atividade para importar o SDK dos anúncios do Facebook:

import com.facebook.ads.*;

Em seguida, inicialize o objeto de vídeo com incentivo, configure o ouvinte e carregue o criativo do vídeo. O anúncio em vídeo com incentivo exige uma interface RewardedVideoAdListener que implemente os métodos a seguir no exemplo de código para administrar vários eventos. Por exemplo, em sua atividade:

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

Etapa 2: exibir anúncios em vídeo com incentivo

Cenário 1: exibir imediatamente o anúncio após o carregamento. Modifique o método onAdLoaded() acima para exibi-lo da seguinte maneira:

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

Cenário 2: exibir o anúncio poucos segundos ou minutos após o carregamento. Você deve verificar se o anúncio foi invalidado antes de exibi-lo.

Caso o anúncio não seja exibido imediatamente depois de carregado, o desenvolvedor será responsável por verificar se o anúncio foi invalidado. Quando o anúncio for carregado com sucesso, ele será válido por 60 min. Você não será pago se estiver exibindo um anúncio invalidado. Chame isAdInvalidated() para validar o anúncio.

Você deve seguir a ideia acima, mas não copie o código no projeto, pois ele serve só como um exemplo:

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 estiver usando o emulador padrão de Android do Google, adicione a seguinte linha de código antes de carregar um anúncio de teste:
AdSettings.addTestDevice("HASHED ID");.

Use o ID convertido em hash que está impresso no catálogo de registros ao fazer uma solicitação para carregar um anúncio em um dispositivo pela primeira vez.

Genymotion e dispositivos físicos não precisam dessa etapa. Se você quiser testar com anúncios reais, consulte nosso Guia de Teste.

Por fim, limpe o objeto com o método destroy no onDestroy da sua atividade. Também é preciso usar o método destroy para limpar objetos de anúncio antigos antes de atribuí-los a uma nova instância para evitar vazamentos de memória.

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

Aceleração de hardware para anúncios de vídeo

Os anúncios de vídeo no Audience Network exigem a ativação da exibição com aceleração de hardware, ou poderá haver uma tela preta na visualizações de vídeo. Isso se aplica a

  • Criativos de vídeo em anúncios nativos
  • Criativos de vídeo em anúncios intersticiais
  • Anúncios de vídeo in-stream
  • Vídeos com incentivo

A aceleração de hardware será ativada por padrão se o nível da sua API de destino for >=14 (Ice Cream Sandwich, Android 4.0.1), mas você pode também ativar esse recurso de forma explícita no nível de aplicativo ou no nível de atividade.

Nível de aplicativo

No arquivo de manifesto do Android, adicione o seguinte atributo à tag <application> para ativar a aceleração de hardware no aplicativo inteiro:

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

Nível de atividade

Caso você queira ativar o recurso somente para atividades específicas do seu aplicativo, no arquivo de manifesto do Android, é possível adicionar o seguinte recurso à tag <activity>. O exemplo a seguir ativará a aceleração de hardware de AudienceNetworkActivity, que é usada para renderizar anúncios intersticiais e vídeos com incentivo:

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

Validação de recompensa do lado do servidor

Isto é opcional! Você não precisa implementar a validação de recompensa do lado do servidor para poder usar os anúncios em vídeo com incentivo. Isso só é exigido se você decidir validar as recompensas em seu servidor para aprimorar a segurança ao introduzir uma etapa de validação nele. Forneça o ponto de extremidade do seu publisher ao representante do Facebook para habilitar este recurso.

Visão geral

Se você gerencia o lado do servidor das recompensas para os usuários, o Facebook oferece uma solução para executar isso de forma segura usando uma técnica de validação. Nosso servidor se comunicará com um ponto de extremidade https específico para validar cada impressão de anúncio e validar se uma recompensa deve ser concedida.

  1. O SDK do Audience Network solicita um anúncio de vídeo com incentivo com os seguintes parâmetros:
    • ID de posicionamento do Audience Network
    • ID de usuário único – um atributo usado para identificar um usuário único. Por exemplo, um identificador numérico
    • Valor de recompensa – o valor da recompensa que gostaria de conceder ao usuário. Por exemplo, 100Coins
  2. Ao término do vídeo, o servidor do Facebook repassa esses valores para seu ponto de extremidade especificado, junto com a chave secreta do app e uma ID de transação única.
  3. Ao recebê-los, o servidor valida a solicitação e responde da seguinte maneira:
    • Resposta 200: a solicitação é válida e a recompensa deve ser entregue;
    • Resposta não 200: a solicitação não é válida e a recompensa não deve ser entregue.
  4. Ao término do vídeo, o cartão final é apresentado, e um dos seguintes eventos é disparado.
    • onRewardServerSuccess: acionado somente quando a resposta 200 for retornada durante a etapa 3.
    • onRewardServerFailed: acionado quando uma resposta diferente de 200 for retornada durante a etapa 3.

Um exemplo de URL que chegará ao ponto de extremidade do publisher proveniente do servidor do Facebook: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

O fluxo de trabalho terá esta aparência:

Implementação

Após inicializar o objeto de vídeo com incentivo, você precisará colocar uma ID de usuário e o valor da recompensa nos dados do anúncio com incentivo antes de carregar um anúncio. A ID do usuário e o valor de recompensa são cadeias de caracteres. Por exemplo:

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 o app seja notificado sobre a validação da recompensa, você precisará implementar a interface S2SRewardedVideoAdListener. Isso inclui todos os eventos apontados acima na interface RewardedVideoAdListener, bem como dois eventos adicionais. O que vem a seguir pode ser usado com os eventos citados acima.

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

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

Atenção – os retornos de chamadas de validação do servidor podem ocorrer após o cartão final ter sido ignorado pelo usuário. Só desloque o objeto de vídeo com recompensa após um dos retornos de chamada.

Próximas etapas