Questa guida spiega come caricare un annuncio banner adattivo ancorato in un'app per Android.
Prerequisiti
- Completa la Guida introduttiva.
Esegui sempre i test con gli annunci di prova
Quando crei ed esegui test sulle tue app, assicurati di utilizzare annunci di prova anziché annunci di produzione live. In caso contrario, il tuo account potrebbe essere sospeso.
Il modo più semplice per caricare gli annunci di test è utilizzare il nostro ID unità pubblicitaria di test dedicato per i banner Android:
/21775744923/example/adaptive-banner
È stato configurato appositamente per restituire annunci di test per ogni richiesta e puoi utilizzarlo nelle tue app durante la codifica, il test e il debug. Assicurati solo di sostituirlo con il tuo ID unità pubblicitaria prima di pubblicare l'app.
Per saperne di più sul funzionamento degli annunci di test dell'SDK Next Gen Mobile Ads, consulta Attivare gli annunci di test.
Definisci la visualizzazione dell'annuncio
Layout XML
Aggiungi una visualizzazione al file XML del layout che funga da contenitore per l'annuncio banner adattivo ancorato:
<!-- Ad view container that fills the width of the screen and adjusts its
height to the content of the ad. -->
<FrameLayout
android:id="@+id/ad_view_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_alignParentBottom="true" />
Jetpack Compose
Il primo passaggio consiste nell'includere il modulo JetpackComposeDemo/compose-util. Questo modulo include helper per la composizione dell'oggetto
AdView
e degli asset.Passaggio 2: componi una classe
BannerAd
utilizzando il modulocompose-util
:
// Place the ad view at the bottom of the screen.
Column(modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
Box(modifier = modifier.fillMaxWidth()) { AdManagerBannerAd(adView, modifier) }
}
Caricare un annuncio
- Crea un oggetto
BannerAdRequest
con un ID unità pubblicitaria e una dimensione dell'annuncio adattabile ancorato. - Chiama il numero
BannerAd.load()
. - Aggiungi
BannerAd.getView()
alla gerarchia delle visualizzazioni.
Kotlin
import com.google.android.libraries.ads.mobile.sdk.banner.AdSize
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdEventCallback
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRefreshCallback
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError
class MainActivity : Activity() {
private var bannerAd: BannerAd? = null
private lateinit var binding: ActivityMainBinding
private lateinit var adSize: AdSize
private lateinit var bannerViewContainer: FrameLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 320 is a placeholder value. Replace 320 with your banner container width.
adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, 320)
// Give the banner container a placeholder height to avoid a sudden layout
// shifts when the ad loads.
bannerViewContainer = binding.bannerViewContainer
val bannerLayoutParams = bannerViewContainer.layoutParams
bannerLayoutParams.height = adSize.getHeightInPixels(requireContext())
bannerViewContainer.layoutParams = bannerLayoutParams
// Step 1 - Create a BannerAdRequest object with ad unit ID and size.
val adRequest = BannerAdRequest.Builder("/21775744923/example/adaptive-banner", adSize).build()
// Step 2 - Load the ad.
BannerAd.load(
adRequest,
object : AdLoadCallback<BannerAd> {
override fun onAdLoaded(ad: BannerAd) {
// Assign the loaded ad to the BannerAd object.
bannerAd = ad
// Step 3 - Call BannerAd.getView() to get the View and add it
// to view hierarchy on the UI thread.
activity?.runOnUiThread {
binding.bannerViewContainer.addView(ad.getView(requireActivity()))
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
bannerAd = null
}
},
)
}
}
Java
import com.google.android.libraries.ads.mobile.sdk.banner.AdSize;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdEventCallback;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRefreshCallback;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest;
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;
public class MainActivity extends AppCompatActivity {
private BannerAd bannerAd;
private ActivityMainBinding binding;
private AdSize adSize;
private FrameLayout bannerViewContainer;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// 320 is a placeholder value. Replace 320 with your banner container width.
adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, 320);
// Give the banner container a placeholder height to avoid a sudden layout
// shifts when the ad loads.
bannerViewContainer = binding.bannerViewContainer;
LayoutParams bannerLayoutParams = bannerViewContainer.getLayoutParams();
bannerLayoutParams.height = adSize.getHeightInPixels(this);
bannerViewContainer.setLayoutParams(bannerLayoutParams);
// Step 1 - Create a BannerAdRequest object with ad unit ID and size.
BannerAdRequest adRequest = new BannerAdRequest.Builder("/21775744923/example/adaptive-banner",
adSize).build();
// Step 2 - Load the ad.
BannerAd.load(
adRequest,
new AdLoadCallback<BannerAd>() {
@Override
public void onAdLoaded(@NonNull BannerAd ad) {
// Assign the loaded ad to the BannerAd object.
bannerAd = ad;
// Step 3 - Call BannerAd.getView() to get the View and add it
// to view hierarchy on the UI thread.
runOnUiThread(
() -> binding.bannerViewContainer.addView(ad.getView(MainActivity.this)));
}
@Override
public void onAdFailedToLoad(@NonNull LoadAdError adError) {
bannerAd = null;
}
});
}
}
Jetpack Compose
private suspend fun loadAdaptiveBannerAd(isPreviewMode: Boolean): BannerAd? =
suspendCoroutine { continuation ->
// Prevent loading the AdView if the app is in preview mode.
if (isPreviewMode) {
continuation.resume(null)
return@suspendCoroutine
}
// Request an anchored adaptive banner with a width of 360.
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(requireContext(), 360)
BannerAd.load(
BannerAdRequest.Builder(AD_UNIT_ID, adSize).build(),
object : AdLoadCallback<BannerAd> {
override fun onAdLoaded(ad: BannerAd) {
// Set an AdListener to receive callbacks for various ad events.
ad.adEventCallback =
object : BannerAdEventCallback {
override fun onAdImpression() {
Log.d(Constant.TAG, "Banner ad recorded an impression.")
}
override fun onAdClicked() {
Log.d(Constant.TAG, "Banner ad recorded a click.")
}
}
ad.bannerAdRefreshCallback =
object : BannerAdRefreshCallback {
override fun onAdRefreshed() {
showToast("Banner ad refreshed.")
Log.d(Constant.TAG, "Banner ad refreshed.")
}
override fun onAdFailedToRefresh(adError: LoadAdError) {
showToast("Banner ad failed to refresh.")
Log.w(Constant.TAG, "Banner ad failed to refresh: $adError")
}
}
showToast("Banner ad loaded.")
Log.d(Constant.TAG, "Banner ad loaded.")
continuation.resume(ad)
}
override fun onAdFailedToLoad(adError: LoadAdError) {
showToast("Banner failed to load.")
Log.w(Constant.TAG, "Banner ad failed to load: $adError")
continuation.resume(null)
}
},
)
}
Aggiornare un annuncio
Se hai configurato l'unità pubblicitaria in modo che venga aggiornata, non devi richiedere un altro annuncio quando il caricamento dell'annuncio non va a buon fine. L'SDK Google Mobile Ads rispetta qualsiasi frequenza di aggiornamento specificata nell'interfaccia utente di Ad Manager. Se non hai attivato l'aggiornamento, invia una nuova richiesta. Per maggiori dettagli sull'aggiornamento delle unità pubblicitarie, ad esempio l'impostazione di una frequenza di aggiornamento, consulta Frequenza di aggiornamento degli annunci nelle app mobile.
Rilasciare una risorsa annuncio
Quando hai finito di utilizzare un annuncio banner, puoi rilasciare le risorse dell'annuncio banner.
Per rilasciare la risorsa dell'annuncio, rimuovi l'annuncio dalla gerarchia di visualizzazione ed elimina tutti i relativi riferimenti:
Kotlin
// Remove banner from view hierarchy.
val parentView = adView?.parent
if (parentView is ViewGroup) {
parentView.removeView(adView)
}
// Destroy the banner ad resources.
adView?.destroy()
// Drop reference to the banner ad.
adView = null
Java
// Remove banner from view hierarchy.
if (adView.getParent() instanceof ViewGroup) {
((ViewGroup) adView.getParent()).removeView(adView);
}
// Destroy the banner ad resources.
adView.destroy();
// Drop reference to the banner ad.
adView = null;
Jetpack Compose
// Destroy the ad when the screen is disposed.
DisposableEffect(Unit) {
onDispose {
bannerAdState?.destroy()
}
}
Eventi annuncio
Puoi rilevare una serie di eventi nel ciclo di vita dell'annuncio, tra cui impressioni e clic, nonché apertura e chiusura dell'annuncio. Ti consigliamo di impostare il callback prima di mostrare il banner.Kotlin
BannerAd.load(
BannerAdRequest.Builder("/21775744923/example/adaptive-banner", adSize).build(),
object : AdLoadCallback<BannerAd> {
override fun onAdLoaded(ad: BannerAd) {
ad.adEventCallback =
object : BannerAdEventCallback {
override fun onAdImpression() {
// Banner ad recorded an impression.
}
override fun onAdClicked() {
// Banner ad recorded a click.
}
override fun onAdShowedFullScreenContent() {
// Banner ad showed.
}
override fun onAdDismissedFullScreenContent() {
// Banner ad dismissed.
}
override fun onAdFailedToShowFullScreenContent(
fullScreenContentError: FullScreenContentError
) {
// Banner ad failed to show.
}
}
}
// ...
}
)
Java
BannerAd.load(
new BannerAdRequest.Builder("/21775744923/example/adaptive-banner", adSize).build(),
new AdLoadCallback<BannerAd>() {
@Override
public void onAdLoaded(@NonNull BannerAd ad) {
ad.setAdEventCallback(new BannerAdEventCallback() {
@Override
public void onAdImpression() {
// Banner ad recorded an impression.
}
@Override
public void onAdClicked() {
// Banner ad recorded a click.
}
@Override
public void onAdShowedFullScreenContent() {
// Banner ad showed.
}
@Override
public void onAdDismissedFullScreenContent() {
// Banner ad dismissed.
}
@Override
public void onAdFailedToShowFullScreenContent(
@NonNull FullScreenContentError fullScreenContentError) {
// Banner ad failed to show.
}
});
// ...
}
});
Callback di aggiornamento degli annunci
BannerAdRefreshCallback
gestisce gli eventi di aggiornamento degli annunci se utilizzi l'aggiornamento automatico
per gli annunci banner. Assicurati di impostare il callback prima di aggiungere la visualizzazione dell'annuncio
alla gerarchia delle visualizzazioni. Per informazioni dettagliate sull'aggiornamento degli annunci, consulta
Aggiornare un annuncio.
Kotlin
BannerAd.load(
BannerAdRequest.Builder("/21775744923/example/adaptive-banner", adSize).build(),
object : AdLoadCallback<BannerAd> {
override fun onAdLoaded(ad: BannerAd) {
ad.bannerAdRefreshCallback =
object : BannerAdRefreshCallback {
// Set the ad refresh callbacks.
override fun onAdRefreshed() {
// Called when the ad refreshes.
}
override fun onAdFailedToRefresh(loadAdError: LoadAdError) {
// Called when the ad fails to refresh.
}
}
// ...
}
}
)
Java
BannerAd.load(
new BannerAdRequest.Builder("/21775744923/example/adaptive-banner", adSize).build(),
new AdLoadCallback<BannerAd>() {
@Override
public void onAdLoaded(@NonNull BannerAd ad) {
ad.setBannerAdRefreshCallback(
// Set the ad refresh callbacks.
new BannerAdRefreshCallback() {
@Override
public void onAdRefreshed() {
// Called when the ad refreshes.
}
@Override
public void onAdFailedToRefresh(@NonNull LoadAdError adError) {
// Called when the ad fails to refresh.
}
});
// ...
}
});
Accelerazione hardware per gli annunci video
Affinché gli annunci video vengano visualizzati correttamente nelle visualizzazioni degli annunci banner, l'accelerazione hardware deve essere attivata.
L'accelerazione hardware è abilitata per impostazione predefinita, ma alcune app potrebbero scegliere di disattivarla. Se questo vale per la tua app, ti consigliamo di attivare l'accelerazione hardware per le classi Activity
che utilizzano gli annunci.
Attivare l'accelerazione hardware
Se la tua app non si comporta correttamente con l'accelerazione hardware attivata
a livello globale, puoi controllarla anche per singole attività. Per attivare o disattivare l'accelerazione hardware, puoi utilizzare l'attributo android:hardwareAccelerated
per gli elementi <application>
e <activity>
nel file AndroidManifest.xml
. L'esempio seguente attiva l'accelerazione
hardware per l'intera app, ma la disattiva per un'attività:
<application android:hardwareAccelerated="true">
<!-- For activities that use ads, hardwareAcceleration should be true. -->
<activity android:hardwareAccelerated="true" />
<!-- For activities that don't use ads, hardwareAcceleration can be false. -->
<activity android:hardwareAccelerated="false" />
</application>
Per ulteriori informazioni sulle opzioni di controllo dell'accelerazione hardware, consulta la guida all'accelerazione hardware. Tieni presente che le visualizzazioni dei singoli annunci non possono essere attivate per l'accelerazione hardware se l'attività è disattivata, pertanto l'accelerazione hardware deve essere attivata per l'attività stessa.
Scarica ed esegui l'app di esempio che mostra l'utilizzo dell'SDK Google Mobile Ads di nuova generazione.