Benutzerdefinierte Ereignisse für native Anzeigen

Vorbereitung

Schließen Sie die Einrichtung benutzerdefinierter Ereignisse ab.

Native Anzeige anfordern

Wenn die benutzerdefinierte Ereignis-Werbebuchung in der Vermittlungskette der Vermittlungsabfolge erreicht ist, Die Methode loadNativeAd() wird für den Klassennamen aufgerufen, den Sie angegeben haben, als Erstellen eines benutzerdefinierten . In diesem Fall befindet sich diese Methode in SampleCustomEvent, wodurch die Methode loadNativeAd() in SampleNativeCustomEventLoader.

Wenn Sie eine native Anzeige anfordern möchten, erstellen oder ändern Sie eine Klasse, die Adapter auf loadNativeAd() implementieren. Wenn bereits eine Klasse vorhanden ist, die Adapter erweitert, loadNativeAd() dort implementieren. Erstellen Sie außerdem eine neue Klasse, die implementiert werden soll. UnifiedNativeAdMapper

In unserem Beispiel für benutzerdefinierte Ereignisse SampleCustomEvent erweitert die Adapter-Klasse und delegiert dann SampleNativeCustomEventLoader

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:

  • Die native Anzeige wird geladen.

  • Klasse UnifiedNativeAdMapper implementieren

  • Empfangen und Melden von Callbacks für Anzeigenereignisse an das Google Mobile Ads SDK

Der optionale Parameter auf der Ad Manager-Benutzeroberfläche ist die in der Anzeigenkonfiguration enthalten sind. Der Zugriff auf den Parameter ist über adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD) Dieser Parameter ist in der Regel eine Anzeigenblock-ID, die vom SDK eines Werbenetzwerks beim Instanziieren eines Anzeigenobjekts erforderlich ist.

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() onSuccess() wird aufgerufen, indem eine Instanz der Klasse übergeben wird, die MediationNativeAd.

Üblicherweise werden diese Methoden innerhalb von Callbacks aus dem Drittanbieter-SDK Ihres Adapters. In diesem Beispiel enthält das Beispiel-SDK hat ein 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

Die verschiedenen SDKs haben eigene Formate für native Anzeigen. Jemand könnte zurückkehren Objekte, die einen „title“ enthalten während ein anderes Feld „headline“. Außerdem werden die Methoden, mit denen Impressionen nachverfolgt und verarbeitet werden, Die Anzahl der Klicks kann von SDK zu SDK variieren.

Der UnifiedNativeAdMapper ist für den Ausgleich dieser Unterschiede verantwortlich und das native Anzeigenobjekt eines vermittelten SDKs an die von das Google Mobile Ads SDK. Benutzerdefinierte Ereignisse sollten diese Klasse erweitern, um eigenen Kartografen, die für ihr vermitteltes SDK spezifisch sind. Hier sehen Sie ein Beispiel für unser Beispielprojekt für ein benutzerdefiniertes Ereignis:

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, die verwendete native Anzeigenklasse. für die nativen Anzeigen berücksichtigt werden. Der Kartograf benötigt einen Verweis auf die vermittelte Anzeige, damit sie Klick- und Impressionsereignisse weitergeben kann. SampleNativeAd ist als lokale Variable gespeichert.

Eigenschaften eines zugeordneten Assets festlegen

Der Konstruktor verwendet das SampleNativeAd-Objekt, um Assets im UnifiedNativeAdMapper.

Dieses Snippet ruft die Preisdaten der vermittelten Anzeige ab und legt damit die Preis:

Java

if (sampleAd.getPrice() != null) {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    String priceString = formatter.format(sampleAd.getPrice());
    setPrice(priceString);
}

In diesem Beispiel wird der Preis in der vermittelten Anzeige als double gespeichert, während In Ad Manager wird ein String für dasselbe Asset verwendet. Die Mapper ist für die Verarbeitung dieser Konvertierungstypen verantwortlich.

Kartenbild-Assets

Das Zuordnen von Bild-Assets ist komplizierter als das Zuordnen von Datentypen wie double oder String. Bilder werden möglicherweise automatisch heruntergeladen oder werden als URL-Werte zurückgegeben. Ihre Pixel-zu-dpi-Skalen können ebenfalls variieren.

Damit Sie diese Informationen leichter verwalten können, stellt das Google Mobile Ads SDK Folgendes bereit: Klasse NativeAd.Image. Ähnlich wie bei der Erstellung einer Unterklasse von UnifiedNativeAdMapper, um eine vermittelte native Anzeige zuzuordnen, sollten Sie auch eine von NativeAd.Image beim Zuordnen von Bild-Assets verwendet wird.

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

SampleNativeAdMapper verwendet die zugeordnete Bildklasse in dieser Zeile, um den Wert für Symbol-Bild-Asset des Kartografen:

Java

setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(),
    SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));

Felder zum Extras-Bundle hinzufügen

Einige vermittelte SDKs bieten zusätzliche Assets, die über die in der natives Ad Manager-Anzeigenformat. Das UnifiedNativeAdMapper enthält eine setExtras()-Methode, mit der diese Assets an Verlagen und Webpublishern. Der SampleNativeAdMapper nutzt diesen Wert für die „Grad an Tollität“ Asset:

Java

Bundle extras = new Bundle();
extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness());
this.setExtras(extras);

Verlage und Webpublisher können die Daten mithilfe der Klasse NativeAd abrufen. getExtras() .

Datenschutzinfo

Ihr benutzerdefiniertes Ereignis ist für die Bereitstellung eines Datenschutzinfo-Symbols mithilfe des Ereignisses Methode setAdChoicesContent() für UnifiedNativeAdMapper. Hier ist ein Ausschnitt aus SampleNativeAdMapper zeigt, wie das Datenschutzinfo-Symbol bereitgestellt wird:

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, Impressionen oder Klicks erfolgen, aber diese Ereignisse müssen nur von einem SDK erfasst werden. Es stehen für zwei verschiedene Ansätze für benutzerdefinierte Ereignisse, Vermitteltes SDK unterstützt das eigenständige Tracking von Impressionen und Klicks.

Klicks und Impressionen mit dem Google Mobile Ads SDK erfassen

Wenn das vermittelte SDK kein eigenes Impressions- und Klick-Tracking ausführt, Methoden zur Erfassung von Klicks und Impressionen zur Verfügung stellt, können Sie mit dem Google Mobile Ads SDK verfolgen Sie diese Ereignisse und benachrichtigen Sie den Adapter. Die Die UnifiedNativeAdMapper-Klasse enthält zwei Methoden: recordImpression() und handleClick(), die können benutzerdefinierte Ereignisse implementieren, um die entsprechende Methode natives Anzeigenobjekt:

Java

@Override
public void recordImpression() {
  sampleAd.recordImpression();
}

@Override
public void handleClick(View view) {
  sampleAd.handleClick(view);
}

Da SampleNativeAdMapper einen Verweis auf die native Anzeige des Beispiel-SDK enthält, Anzeigenobjekt kann es die entsprechende Methode für dieses Objekt aufrufen, um einen Klick oder eine Impression erzielen. Beachten Sie, dass die Methode handleClick() Einzelner Parameter: das View-Objekt, das dem Asset der nativen Anzeige entspricht, das den Klick erhalten hat.

Klicks und Impressionen mit dem vermittelten SDK erfassen

Einige vermittelte SDKs möchten Klicks und Impressionen möglicherweise selbst erfassen. In in diesem Fall das standardmäßige Klick- und Impressions-Tracking überschreiben, die folgenden beiden Aufrufe im Konstruktor Ihres UnifiedNativeAdMapper:

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

Benutzerdefinierte Ereignisse, die das Klick- und Impressions-Tracking überschreiben, onAdClicked()- und onAdImpression()-Ereignisse an Google Mobile melden Ads SDK.

Für das Tracking von Impressionen und Klicks benötigt das vermittelte SDK wahrscheinlich Zugriff auf den Ansichten, um das Tracking zu aktivieren. Das benutzerdefinierte Ereignis sollte trackViews() und verwenden Sie sie, um den Aufruf der nativen Anzeige an die vermittelte Anzeige zu übergeben. SDK, das erfasst werden soll. Das Beispiel-SDK aus unserem Beispielprojekt für benutzerdefinierte Ereignisse (aus dem Code-Snippets dieses Leitfadens verwendet wurden, verwendet diesen Ansatz nicht. Wenn aber würde der benutzerdefinierte Ereigniscode ungefähr 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 clickableAssetViews, um zu sehen, welche Ansichten anklickbar sein sollen. Diese Karte ist mit einem Asset-Namen in NativeAdAssetNames. Das UnifiedNativeAdMapper bietet eine entsprechende untrackView()-Methode, die von benutzerdefinierten Ereignissen überschrieben werden kann. um alle Verweise auf den Aufruf freizugeben und seine Verknüpfung mit der nativen Anzeige zu trennen. -Objekt enthält.

Vermittlungsereignisse an das Google Mobile Ads SDK weiterleiten

Alle Callbacks, die von der Vermittlung unterstützt werden, finden Sie in der MediationNativeAdCallback Dokumente.

Es ist wichtig, dass Ihr benutzerdefiniertes Ereignis so viele dieser Callbacks weiterleitet wie damit Ihre App diese äquivalenten Ereignisse vom Google Mobile Ads SDK. Hier ist ein Beispiel für die Verwendung von Callbacks:

Damit ist die Implementierung der benutzerdefinierten Ereignisse für native Anzeigen abgeschlossen. Vollständiges Beispiel ist verfügbar auf GitHub