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. Se o app já usa o SDK dos anúncios para dispositivos móveis do Google, recomendamos usar a versão do SDK da AFSMA.

Para atualizar a partir da versão 19.0.0 ou anterior, consulte nosso guia de migração.

Pré-requisitos

Este guia de implementação pressupõe que você tenha familiaridade 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 no diretório do módulo do app. 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.1.0'
}

Verifique se o build.gradle de nível superior contém uma referência ao google() ou para 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 projeto. A aplicação deste 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 crie, mas pode causar falhas no tempo de execução. Ou aplique o failOnVersionConflict() ResolutionStrategy ao seu projeto para causar um erro de build quando versões incompatíveis do Google Play Os serviços são usados no seu projeto. 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, o app precisa usar o Jetpack (AndroidX). Bibliotecas em vez de 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.
  • Atualizar o app para usar o Jetpack (AndroidX). siga as instruções Como migrar para o AndroidX.

Classes

Para veicular anúncios nativos do AFS no seu aplicativo, 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 separado. por exemplo, se você têm uma tela que exibe anúncios ao lado de uma lista de resultados de pesquisa e outra que mostra anúncios e detalhes de um produto específico, criar 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 a ser aplicado aos anúncios retornados e SearchAdOptions. O Context fornecido no construtor precisa ser o Activity que contém o SearchAdController e onde você vai colocar o View do anúncio.
  • Chame loadAds para indicar uma nova pesquisa de usuário e iniciar uma solicitação de anúncio assíncrona. Todos os anúncios carregados de chamadas anteriores para loadAds são excluídos do cache interno de anúncios quando uma nova chamada é feita.
  • Crie um View com createAdView para mostrar 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 em cache nesse View. Além da seção View que será preenchido, forneça um adKey, uma string arbitrária para identifiquem o anúncio de maneira exclusiva. Isso associa o criativo de anúncio específico retornado o cache com esse adKey. Assim, quando o mesmo adKey for transmitido para uma chamada futura, para populateAdView, o mesmo anúncio será retornado. Por exemplo, se populateAdView for chamado pela primeira vez com adKey="keyA" e renderizar um anúncio para botas de caminhada, cada chamada subsequente para populateAdView com adKey="keyA" vai preencher o mesmo anúncio para botas de caminhada. Fazer uma nova chamada para loadAds limpa todos os anúncios em cache e as chaves de anúncio 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 crie um objeto SearchAdOptions.

View

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

SearchAdRequest

  • Chame o método loadAds no SearchAdController com um SearchAdRequest para iniciar uma solicitação de anúncio assíncrona. Chamar 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: os 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 um Activity de exemplo.

//  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. no 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 seu callback onAdLoaded para preencher um anúncio carregado em uma visualização de anúncio.

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 específica vai aparecer no adView.

Como investigar erros

O SearchAdController exige um objeto AdListener com o onAdLoaded(). para notificar seu app de que os anúncios estão prontos para exibição. Também é necessário implementar o método onAdFailedToLoad() para detectar e corrigir erros. Por exemplo, use o AdListener a seguir para depurar seu 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);
    }
};

Constantes usadas no método de callback onAdFailedToLoad() são definidos no AdListener.