Implementação nativa do AFS para Android

O SDK dos anúncios para dispositivos móveis do Google também é compatível com estilos de pesquisa personalizados. Caso seu app já use o SDK dos anúncios para dispositivos móveis do Google, recomendamos que você use a versão do SDK do AFSMA.

Se você estiver fazendo upgrade da versão 18.1.0 ou anterior para a 19.0.0 ou posterior, consulte nosso guia de migração.

Pré-requisitos

Este guia de implementação pressupõe que você esteja familiarizado com o seguinte:

Importar o SDK nativo do AFS

Adicionar o SDK

Para adicionar o SDK nativo do AFS ao seu app, faça o seguinte:

Abra o arquivo build.gradle dentro do diretório do módulo do aplicativo. Adicione uma nova regra de build em dependencies para a versão mais recente do SDK:

dependencies {
  implementation 'com.google.android.gms:play-services-afs-native:19.0.3'
}

Verifique se o build.gradle de nível superior contém uma referência ao repositório google() ou ao maven { url "https://maven.google.com" }.

Siga estas instruções para incluir o plug-in de correspondência da versão independente do Google Play no seu projeto. A aplicação desse plug-in causa um erro de build do Gradle quando o SDK nativo do AFS é usado com uma versão incompatível do Google Play Services, em vez de permitir que o app seja criado, mas pode causar falhas no momento da execução. Ou aplique o failOnVersionConflict() ResolutionStrategy ao projeto para causar um erro de build quando versões incompatíveis do Google Play Services forem usadas. Salve as mudanças e clique em Sync Project with Gradle Files na barra de ferramentas.

Usar o AndroidX em vez das Bibliotecas de Suporte do Android

A partir da versão 17.0.0 do SDK, seu app precisa usar as bibliotecas do Jetpack (AndroidX) em vez das Bibliotecas de Suporte do Android. Requisitos de compatibilidade:

  • Defina com.android.tools.build:gradle como v3.2.1 ou mais recente.
  • Defina compileSdkVersion como 28 ou mais recente.
  • Atualize seu app para usar o Jetpack (AndroidX). Siga as instruções em Migrar para o AndroidX.

Classes

Para veicular anúncios nativos do AFS no seu app, implemente as seguintes classes:

SearchAdController

  • Essa classe é responsável por solicitar anúncios de forma assíncrona, armazenar em cache e recuperar anúncios e renderizar anúncios.
  • Cada contexto de anúncio precisa de um SearchAdController diferente. Por exemplo, se você tem uma tela que mostra anúncios junto com uma lista de resultados da pesquisa e outra tela que mostra anúncios com detalhes de um produto específico, crie duas instâncias separadas de SearchAdController, uma para cada caso.
  • O construtor precisa receber o código da propriedade da Web (ID do editor), o ID do estilo para aplicar aos anúncios retornados e SearchAdOptions. O Context fornecido no construtor precisa ser o Activity que contém o SearchAdController e onde você coloca o anúncio View.
  • Chame loadAds para indicar uma nova pesquisa de usuário e inicie uma solicitação de anúncio assíncrona. Todos os anúncios carregados de chamadas anteriores para loadAds são apagados do cache interno quando uma nova chamada é feita.
  • Crie um View com createAdView para exibir criativos de anúncios.
  • Depois que os anúncios forem carregados, chame populateAdView com um View gerado anteriormente com createAdView para renderizar um anúncio armazenado em cache nessa View. Além do View que precisa ser preenchido, forneça um adKey, uma string arbitrária para identificar de forma exclusiva o anúncio. Isso associa o criativo de anúncio específico retornado do cache a essa adKey. Portanto, quando o mesmo adKey é transmitido a uma chamada futura para populateAdView, o mesmo anúncio é retornado. Por exemplo, se populateAdView for chamado pela primeira vez com adKey="keyA" e renderizar um anúncio de botas de caminhada, cada chamada subsequente para populateAdView com adKey="keyA" preencherá o mesmo anúncio de botas de caminhada. Fazer uma nova chamada para loadAds limpa todos os anúncios em cache e chaves de anúncios associadas.

SearchAdOptions

  • Transmita esse objeto ao construtor SearchAdController para personalizar como os anúncios são solicitados e exibidos. Chame build() em um SearchAdOptions.Builder para criar um objeto SearchAdOptions.

View

  • Crie um objeto View para reter anúncios chamando createAdView() no SearchAdController. Exibe no máximo um anúncio por vez, mas o mesmo View pode ser reciclado para exibir anúncios diferentes ao longo do tempo.

SearchAdRequest

  • Chame o método loadAds na SearchAdController com um SearchAdRequest para iniciar uma solicitação de anúncio assíncrona. Chame build() em uma SearchAdRequest.Builder para criar um objeto SearchAdRequest.

AdListener

  • Implemente essa interface e transmita-a ao construtor SearchAdController para registrar callbacks para vários estados.
  • Observação: callbacks AdListener não serão chamados em uma solicitação cancelada (uma chamada para loadAds que foi interrompida por outra chamada para loadAds antes da primeira chamada ser resolvida).

Implementação de exemplo

O exemplo abaixo demonstra a criação de um SearchAdController em uma amostra de Activity.

//  MainActivity.java implementation
//  (MainActivity is a subclass of Activity)

SearchAdController adController;
// adContainer where we will place our ads in this example.
ViewGroup adContainer;

protected void onCreate(Bundle bundle){
  super.onCreate(bundle);
  adContainer = (ViewGroup) findViewById(...);
  // Specify ad options (not required).
  SearchAdOptions.Builder adOptionsBuilder = new SearchAdOptions.Builder();
  adOptionsBuilder.setAdType(SearchAdOptions.AD_TYPE_TEXT);
  adOptionsBuilder.setPrefetch(true);
  adOptionsBuilder.setNumAdsRequested(3);
  // Provide a callback to trigger when ads are loaded.
  AdListener adListener = new AdListener() {
    public void onAdLoaded() {
      createAndShowAd();
    }
  };
  // Instantiate the SearchAdController.
  adController = new SearchAdController(this, "your-client-id", "your-style-id",
                                        adOptionsBuilder.build(), adListener);
}

Quando o usuário iniciar uma consulta, crie um SearchAdRequest e chame loadAds na SearchAdController para iniciar uma solicitação de anúncio assíncrona.

// Create the request.
SearchAdRequest.Builder requestBuilder = new SearchAdRequest.Builder();
requestBuilder.setQuery("user query here");
// Load the ads.
adController.loadAds(requestBuilder.build());

Implemente o callback onAdLoaded para preencher um anúncio carregado em uma visualização.

private void createAndShowAd() {
  // Create a new view that will contain the ad.
  View adView = adController.createAdView();
  // Attach the new view to the view hierarchy.
  adContainer.addView(adView);
  // Display the ad inside the adView. We need to provide an adKey to
  // indicate which ad is to be displayed in the adView. In this example, 
  // since we only have one ad, we can provide any constant string. However, 
  // if you intend to display multiple ads, each ad you wish to display
  // should be given a unique adKey of your choosing.
  adController.populateAdView(adView, "demoAd");
}

Um anúncio relacionado à consulta em questão aparecerá na adView.

Como investigar erros

O SearchAdController exige um objeto AdListener com o método onAdLoaded() para notificar seu app de que os anúncios estão prontos para serem exibidos. Você também precisa implementar o método onAdFailedToLoad() para detectar e corrigir erros. Por exemplo, use o seguinte AdListener para depurar sua implementação:

AdListener adListener = new AdListener() {
    public void onAdLoaded() {
        // Called when an ad is loaded.
        Toast.makeText(MainActivity.this, "Ad Loaded",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Loaded");
    }

    public void onAdLeftApplication() {
        // Called when an ad leaves the application
        // (to go to the browser for example).
        Toast.makeText(MainActivity.this, "Ad Left Application",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Left Application");
    }

    @Override
    public void onAdFailedToLoad(int errorCode) {
        // Called when an ad request failed.
        Toast.makeText(MainActivity.this, "Ad Failed to Load: " + errorCode,
                Toast.LENGTH_SHORT).show();
        Log.e(MainActivity.class.getSimpleName(), "Ad Failed to Load: " +
                errorCode);
    }
};

As constantes usadas no método de callback onAdFailedToLoad() são definidas no AdListener.