Peristiwa kustom iklan native

Prasyarat

Selesaikan penyiapan peristiwa kustom.

Meminta iklan native

Saat item baris peristiwa kustom dijangkau dalam rantai mediasi waterfall, Metode loadNativeAd() dipanggil pada nama class yang Anda berikan saat membuat peristiwa. Dalam kasus ini, metode tersebut berada di SampleCustomEvent, yang kemudian memanggil metode loadNativeAd() di SampleNativeCustomEventLoader.

Untuk meminta iklan native, buat atau ubah class yang memperluas Adapter ke mengimplementasikan loadNativeAd(). Jika class yang memperluas Adapter sudah ada, menerapkan loadNativeAd() di sana. Selain itu, buat class baru untuk mengimplementasikan UnifiedNativeAdMapper.

Dalam contoh peristiwa kustom kami, SampleCustomEvent memperluas class Adapter lalu didelegasikan ke 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 bertanggung jawab atas tugas berikut:

  • Memuat iklan native.

  • Mengimplementasikan class UnifiedNativeAdMapper.

  • Menerima dan melaporkan callback peristiwa iklan ke Google Mobile Ads SDK.

Parameter opsional yang ditentukan di UI Ad Manager adalah disertakan dalam konfigurasi iklan. Parameter ini dapat diakses melalui adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD). Parameter ini biasanya merupakan ID unit iklan yang digunakan SDK jaringan iklan saat membuat instance objek iklan.

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

Bergantung pada apakah iklan berhasil diambil atau mengalami error, Anda akan memanggil onSuccess() atau onFailure(). onSuccess() dipanggil dengan meneruskan instance class yang mengimplementasikan MediationNativeAd.

Biasanya, metode ini diimplementasikan dalam callback dari SDK pihak ketiga yang diterapkan adaptor Anda. Untuk contoh ini, SDK Sampel memiliki SampleAdListener dengan callback yang relevan:

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

Memetakan iklan native

SDK yang berbeda memiliki format unik untuk iklan native. Satu mungkin kembali objek yang berisi "judul" Misalnya, sementara yang lain mungkin memiliki "judul". Selain itu, metode yang digunakan untuk melacak tayangan dan memproses klik dapat bervariasi dari satu SDK ke SDK lainnya.

UnifiedNativeAdMapper bertanggung jawab untuk menyesuaikan perbedaan ini dan mengadaptasi objek iklan bawaan SDK yang dimediasi agar cocok dengan antarmuka yang diharapkan oleh Google Mobile Ads SDK. Peristiwa kustom harus memperluas class ini untuk membuat mapper mereka sendiri khusus untuk SDK yang dimediasi. Berikut adalah contoh mapper iklan dari contoh proyek peristiwa khusus kita:

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

Sekarang kita akan mempelajari kode konstruktor lebih lanjut.

Menyimpan referensi ke objek iklan native yang dimediasi

Konstruktor menerima parameter SampleNativeAd, class iklan native yang digunakan oleh SDK Sampel untuk iklan native-nya. Mapper membutuhkan referensi ke yang dimediasi agar dapat meneruskan peristiwa klik dan tayangan iklan. SampleNativeAd sama dengan disimpan sebagai variabel lokal.

Menetapkan properti aset yang dipetakan

Konstruktor menggunakan objek SampleNativeAd untuk mengisi aset di UnifiedNativeAdMapper.

Cuplikan ini mendapatkan data harga iklan yang dimediasi dan menggunakannya untuk menetapkan harga harga:

Java

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

Dalam contoh ini, iklan yang dimediasi menyimpan harga sebagai double, sedangkan Ad Manager menggunakan String untuk aset yang sama. Tujuan mapper bertanggung jawab untuk menangani jenis konversi ini.

Memetakan aset gambar

Memetakan aset gambar lebih rumit daripada memetakan tipe data seperti double atau String. Gambar mungkin didownload secara otomatis atau ditampilkan sebagai nilai URL. Skala piksel ke dpi juga dapat bervariasi.

Untuk membantu Anda mengelola detail ini, Google Mobile Ads SDK menyediakan Class NativeAd.Image. Dengan cara yang sama seperti saat Anda perlu membuat subclass dari UnifiedNativeAdMapper untuk memetakan iklan native yang dimediasi, Anda juga harus membuat dari NativeAd.Image saat memetakan aset gambar.

Berikut adalah contoh class SampleNativeMappedImage peristiwa kustom:

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 menggunakan class gambar yang dipetakan di baris ini untuk menyetel aset gambar ikon mapper:

Java

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

Menambahkan kolom ke Paket ekstra

Beberapa SDK yang dimediasi menyediakan aset tambahan di luar yang ada di Format iklan native Ad Manager. UnifiedNativeAdMapper menyertakan metode setExtras() yang digunakan untuk meneruskan aset ini ke penerbit. SampleNativeAdMapper menggunakan ini untuk SDK Sampel "tingkat kedahsyatan" aset:

Java

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

Penayang dapat mengambil data menggunakan class NativeAd getExtras() .

AdChoices

Peristiwa kustom Anda bertanggung jawab untuk menyediakan ikon AdChoices menggunakan Metode setAdChoicesContent() pada UnifiedNativeAdMapper. Berikut ini cuplikan dari SampleNativeAdMapper menunjukkan cara menyediakan ikon AdChoices:

Java

public SampleNativeAdMapper(SampleNativeAd ad) {
    ...
    setAdChoicesContent(sampleAd.getInformationIcon());
}

Peristiwa tayangan dan klik

Google Mobile Ads SDK dan SDK yang dimediasi perlu mengetahui kapan tayangan iklan atau klik terjadi, tetapi hanya satu SDK yang perlu melacak peristiwa ini. Ada ada dua pendekatan berbeda yang dapat digunakan peristiwa kustom, bergantung pada apakah SDK yang dimediasi mendukung pelacakan tayangan dan klik secara mandiri.

Melacak klik dan tayangan dengan Google Mobile Ads SDK

Jika SDK yang dimediasi tidak melakukan pelacakan klik dan tayangannya sendiri, menyediakan metode untuk mencatat klik dan tayangan, Google Mobile Ads SDK dapat melacak kejadian ini dan memberi tahu adaptor. Tujuan Class UnifiedNativeAdMapper menyertakan dua metode: recordImpression() dan handleClick() yang yang dapat diimplementasikan untuk memanggil metode terkait pada objek iklan native:

Java

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

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

Karena SampleNativeAdMapper menyimpan referensi ke native SDK Sampel objek iklan, fitur ini dapat memanggil metode yang sesuai pada objek tersebut untuk melaporkan klik atau tayangan iklan. Perhatikan bahwa metode handleClick() mengambil parameter tunggal: objek View yang sesuai dengan aset iklan native yang menerima klik.

Melacak klik dan tayangan dengan SDK yang dimediasi

Beberapa SDK yang dimediasi mungkin memilih untuk melacak klik dan tayangannya sendiri. Di beberapa jika demikian, sebaiknya ganti pelacakan klik dan tayangan default dengan membuat dua panggilan berikut dalam konstruktor UnifiedNativeAdMapper:

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

Peristiwa kustom yang menggantikan pelacakan klik dan tayangan iklan diperlukan untuk melaporkan peristiwa onAdClicked() dan onAdImpression() ke Google Mobile SDK Iklan.

Untuk melacak tayangan dan klik, SDK yang dimediasi mungkin memerlukan akses ke tampilan untuk mengaktifkan pelacakan. Peristiwa khusus harus mengganti trackViews() dan menggunakannya untuk meneruskan tampilan iklan native ke media SDK yang akan dilacak. SDK sampel dari project contoh peristiwa kustom (yang menjadi tempat cuplikan kode panduan ini telah diambil) tidak menggunakan pendekatan ini; tetapi jika begitu, kode peristiwa khusus akan terlihat seperti ini:

Java

@Override
public void trackViews(View containerView,
    Map<String, View> clickableAssetViews,
    Map<String, View> nonClickableAssetViews) {
  sampleAd.setNativeAdViewForTracking(containerView);
}

Jika SDK yang dimediasi mendukung pelacakan aset individual, SDK dapat memeriksa clickableAssetViews untuk melihat tampilan mana yang harus dapat diklik. Peta ini dikunci oleh nama aset di NativeAdAssetNames. UnifiedNativeAdMapper menawarkan metode untrackView() yang sesuai dan dapat diganti oleh peristiwa kustom melepaskan referensi apa pun ke tampilan dan memisahkannya dari iklan native .

Meneruskan peristiwa mediasi ke Google Mobile Ads SDK

Anda bisa menemukan semua callback yang didukung mediasi di Dokumen MediationNativeAdCallback.

Peristiwa kustom harus meneruskan callback ini sebanyak mungkin memungkinkan, sehingga aplikasi Anda menerima peristiwa yang setara ini dari SDK Iklan Seluler. Berikut adalah contoh penggunaan callback:

Ini menyelesaikan penerapan peristiwa kustom untuk iklan native. Contoh lengkap tersedia di GitHub.