Wymagania wstępne
Dokończ konfigurowanie zdarzeń niestandardowych.
Żądanie reklamy natywnej
Gdy w łańcuchu zapośredniczenia kaskadowego zostanie osiągnięty element zamówienia związany ze zdarzeniem niestandardowym, wywoływana jest metoda loadNativeAd() w klasie o nazwie podanej podczas tworzenia zdarzenia niestandardowego. W tym przypadku ta metoda znajduje się w SampleCustomEvent, która następnie wywołuje metodę loadNativeAd() w SampleNativeCustomEventLoader.
Aby wysłać żądanie reklamy natywnej, utwórz lub zmodyfikuj klasę, która rozszerza Adapter, aby zaimplementować loadNativeAd(). Jeśli klasa rozszerzająca Adapter już istnieje, zaimplementuj w niej loadNativeAd(). Dodatkowo utwórz nową klasę, aby zaimplementować interfejs UnifiedNativeAdMapper.
W naszym przykładzie zdarzenia niestandardowego klasa SampleCustomEvent rozszerza klasę Adapter, a następnie przekazuje uprawnienia do klasy 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 odpowiada za te zadania:
Wczytywanie reklamy natywnej.
Zaimplementuj klasę
UnifiedNativeAdMapper.Odbieranie i raportowanie wywołań zwrotnych zdarzeń reklamowych do: GMA Next-Gen SDK.
Opcjonalny parametr zdefiniowany w interfejsie AdMob jest uwzględniany w konfiguracji reklamy. Dostęp do parametru można uzyskać za pomocą adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD).
Ten parametr jest zwykle identyfikatorem jednostki reklamowej, którego pakiet SDK sieci reklamowej wymaga podczas tworzenia instancji obiektu reklamy.
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); } }
W zależności od tego, czy reklama zostanie pobrana, czy wystąpi błąd, wywołaj onSuccess() lub onFailure().
Metoda onSuccess() jest wywoływana przez przekazanie instancji klasy, która implementuje interfejs MediationNativeAd.
Zwykle te metody są implementowane w wywołaniach zwrotnych z zewnętrznego pakietu SDK, który implementuje adapter. W tym przykładzie przykładowy pakiet SDK
ma klasę SampleAdListener z odpowiednimi wywołaniami zwrotnymi:
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)); }
Reklamy natywne w Mapach
Różne pakiety SDK mają własne unikalne formaty reklam natywnych. Jedna może na przykład zwracać obiekty zawierające pole „title”, a inna – „headline”. Dodatkowo metody używane do śledzenia wyświetleń i przetwarzania kliknięć mogą się różnić w zależności od pakietu SDK.
UnifiedNativeAdMapper odpowiada za uzgadnianie tych różnic i dostosowywanie obiektu reklamy natywnej zapośredniczonego pakietu SDK do interfejsu oczekiwanego przez GMA Next-Gen SDK. Zdarzenia niestandardowe powinny rozszerzać tę klasę, aby tworzyć własne mapowania dostosowane do pakietu SDK zapośredniczenia. Oto przykładowy moduł mapowania reklam z naszego przykładowego projektu zdarzenia niestandardowego:
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. } }
Przyjrzyjmy się bliżej kodowi konstruktora.
Przechowywanie odwołania do obiektu zapośredniczonej reklamy natywnej
Konstruktor akceptuje parametr SampleNativeAd, czyli klasę reklamy natywnej używaną przez przykładowy pakiet SDK do reklam natywnych. Funkcja mapowania potrzebuje odwołania do reklamy zapośredniczonej, aby mogła przekazywać zdarzenia kliknięcia i wyświetlenia. SampleNativeAd jest przechowywana jako zmienna lokalna.
Ustawianie właściwości zmapowanych zasobów
Konstruktor używa obiektu SampleNativeAd do wypełniania zasobów w UnifiedNativeAdMapper.
Ten fragment kodu pobiera dane o cenie reklamy zapośredniczonej i używa ich do ustawienia ceny w funkcji mapującej:
Java
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
W tym przykładzie reklama zapośredniczona przechowuje cenę jako double, a AdMob używa String dla tego samego komponentu. Za obsługę tego typu konwersji odpowiada moduł mapowania.
Komponenty z obrazem mapy
Mapowanie komponentów z obrazem jest bardziej skomplikowane niż mapowanie typów danych takich jak double czy String. Obrazy mogą być pobierane automatycznie lub zwracane jako wartości adresów URL. Mogą też mieć różne skale pikseli na dpi.
Aby ułatwić zarządzanie tymi szczegółami, GMA Next-Gen SDK udostępnia klasę NativeAd.Image. Podobnie jak w przypadku tworzenia podklasy UnifiedNativeAdMapper do mapowania zapośredniczonej reklamy natywnej, musisz też utworzyć podklasę NativeAd.Image podczas mapowania komponentów z obrazem.
Oto przykład klasy SampleNativeMappedImage zdarzenia niestandardowego:
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; } }
W tej linii SampleNativeAdMapper używa zmapowanej klasy obrazu, aby ustawić komponent z obrazem ikony mapowania:
Java
setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
Dodawanie pól do pakietu dodatków
Niektóre pakiety SDK zapośredniczenia udostępniają dodatkowe komponenty oprócz tych, które są dostępne w formacie reklamy natywnej AdMob. Klasa UnifiedNativeAdMapper zawiera metodę setExtras(), która służy do przekazywania tych zasobów wydawcom. SampleNativeAdMapper wykorzystuje to w przypadku zasobu „stopień niesamowitości” przykładowego pakietu SDK:
Java
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
Wydawcy mogą pobierać dane za pomocą metody getExtras() klasy NativeAd.
AdChoices
Zdarzenie niestandardowe odpowiada za wyświetlanie ikony Informacja za pomocą metody setAdChoicesContent() w UnifiedNativeAdMapper. Oto fragment kodu z SampleNativeAdMapper pokazujący, jak udostępnić ikonę Informacja:
Java
public SampleNativeAdMapper(SampleNativeAd ad) { ... setAdChoicesContent(sampleAd.getInformationIcon()); }
Zdarzenia wyświetlenia i zdarzenia kliknięcia
Zarówno GMA Next-Gen SDK, jak i pakiet SDK zapośredniczenia muszą wiedzieć, kiedy następuje wyświetlenie lub kliknięcie, ale tylko 1 pakiet SDK musi śledzić te zdarzenia. Istnieją 2 różne podejścia, które można zastosować w przypadku zdarzeń niestandardowych, w zależności od tego, czy zapośredniczony pakiet SDK obsługuje samodzielne śledzenie wyświetleń i kliknięć.
Śledzenie kliknięć i wyświetleń za pomocą GMA Next-Gen SDK
Jeśli zapośredniczony pakiet SDK nie śledzi wyświetleń i kliknięć, ale udostępnia metody rejestrowania kliknięć i wyświetleń, GMA Next-Gen SDK może śledzić te zdarzenia i powiadamiać adapter. Klasa UnifiedNativeAdMapper zawiera 2 metody: recordImpression() i handleClick(), które zdarzenia niestandardowe mogą implementować, aby wywoływać odpowiednią metodę w obiekcie zapośredniczonej reklamy natywnej:
Java
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
Ponieważ SampleNativeAdMapper zawiera odwołanie do obiektu reklamy natywnej przykładowego pakietu SDK, może wywołać odpowiednią metodę na tym obiekcie, aby zgłosić kliknięcie lub wyświetlenie. Pamiętaj, że metoda handleClick() przyjmuje jeden parametr: obiekt View odpowiadający komponentowi reklamy natywnej, który został kliknięty.
Śledzenie kliknięć i wyświetleń za pomocą zapośredniczonego pakietu SDK
Niektóre pakiety SDK zapośredniczenia mogą preferować samodzielne śledzenie kliknięć i wyświetleń. W takim przypadku należy zastąpić domyślne śledzenie kliknięć i wyświetleń, wykonując te 2 wywołania w konstruktorze klasy UnifiedNativeAdMapper:
Java
setOverrideClickHandling(true); setOverrideImpressionRecording(true);
Zdarzenia niestandardowe, które zastępują śledzenie kliknięć i wyświetleń, są wymagane do raportowania zdarzeń onAdClicked() i onAdImpression() do pakietu SDK do reklam mobilnych Google.
Aby śledzić wyświetlenia i kliknięcia, zapośredniczony pakiet SDK prawdopodobnie potrzebuje dostępu do widoków. Zdarzenie niestandardowe powinno zastąpić metodę trackViews() i użyć jej do przekazania widoku reklamy natywnej do pakietu SDK zapośredniczenia na potrzeby śledzenia. Przykładowy pakiet SDK z naszego przykładowego projektu zdarzenia niestandardowego (z którego pochodzą fragmenty kodu w tym przewodniku) nie korzysta z tego podejścia, ale gdyby tak było, kod zdarzenia niestandardowego wyglądałby mniej więcej tak:
Java
@Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { sampleAd.setNativeAdViewForTracking(containerView); }
Jeśli pakiet SDK zapośredniczenia obsługuje śledzenie poszczególnych komponentów, może sprawdzić w clickableAssetViews, które widoki powinny być klikalne. Ta mapa jest kluczowana przez nazwę zasobu w NativeAdAssetNames. Klasa UnifiedNativeAdMapper udostępnia odpowiednią metodę untrackView(), którą zdarzenia niestandardowe mogą zastąpić, aby zwolnić wszystkie odwołania do widoku i odłączyć go od obiektu reklamy natywnej.
Przekazywanie zdarzeń zapośredniczenia do: GMA Next-Gen SDK
Wszystkie wywołania zwrotne obsługiwane przez zapośredniczenie znajdziesz w dokumentacji MediationNativeAdCallback.
Ważne jest, aby zdarzenie niestandardowe przekazywało jak najwięcej tych wywołań zwrotnych, aby aplikacja otrzymywała te równoważne zdarzenia z GMA Next-Gen SDK. Oto przykład użycia wywołań zwrotnych:
To już wszystko, jeśli chodzi o implementację zdarzeń niestandardowych w przypadku reklam natywnych. Pełny przykład jest dostępny na GitHub.