Benutzerdefinierte Ereignisse für native Anzeigen

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 SampleNativeCustomEventLoaderaufruft.

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 SampleCustomEventthe 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 interfaceimplementieren

  • Callbacks 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.