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 hal ini,
metode tersebut ada di SampleCustomEvent
, yang kemudian memanggil
metode loadNativeAd()
di SampleNativeCustomEventLoader
.
Untuk meminta iklan native, buat atau ubah class yang memperluas Adapter
untuk
mengimplementasikan loadNativeAd()
. Jika class yang memperluas Adapter
sudah ada,
menerapkan loadNativeAd()
di sana. Selain itu, buat class baru untuk menerapkan
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 ditetapkan di UI AdMob 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 diperlukan 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)); }
Iklan native peta
SDK yang berbeda memiliki format unik sendiri 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 pemetaan mereka sendiri yang 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 Sample SDK 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 pemetaan:
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
AdMob menggunakan String
untuk aset yang sama. Pemetaan bertanggung jawab untuk menangani jenis konversi ini.
Aset gambar peta
Pemetaan aset gambar lebih rumit daripada pemetaan jenis data seperti
double
atau String
. Gambar mungkin diunduh secara otomatis atau
ditampilkan sebagai nilai URL. Skala piksel ke dpi-nya juga dapat bervariasi.
Untuk membantu Anda mengelola detail ini, Google Mobile Ads SDK menyediakan
class NativeAd.Image
. Sama seperti Anda perlu membuat subclass
UnifiedNativeAdMapper
untuk memetakan iklan native yang dimediasi, Anda juga harus membuat
subclass NativeAd.Image
saat memetakan aset gambar.
Berikut adalah contoh untuk 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 menetapkan
aset gambar ikon pemetaan:
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 selain yang ada dalam
format iklan native AdMob. Class
UnifiedNativeAdMapper
menyertakan metode setExtras()
yang digunakan untuk meneruskan aset ini ke
penayang. SampleNativeAdMapper
memanfaatkannya untuk aset "tingkat kehebatan"
Sample SDK:
Java
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
Penayang dapat mengambil data menggunakan metode getExtras()
class NativeAd
.
AdChoices
Peristiwa kustom Anda bertanggung jawab untuk menyediakan ikon AdChoices menggunakan metode setAdChoicesContent()
di UnifiedNativeAdMapper
. Berikut adalah cuplikan dari
SampleNativeAdMapper
yang menunjukkan cara memberikan 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 dua pendekatan berbeda yang dapat digunakan peristiwa kustom, bergantung pada apakah SDK yang dimediasi mendukung pelacakan tayangan iklan dan klik secara mandiri.
Melacak klik dan tayangan dengan Google Mobile Ads SDK
Jika SDK yang dimediasi tidak melakukan pelacakan tayangan iklan dan kliknya sendiri, tetapi
menyediakan metode untuk mencatat klik dan tayangan iklan, Google Mobile Ads SDK dapat
melacak peristiwa 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()
menggunakan
satu parameter: 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 laporan Google Mobile
SDK Iklan.
Untuk melacak tayangan dan klik, SDK yang dimediasi mungkin memerlukan akses ke
tampilan untuk mengaktifkan pelacakan. Peristiwa kustom harus mengganti
metode trackViews()
dan menggunakannya untuk meneruskan tampilan iklan native ke SDK
yang dimediasi untuk dilacak. SDK contoh dari project contoh peristiwa kustom kami (tempat cuplikan kode panduan ini diambil) tidak menggunakan pendekatan ini; tetapi jika
ya, kode peristiwa kustom 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 yang 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.