Voraussetzungen
Schließen Sie die Einrichtung benutzerdefinierter Ereignisse ab.
Native Anzeige anfordern
Wenn die Werbebuchung des benutzerdefinierten Ereignisses in der abfolgebasierten Vermittlungskette erreicht wird, wirdthe loadNativeAd()
method für den Klassennamen aufgerufen, den Sie beim Erstellen eines benutzerdefinierten Ereignisses angegeben haben. In diesem Fall befindet sich diese Methode in SampleCustomEvent
, das dannthe loadNativeAd()
method in SampleNativeCustomEventLoader
aufruft.
Wenn Sie eine native Anzeige anfordern möchten, erstellen oder ändern Sie eine Klasse, die Adapter
erweitert, um loadNativeAd()
zu implementieren. Wenn bereits eine Klasse vorhanden ist, die Adapter
erweitert, musst du dort loadNativeAd()
implementieren. Erstellen Sie außerdem eine neue Klasse, um UnifiedNativeAdMapper
zu implementieren.
In unserem Beispiel für benutzerdefinierte Ereignisse implementiert SampleCustomEvent
the Adapter
interface und delegiert dann anSampleNativeCustomEventLoader
.
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleCustomEvent extends Adapter { private SampleNativeCustomEventLoader nativeLoader; @Override public void loadNativeAd( @NonNull MediationNativeAdConfiguration adConfiguration, @NonNull MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> callback) { nativeLoader = new SampleNativeCustomEventLoader(adConfiguration, callback); nativeLoader.loadAd(); } }
SampleNativeCustomEventLoader
ist für die folgenden Aufgaben verantwortlich:
Native Anzeige wird geladen
UnifiedNativeAdMapper
interfaceimplementierenCallbacks für Anzeigenereignisse empfangen und an das Google Mobile Ads SDK melden
Der auf der AdMob -Benutzeroberfläche definierte optionale Parameter ist in der Anzeigenkonfiguration enthalten. Der Parameter kann über adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD)
aufgerufen werden.
Dieser Parameter ist in der Regel eine Anzeigenblock-ID, die ein Werbenetzwerk-SDK beim Instanziieren eines Anzeigenobjekts benötigt.
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationNativeAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleNativeCustomEventLoader extends SampleNativeAdListener { /** Configuration for requesting the native ad from the third-party network. */ private final MediationNativeAdConfiguration mediationNativeAdConfiguration; /** Callback that fires on loading success or failure. */ private final MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> mediationAdLoadCallback; /** Callback for native ad events. */ private MediationNativeAdCallback nativeAdCallback; /** Constructor */ public SampleNativeCustomEventLoader( @NonNull MediationNativeAdConfiguration mediationNativeAdConfiguration, @NonNull MediationAdLoadCallback<MediationNativeAd, MediationNativeAdCallback> mediationAdLoadCallback) { this.mediationNativeAdConfiguration = mediationNativeAdConfiguration; this.mediationAdLoadCallback = mediationAdLoadCallback; } /** Loads the native ad from the third-party ad network. */ public void loadAd() { // Create one of the Sample SDK's ad loaders to request ads. Log.i("NativeCustomEvent", "Begin loading native ad."); SampleNativeAdLoader loader = new SampleNativeAdLoader(mediationNativeAdConfiguration.getContext()); // All custom events have a server parameter named "parameter" that returns // back the parameter entered into the UI when defining the custom event. String serverParameter = mediationNativeAdConfiguration .getServerParameters() .getString(MediationConfiguration .CUSTOM_EVENT_SERVER_PARAMETER_FIELD); Log.d("NativeCustomEvent", "Received server parameter."); loader.setAdUnit(serverParameter); // Create a native request to give to the SampleNativeAdLoader. SampleNativeAdRequest request = new SampleNativeAdRequest(); NativeAdOptions options = mediationNativeAdConfiguration.getNativeAdOptions(); if (options != null) { // If the NativeAdOptions' shouldReturnUrlsForImageAssets is true, the adapter should // send just the URLs for the images. request.setShouldDownloadImages(!options.shouldReturnUrlsForImageAssets()); request.setShouldDownloadMultipleImages(options.shouldRequestMultipleImages()); switch (options.getMediaAspectRatio()) { case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_LANDSCAPE: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_LANDSCAPE); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_PORTRAIT: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_PORTRAIT); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_SQUARE: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_ANY: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_UNKNOWN: default: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_ANY); } } loader.setNativeAdListener(this); // Begin a request. Log.i("NativeCustomEvent", "Start fetching native ad."); loader.fetchAd(request); } }
Je nachdem, ob die Anzeige erfolgreich abgerufen wurde oder ein Fehler auftritt, rufen Sie entweder onSuccess()
oder onFailure()
auf.
onSuccess()
wird durch Übergeben einer Instanz der Klasse aufgerufen, die MediationNativeAd
implementiert.
In der Regel werden diese Methoden innerhalb von Callbacks des Drittanbieter-SDKs implementiert, das Ihr Adapter implementiert. In diesem Beispiel enthält das Sample SDK einen SampleAdListener
mit relevanten Callbacks:
Java
@Override public void onNativeAdFetched(SampleNativeAd ad) { SampleUnifiedNativeAdMapper mapper = new SampleUnifiedNativeAdMapper(ad); mediationNativeAdCallback = mediationAdLoadCallback.onSuccess(mapper); } @Override public void onAdFetchFailed(SampleErrorCode errorCode) { mediationAdLoadCallback.onFailure(SampleCustomEventError.createSampleSdkError(errorCode)); }
Native Anzeigen zuordnen
Verschiedene SDKs haben ihre eigenen Formate für native Anzeigen. Ein Beispiel gibt Objekte zurück, die das Feld "title" enthalten, während ein anderer das Feld "headline" enthält. Außerdem können die Methoden zum Erfassen von Impressionen und Verarbeiten von Klicks von SDK zu SDK variieren.
UnifiedNativeAdMapper
dient dazu, diese Unterschiede auszugleichen und das native Anzeigenobjekt eines vermittelten SDKs an die vom Google Mobile Ads SDK erwartete Schnittstelle anzupassen. Benutzerdefinierte Ereignisse sollten diese Klasse erweitern, um eigene Mapper speziell für das vermittelte SDK zu erstellen. Hier sehen Sie einen Beispiel-Ad Mapper aus unserem
Beispielprojekt für benutzerdefinierte Ereignisse:
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.UnifiedNativeAdMapper; import com.google.android.gms.ads.nativead.NativeAd; ... public class SampleUnifiedNativeAdMapper extends UnifiedNativeAdMapper { private final SampleNativeAd sampleAd; public SampleUnifiedNativeAdMapper(SampleNativeAd ad) { sampleAd = ad; setHeadline(sampleAd.getHeadline()); setBody(sampleAd.getBody()); setCallToAction(sampleAd.getCallToAction()); setStarRating(sampleAd.getStarRating()); setStore(sampleAd.getStoreName()); setIcon( new SampleNativeMappedImage( ad.getIcon(), ad.getIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setAdvertiser(ad.getAdvertiser()); List<NativeAd.Image> imagesList = new ArrayList<NativeAd.Image>(); imagesList.add(new SampleNativeMappedImage(ad.getImage(), ad.getImageUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setImages(imagesList); if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); } Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras); setOverrideClickHandling(false); setOverrideImpressionRecording(false); setAdChoicesContent(sampleAd.getInformationIcon()); } @Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); } // The Sample SDK doesn't do its own impression/click tracking, instead relies on its // publishers calling the recordImpression and handleClick methods on its native ad object. So // there's no need to pass a reference to the View being used to display the native ad. If // your mediated network does need a reference to the view, the following method can be used // to provide one. @Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { super.trackViews(containerView, clickableAssetViews, nonClickableAssetViews); // If your ad network SDK does its own impression tracking, here is where you can track the // top level native ad view and its individual asset views. } @Override public void untrackView(View view) { super.untrackView(view); // Here you would remove any trackers from the View added in trackView. } }
Sehen wir uns nun den Konstruktorcode genauer an.
Verweis auf das vermittelte native Anzeigenobjekt
Der Konstruktor akzeptiert den Parameter SampleNativeAd
. Das ist die Klasse für native Anzeigen, die vom Beispiel-SDK für seine nativen Anzeigen verwendet wird. Der Mapper benötigt einen Verweis auf die vermittelte Anzeige, damit sie Klick- und Impressionsereignisse weiterleiten kann. SampleNativeAd
wird als lokale Variable gespeichert.
Zugeordnete Asset-Eigenschaften festlegen
Der Konstruktor verwendet das SampleNativeAd
-Objekt, um Assets im UnifiedNativeAdMapper
zu füllen.
Dieses Snippet ruft die Preisdaten der vermittelten Anzeige ab und verwendet sie, um den Preis des Kartografierers festzulegen:
Java
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
In diesem Beispiel speichert die vermittelte Anzeige den Preis als double
, währendAdMob für dasselbe Asset eine String
verwendet. Für die Verarbeitung dieser Conversion-Typen ist der Mapper verantwortlich.
Kartenbild-Assets
Das Zuordnen von Bild-Assets ist komplizierter als das Zuordnen von Datentypen wie double
oder String
. Bilder können automatisch heruntergeladen
oder als URL-Werte zurückgegeben werden. Auch ihre Pixel-zu-dpi-Skalierung können variieren.
Damit Sie diese Details verwalten können, stellt das Google Mobile Ads SDK die Klasse NativeAd.Image
bereit. Ähnlich wie beim Erstellen einer abgeleiteten Klasse von UnifiedNativeAdMapper
, um eine vermittelte native Anzeige zuzuordnen, sollten Sie beim Zuordnen von Bild-Assets auch eine Unterklasse von NativeAd.Image
erstellen.
Hier ein Beispiel für die Klasse SampleNativeMappedImage
des benutzerdefinierten Ereignisses:
Java
public class SampleNativeMappedImage extends NativeAd.Image { private Drawable drawable; private Uri imageUri; private double scale; public SampleNativeMappedImage(Drawable drawable, Uri imageUri, double scale) { this.drawable = drawable; this.imageUri = imageUri; this.scale = scale; } @Override public Drawable getDrawable() { return drawable; } @Override public Uri getUri() { return imageUri; } @Override public double getScale() { return scale; } }
Der SampleNativeAdMapper
verwendet seine zugeordnete Bildklasse in dieser Zeile, um das Symbolbild-Asset des Kartografen festzulegen:
Java
setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
Felder zum Extras-Set hinzufügen
Einige vermittelte SDKs bieten zusätzliche Assets alsAdMob natives Anzeigenformat. Die Klasse UnifiedNativeAdMapper
enthält eine setExtras()
-Methode, mit der diese Assets an Publisher übergeben werden. Der SampleNativeAdMapper
nutzt dies für das "Grad of Awesomeness"-Asset des Sample SDK:
Java
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
Verlage und Webpublisher können die Daten mit der Methode getExtras()
der NativeAd
-Klasse abrufen.
AdChoices
Über Ihr benutzerdefiniertes Ereignis wird mit der Methode setAdChoicesContent()
auf UnifiedNativeAdMapper
ein Datenschutzinfo-Symbol bereitgestellt. In diesem Snippet von SampleNativeAdMapper
ist zu sehen, wie Sie das Symbol „Datenschutzinfo“ einfügen können:
Java
public SampleNativeAdMapper(SampleNativeAd ad) { ... setAdChoicesContent(sampleAd.getInformationIcon()); }
Impressions- und Klickereignisse
Sowohl das Google Mobile Ads SDK als auch das vermittelte SDK müssen wissen, wann eine Impression oder ein Klick erfolgt. Allerdings muss nur ein SDK diese Ereignisse erfassen. Es gibt zwei unterschiedliche Ansätze für benutzerdefinierte Ereignisse, je nachdem, ob das vermittelte SDK das Tracking von Impressionen und Klicks selbst unterstützt.
Klicks und Impressionen mit dem Google Mobile Ads SDK erfassen
Wenn das vermittelte SDK kein eigenes Impressions- und Klick-Tracking ausführt, aber Methoden zum Erfassen von Klicks und Impressionen bietet, kann das Google Mobile Ads SDK diese Ereignisse erfassen und den Adapter benachrichtigen.
UnifiedNativeAdMapper
interface Es gibt zwei Methoden:recordImpression()
und handleClick()
benutzerdefinierte Ereignisse, die implementiert werden können, um die entsprechende Methode für das vermittelte native Anzeigenobjekt aufzurufen:
Java
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
Da SampleNativeAdMapper
einen Verweis auf das native Anzeigenobjekt des Sample SDK enthält, kann die entsprechende Methode für dieses Objekt aufgerufen werden, um einen Klick oder eine Impression zu erfassen. Für die Methode handleClick()
wird nur ein Parameter verwendet: das View
-Objekt, das dem Asset der nativen Anzeige entspricht, auf das der Klick erfolgte.
Klicks und Impressionen mit dem vermittelten SDK erfassen
Einige vermittelte SDKs bevorzugen möglicherweise die eigenständige Erfassung von Klicks und Impressionen. In diesem Fall sollten Sie das Standard-Tracking von Klicks und Impressionen überschreiben, indem Sie die folgenden beiden Aufrufe im Konstruktor Ihres UnifiedNativeAdMapper
-Objekts ausführen:
Java
setOverrideClickHandling(true); setOverrideImpressionRecording(true);
Benutzerdefinierte Ereignisse, die das Klick- und Impressions-Tracking überschreiben, sind erforderlich, um die onAdClicked()
- und onAdImpression()
-Ereignisse an das Google Mobile Ads SDK zu melden.
Damit Impressionen und Klicks erfasst werden können, benötigt das vermittelte SDK wahrscheinlich Zugriff auf die Datenansichten, um das Tracking zu aktivieren. Das benutzerdefinierte Ereignis sollte die Methode trackViews()
überschreiben und verwenden, um die Ansicht der nativen Anzeige für das Tracking an das vermittelte SDK zu übergeben. Das Beispiel-SDK aus unserem Beispielprojekt für benutzerdefinierte Ereignisse, aus dem die Code-Snippets dieses Leitfadens stammen, verwendet diesen Ansatz nicht. Wenn dies der Fall wäre, würde der benutzerdefinierte Ereigniscode in etwa so aussehen:
Java
@Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { sampleAd.setNativeAdViewForTracking(containerView); }
Wenn das vermittelte SDK das Tracking einzelner Assets unterstützt, kann es in clickableAssetViews
nachsehen, welche Ansichten anklickbar gemacht werden sollen. Diese Zuordnung ist an einen Asset-Namen in NativeAdAssetNames
gebunden. Das UnifiedNativeAdMapper
bietet eine entsprechende untrackView()
-Methode, die von benutzerdefinierten Ereignissen überschrieben werden kann, um alle Verweise auf die Ansicht freizugeben und ihre Verknüpfung zum nativen Anzeigenobjekt aufzuheben.
Vermittlungsereignisse an das Google Mobile Ads SDK weiterleiten
In der MediationNativeAdCallback
-Dokumentation finden Sie alle Callbacks, die von der Vermittlung unterstützt werden.
Über Ihr benutzerdefiniertes Ereignis müssen so viele dieser Callbacks wie möglich weitergeleitet werden, damit die entsprechenden Ereignisse vom Google Mobile Ads SDK an Ihre App gesendet werden. Hier ist ein Beispiel für die Verwendung von Callbacks:
Damit ist die Implementierung benutzerdefinierter Ereignisse für native Anzeigen abgeschlossen. Das vollständige Beispiel ist auf GitHub verfügbar.