Implementazione nativa AFS per Android

L'SDK Google Mobile Ads supporta anche gli stili di ricerca personalizzati. Se la tua app utilizza già l'SDK Google Mobile Ads, ti consigliamo di utilizzare la versione dell'SDK AFSMA.

Se esegui l'aggiornamento alla versione 19.0.0 o successiva dalla 18.1.0 o versione precedente, vedi la nostra guida alla migrazione.

Prerequisiti

Questa guida all'implementazione presuppone che tu conosca i seguenti aspetti:

Importa l'SDK nativo AFS

Aggiungi l'SDK

Per aggiungere l'SDK nativo AFS alla tua app:

Apri il file build.gradle all'interno della directory del modulo dell'applicazione. Aggiungi una nuova regola di compilazione in dependencies per la versione più recente dell'SDK:

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

Assicurati che l'elemento build.gradle di primo livello contenga un riferimento a google() repository maven { url "https://maven.google.com" }.

Segui queste istruzioni per includere il plug-in di corrispondenza delle versioni autonome di Google Play nel tuo progetto. L'applicazione di questo plug-in causa un errore di compilazione di Gradle quando l'SDK nativo AFS viene utilizzato con una versione incompatibile di Google Play Services, anziché consentire la compilazione dell'app, ma potenzialmente causando arresti anomali di runtime. In alternativa, applica il metodo failOnVersionConflict() ResolutionStrategy al tuo progetto per causare un errore di build quando versioni non compatibili di Google Play I servizi vengono utilizzati nel progetto. Salva le modifiche e fai clic su Sincronizza progetto con i file Gradle nella barra degli strumenti.

Utilizzare AndroidX anziché le librerie di supporto Android

A partire dalla versione 17.0.0 dell'SDK, la tua app deve utilizzare le librerie Jetpack (AndroidX) anziché le librerie di supporto Android. Requisiti di compatibilità:

  • Imposta com.android.tools.build:gradle su 3.2.1 o versioni successive.
  • Imposta compileSdkVersion su 28 o una data successiva.
  • Aggiorna l'app per utilizzare Jetpack (AndroidX); segui le istruzioni in Migrazione ad AndroidX.

Corsi

Per pubblicare annunci nativi AFS nella tua app, implementa le seguenti classi:

SearchAdController

  • Questa classe è responsabile della richiesta asincrona degli annunci, della loro memorizzazione nella cache, del recupero e del rendering.
  • Ogni contesto dell'annuncio richiede un SearchAdController separato. Ad esempio, se hai una schermata che mostra gli annunci insieme a un elenco di risultati di ricerca e un'altra schermata che mostra gli annunci insieme ai dettagli di un prodotto specifico, devi creare due istanze separate di SearchAdController, una per ogni caso.
  • Al costruttore devono essere forniti il codice della proprietà web (ID publisher), l'ID stile da applicare agli annunci restituito e SearchAdOptions. Il valore Context fornito nel costruttore deve essere Activity che contiene SearchAdController e in cui inserirà l'annuncio View.
  • Chiama loadAds per indicare una ricerca di un nuovo utente e avviare una richiesta di annunci asincrona. Tutti gli annunci caricati dalle chiamate precedenti a loadAds vengono cancellati dalla cache degli annunci interna quando viene effettuata una nuova chiamata.
  • Crea un View con createAdView per visualizzare le creatività degli annunci.
  • Una volta caricati gli annunci, chiama populateAdView con un View generato in precedenza con createAdView per visualizzare un annuncio memorizzato nella cache in quel View. Oltre alla sezione View che deve essere compilato, fornisci un adKey, una stringa arbitraria a a identificare in modo univoco l'annuncio. Ciò associa la creatività specifica dell'annuncio restituita da cache con quel adKey, in modo che quando lo stesso adKey viene passato a una chiamata futura a populateAdView, verrà restituito lo stesso annuncio. Ad esempio, se populateAdView viene richiamata per la prima volta con adKey="keyA" e restituisce una annuncio per le scarpe da trekking, ogni chiamata successiva a populateAdView con adKey="keyA" completerà lo stesso annuncio per le scarpe da trekking. (Quando effettui una nuova chiamata a loadAds cancella tutti gli annunci memorizzati nella cache e le chiavi annuncio associate.

SearchAdOptions

  • Passa questo oggetto al costruttore SearchAdController per personalizzare il modo in cui gli annunci vengono richiesti e visualizzati. Chiama build() con un SearchAdOptions.Builder per un oggetto SearchAdOptions.

View

  • Crea un oggetto View per contenere gli annunci chiamando createAdView() sul SearchAdController. Visualizza al massimo un annuncio alla volta, ma lo stesso View può possono essere riciclati per visualizzare annunci diversi nel tempo.

SearchAdRequest

  • Chiama il metodo loadAds su SearchAdController con un SearchAdRequest per avviare una richiesta di annuncio asincrona. Chiama build() su un SearchAdRequest.Builder per creare un oggetto SearchAdRequest.

AdListener

  • Implementa questa interfaccia e passala al costruttore SearchAdController per registrare i callback per diversi stati.
  • Nota: AdListener di callback non verranno chiamati in seguito a una richiesta annullata (una chiamata a loadAds prerilasciata da un'altra chiamata a loadAds prima della prima chiamata risolta).

Esempio di implementazione

L'esempio seguente mostra la creazione di un SearchAdController in un sampleActivity.

//  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 l'utente avvia una query, crea un SearchAdRequest e chiama loadAds su SearchAdController per avviare una richiesta di annuncio asincrona.

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

Implementa il tuo callback onAdLoaded per compilare un annuncio caricato in una visualizzazione dell'annuncio.

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

In adView verrà visualizzato un annuncio correlato alla query specificata.

Analisi degli errori

SearchAdController richiede un oggetto AdListener con il metodo onAdLoaded() per notificare all'app che gli annunci sono pronti per la visualizzazione. Dovresti inoltre implementare il metodo onAdFailedToLoad() in modo da poter rilevare e correggere gli errori. Ad esempio, puoi utilizzare il seguente AdListener per eseguire il debug dell'implementazione:

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

Costanti utilizzate nel metodo di callback onAdFailedToLoad() sono definite in AdListener.