Implementación nativa de AFS para Android

El SDK de anuncios de Google para dispositivos móviles también admite estilos del anuncio de búsqueda personalizados. Si tu app ya usa el SDK de anuncios de Google para dispositivos móviles, te recomendamos que uses la versión del SDK de AFSMA en su lugar.

Si actualizas a la versión 19.0.0 o una posterior desde la versión 18.1.0 o una anterior, consulta nuestra guía de migración.

Requisitos previos

En esta guía de implementación, se supone que estás familiarizado con los siguientes elementos:

Importa el SDK nativo de AFS

Cómo agregar el SDK

Para agregar el SDK nativo de AFS a tu app, haz lo siguiente:

Abre el archivo build.gradle dentro del directorio del módulo de tu aplicación. Agrega una nueva regla de compilación en dependencies para la versión más reciente del SDK:

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

Asegúrate de que tu build.gradle de nivel superior contenga una referencia al repositorio google() o maven { url "https://maven.google.com" }.

Sigue estas instrucciones para incluir el complemento de comparador de versiones independientes de Google Play en tu proyecto. Aplicar este complemento provoca un error de compilación de Gradle cuando se usa el SDK nativo de AFS con una versión incompatible de los Servicios de Google Play, en lugar de permitir que la app se compile, pero puede causar fallas en el tiempo de ejecución. También puedes aplicar la ResolutionStrategy de failOnVersionConflict() a tu proyecto para causar un error de compilación cuando se usen versiones incompatibles de los Servicios de Google Play en tu proyecto. Guarda los cambios y haz clic en Sync Project with Gradle Files en la barra de herramientas.

Cómo usar AndroidX en lugar de las bibliotecas de compatibilidad de Android

A partir de la versión 17.0.0 del SDK, tu app debe usar las bibliotecas de Jetpack (AndroidX) en lugar de las bibliotecas de compatibilidad de Android. Requisitos de compatibilidad:

  • Configura com.android.tools.build:gradle como 3.2.1 o una versión posterior.
  • Establece compileSdkVersion en 28 o una versión posterior.
  • Actualiza tu app para usar Jetpack (AndroidX). Sigue las instrucciones que se indican en Cómo migrar a AndroidX.

Clases

Para publicar anuncios nativos de AFS en tu app, implementa las siguientes clases:

SearchAdController

  • Esta clase se encarga de solicitar anuncios de forma asíncrona, almacenarlos en caché, recuperarlos y renderizarlos.
  • Cada contexto de anuncio necesita un objeto SearchAdController independiente; por ejemplo, si tienes una pantalla que muestra anuncios junto con una lista de resultados de la búsqueda y otra que muestra anuncios junto con los detalles de un producto específico, debes crear dos instancias separadas de SearchAdController, una para cada caso.
  • Se le debe proporcionar al constructor tu código de propiedad web (ID de publicador), ID de estilo para aplicar a los anuncios que se muestran y SearchAdOptions. El Context proporcionado en el constructor debe ser el Activity que contiene el SearchAdController y donde colocarás el View del anuncio.
  • Llama a loadAds para indicar una búsqueda de usuario nuevo y, luego, inicia una solicitud de anuncio asíncrona. Todos los anuncios cargados desde llamadas anteriores a loadAds se borran de la caché de anuncios interna cuando se realiza una llamada nueva.
  • Crea un View con createAdView para mostrar creatividades de anuncios.
  • Una vez que se carguen los anuncios, llama a populateAdView con un View generado anteriormente con createAdView para renderizar un anuncio almacenado en caché en ese View. Además del View que se propagará, proporciona un adKey, una cadena arbitraria para identificar el anuncio de manera única. Esto asocia la creatividad del anuncio específica que se muestra de la caché con ese adKey, de modo que, cuando se pase el mismo adKey a una llamada futura a populateAdView, se mostrará el mismo anuncio. Por ejemplo, si se llama a populateAdView por primera vez con adKey="keyA" y se renderiza un anuncio para botas de excursionismo, cada llamada posterior a populateAdView con adKey="keyA" propagará el mismo anuncio para botas de excursionismo. (Si se realiza una llamada nueva a loadAds, se borrarán todos los anuncios almacenados en caché y las claves de anuncios asociadas).

SearchAdOptions

  • Pasa este objeto al constructor SearchAdController para personalizar la forma en que se solicitan y muestran los anuncios. Llama a build() en un SearchAdOptions.Builder para crear un objeto SearchAdOptions.

View

  • Llama a createAdView() en SearchAdController para crear un objeto View que contenga anuncios. Muestra, como máximo, un anuncio a la vez, pero se puede reciclar el mismo View para mostrar diferentes anuncios a lo largo del tiempo.

SearchAdRequest

  • Llama al método loadAds en SearchAdController con un SearchAdRequest para iniciar una solicitud de anuncio asíncrona. Llama a build() en un SearchAdRequest.Builder para crear un objeto SearchAdRequest.

AdListener

  • Implementa esta interfaz y pásala al constructor SearchAdController para registrar devoluciones de llamada para varios estados.
  • Nota: No se realizarán devoluciones de llamada AdListener en una solicitud cancelada (una llamada a loadAds que se interrumpió con otra llamada a loadAds antes de que se resuelva la primera llamada).

Ejemplo de implementación

En el siguiente ejemplo, se muestra cómo crear un SearchAdController en una Activity de muestra.

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

Cuando el usuario inicie una consulta, crea un SearchAdRequest y llama a loadAds en el SearchAdController para iniciar una solicitud de anuncio asíncrona.

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

Implementa la devolución de llamada onAdLoaded para propagar un anuncio cargado en una vista de anuncio.

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

Un anuncio relacionado con la búsqueda especificada ahora aparecerá en adView.

Investiga errores

SearchAdController requiere un objeto AdListener con el método onAdLoaded() para notificar a tu app que los anuncios están listos para mostrarse. También debes implementar el método onAdFailedToLoad() para detectar y corregir errores. Por ejemplo, puedes usar el siguiente AdListener para depurar tu implementación:

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

Las constantes usadas en el método de devolución de llamada onAdFailedToLoad() se definen en AdListener.