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 invece la versione dell'SDK AFSMA.
Se esegui l'upgrade alla versione 19.0.0 o successiva dalla 18.1.0 o da una versione precedente, consulta la nostra guida alla migrazione.
Prerequisiti
Questa guida all'implementazione presuppone la conoscenza di quanto segue:
- Annunci associati alla ricerca personalizzata di AdSense con stili personalizzati degli annunci associati ai risultati di ricerca.
- Sviluppo di app Android
Importa l'SDK nativo AFS
Aggiungi l'SDK
Per aggiungere l'SDK nativo AFS alla tua app:
Apri il file build.gradle
nella directory del modulo dell'applicazione.
Aggiungi una nuova regola di build in dependencies
per l'ultima versione dell'SDK:
dependencies {
implementation 'com.google.android.gms:play-services-afs-native:19.0.3'
}
Assicurati che l'elemento build.gradle
di primo livello contenga un riferimento al repository google()
o a maven { url "https://maven.google.com" }
.
Segui queste istruzioni
per includere il plug-in di corrispondenza della versione autonoma di Google Play nel tuo progetto.
L'applicazione di questo plug-in causa un errore di build Gradle quando l'SDK nativo di AFS viene utilizzato con una versione incompatibile di Google Play Services anziché consentire la creazione dell'app, ma potrebbe causare arresti anomali di runtime. In alternativa, applica la failOnVersionConflict()
ResolutionStrategy al progetto per causare un errore di build quando nel progetto vengono utilizzate versioni incompatibili di Google Play Services.
Salva le modifiche e fai clic su Sincronizza progetto con file Gradle nella barra degli strumenti.
Usare AndroidX anziché le librerie di assistenza Android
A partire dalla versione 17.0.0
dell'SDK, la tua app deve utilizzare le librerie Jetpack (AndroidX) anziché le librerie di assistenza Android. Requisiti di compatibilità:
- Imposta
com.android.tools.build:gradle
sulla versione 3.2.1 o successiva. - Imposta
compileSdkVersion
su 28 o su una data successiva. - Aggiorna l'app per utilizzare Jetpack (AndroidX). Segui le istruzioni riportate in Migrazione ad AndroidX.
Corsi
Per pubblicare annunci nativi AFS nella tua app, implementa le seguenti classi:
- Questa classe è responsabile delle richieste di annunci in modo asincrono, della memorizzazione nella cache e del recupero degli annunci, nonché del rendering degli annunci.
- Ogni contesto dell'annuncio richiede un
SearchAdController
distinto; ad esempio, se disponi di una schermata che mostra gli annunci accanto 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 diSearchAdController
, una per ogni caso. - Al costruttore devono essere forniti il tuo codice proprietà web (ID publisher),
ID stile da applicare agli
annunci restituiti e
SearchAdOptions
. IlContext
fornito nel costruttore deve essereActivity
, che contieneSearchAdController
e dove posizionerai l'annuncioView
. - Richiama
loadAds
per indicare la ricerca di un nuovo utente e avvia una richiesta di annuncio asincrona. Quando viene effettuata una nuova chiamata, tutti gli annunci caricati dalle chiamate precedenti aloadAds
vengono cancellati dalla cache degli annunci interna. - Crea un
View
concreateAdView
per le creatività degli annunci display. - Dopo aver caricato gli annunci, chiama
populateAdView
con unView
generato in precedenza concreateAdView
per visualizzare un annuncio memorizzato nella cache in quelView
. Oltre all'elementoView
che deve essere compilato, fornisci una stringaadKey
, ovvero una stringa arbitraria per identificare in modo univoco l'annuncio. In questo modo, la creatività annuncio specifica restituita dalla cache viene associata a questoadKey
; in questo modo, quando lo stessoadKey
viene passato a una chiamata futura apopulateAdView
, verrà restituito lo stesso annuncio. Ad esempio, sepopulateAdView
viene chiamato per la prima volta conadKey="keyA"
e visualizza un annuncio relativo a scarponi da trekking, ogni chiamata successiva apopulateAdView
conadKey="keyA"
completerà lo stesso annuncio per le scarpe da trekking. Se effettui una nuova chiamata aloadAds
, tutti gli annunci memorizzati nella cache e le chiavi annuncio associate vengono cancellati.
- Passa questo oggetto al costruttore
SearchAdController
per personalizzare la modalità di richiesta e visualizzazione degli annunci. Richiamabuild()
su unSearchAdOptions.Builder
per creare un oggettoSearchAdOptions
.
View
- Crea un oggetto
View
per sospendere gli annunci chiamandocreateAdView()
sulSearchAdController
. Mostra al massimo un annuncio alla volta, ma lo stessoView
può essere riciclato per pubblicare annunci diversi nel tempo.
- Chiama il metodo
loadAds
sulSearchAdController
con unSearchAdRequest
per avviare una richiesta di annuncio asincrona. Chiamabuild()
su unSearchAdRequest.Builder
per creare un oggettoSearchAdRequest
.
- Implementa questa interfaccia e passala al costruttore
SearchAdController
per registrare i callback per diversi stati. - Nota: i callback
AdListener
non verranno chiamati in caso di richiesta annullata (una chiamata al numeroloadAds
che è stata prerilasciata da un'altra chiamata al numeroloadAds
prima della risoluzione della prima chiamata).
Esempio di implementazione
L'esempio seguente mostra la creazione di un elemento SearchAdController
in un Activity
di esempio.
// 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
sul 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 callback onAdLoaded
per completare un annuncio caricato in una visualizzazione 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");
}
Un annuncio correlato alla query specificata verrà ora visualizzato nel adView
.
Analisi degli errori
SearchAdController
richiede un oggetto AdListener
con il metodo onAdLoaded()
per comunicare alla tua app che gli annunci sono pronti per essere mostrati. Dovresti anche implementare il metodo onAdFailedToLoad()
per poter rilevare e correggere gli errori.
Ad esempio, potresti 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);
}
};
Le costanti utilizzate nel metodo di callback onAdFailedToLoad()
sono definite in AdListener.