Wymagania wstępne
Dokończ konfigurowanie zdarzeń niestandardowych.
Żądanie reklamy natywnej
Gdy w łańcuchu pośrednictwa kaskadowego zostanie osiągnięty element zamówienia zdarzenia niestandardowego, metoda loadNativeAd()
zostanie wywołana z nazwą klasy podaną podczas tworzenia zdarzenia niestandardowego. W tym przypadku metoda znajduje się w klasie SampleCustomEvent
, która wywołuje metodę loadNativeAd()
w klasie SampleNativeCustomEventLoader
.
Aby poprosić o reklamę natywną, utwórz lub zmodyfikuj klasę rozszerzającą klasę Adapter
, aby zaimplementować interfejs loadNativeAd()
. Jeśli klasa rozszerzająca Adapter
już istnieje, zaimplementuj loadNativeAd()
w niej. Dodatkowo utwórz nowe zajęcia, aby wdrożyć UnifiedNativeAdMapper
.
W naszym przykładzie zdarzenia niestandardowego klasa SampleCustomEvent
rozszerza klasę Adapter
, a potem deleguje do niej wywołanie metody 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 zgłaszanie do pakietu SDK do reklam mobilnych Google wywołań zwrotnych zdarzeń reklamy.
Opcjonalny parametr zdefiniowany w interfejsie Ad Managera 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 to zwykle identyfikator jednostki reklamowej, którego pakiet SDK sieci reklamowej wymaga podczas tworzenia 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 udało się pobrać reklamę, czy wystąpił błąd, wywołasz metodę onSuccess()
lub onFailure()
.
Funkcja onSuccess()
jest wywoływana przez przekazanie instancji klasy, która implementuje funkcję MediationNativeAd
.
Zwykle te metody są implementowane w ramach wywołań zwrotnych z zewnętrznego pakietu SDK, który jest używany przez adapter. W tym przykładzie pakiet SDK Sample ma element 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 na mapach
Różne pakiety SDK mają własne formaty reklam natywnych. Jeden z nich może zwracać obiekty zawierające pole „title”, a inny – pole „headline”. Dodatkowo metody śledzenia wyświetleń i przetwarzania kliknięć mogą się różnić w zależności od pakietu SDK.
UnifiedNativeAdMapper
jest odpowiedzialny za uzgadnianie tych różnic i dostosowywanie natywnego obiektu reklamy pośredniczącego pakietu SDK do wymagań interfejsu pakietu SDK do reklam mobilnych Google. Zdarzenia niestandardowe powinny rozszerzać tę klasę, aby tworzyć własne mapery dostosowane do ich pośredniczących pakietów SDK. Oto przykładowy mapper reklam z naszego przykładowego projektu z zdarzeniami niestandardowymi:
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ę teraz bliżej kodom konstruktora.
przechowywać odwołania do obiektu reklamy natywnej z zaporą zapośredniczenia;
Konstruktor akceptuje parametr SampleNativeAd
, czyli klasę reklamy natywnej używaną przez Sample SDK do reklam natywnych. Maper potrzebuje odwołania do reklamy pośredniczącej, aby mógł przekazywać zdarzenia kliknięcia i wyświetlenia. Wartość SampleNativeAd
jest przechowywana jako zmienna lokalna.
Ustawianie właściwości mapowanych zasobów
Konstruktor używa obiektu SampleNativeAd
do wypełniania zasobów w UnifiedNativeAdMapper
.
Ten fragment kodu pobiera dane o cenie reklamy pośredniej i używa ich do ustawienia ceny mappera:
Java
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
W tym przykładzie reklama pośrednicząca przechowuje cenę jako double
, a Ad Manager używa String
dla tego samego komponentu. Za obsługę tych typów konwersji odpowiada mapper.
Komponenty z obrazem mapy
Mapowanie zasobów graficznych jest bardziej skomplikowane niż mapowanie typów danych, takich jak double
lub String
. Obrazy mogą być pobierane automatycznie lub zwracane jako wartości adresów URL. Ich skale pikseli na dpi mogą się też różnić.
Aby ułatwić zarządzanie tymi informacjami, pakiet SDK do reklam mobilnych Google udostępnia klasę NativeAd.Image
. Podobnie jak w przypadku tworzenia podklasy UnifiedNativeAdMapper
, aby zmapować pośredniczą reklamę natywną, podczas mapowania komponentów obrazu musisz też utworzyć podklasę NativeAd.Image
.
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 tym wierszu SampleNativeAdMapper
używa swojej mapowanej klasy obrazu, aby ustawić zasób obrazu ikony mappera:
Java
setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
Dodawanie pól do pakietu dodatkowych informacji
Niektóre pośredniczące pakiety SDK udostępniają dodatkowe komponenty poza tymi, które są dostępne w natywności w usłudze Ad Manager. Klasa UnifiedNativeAdMapper
zawiera metodę setExtras()
, która służy do przekazywania tych komponentów wydawcom. W przypadku pakietu Sample SDK komponent SampleNativeAdMapper
korzysta z zasosobu „stopień wspaniałości”:
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 getExtras()
.NativeAd
AdChoices
Zdarzenie niestandardowe odpowiada za wyświetlanie ikony AdChoices za pomocą metody setAdChoicesContent()
w komponencie UnifiedNativeAdMapper
. Oto fragment stronySampleNativeAdMapper
, który pokazuje, jak wyświetlić ikonę AdChoices:
Java
public SampleNativeAdMapper(SampleNativeAd ad) { ... setAdChoicesContent(sampleAd.getInformationIcon()); }
Zdarzenia wyświetlenia i kliknięcia
Zarówno pakiet SDK do reklam mobilnych Google, jak i pakiet SDK pośredniczący muszą wiedzieć, kiedy wystąpiło wyświetlenie lub kliknięcie, ale tylko 1 pakiet SDK musi śledzić te zdarzenia. Zdarzenia niestandardowe mogą korzystać z 2 różnych podejść, w zależności od tego, czy pośredniczący pakiet SDK obsługuje samodzielnie śledzenie wyświetleń i kliknięć.
Śledzenie kliknięć i wyświetleń za pomocą pakietu SDK do reklam mobilnych Google
Jeśli zapośredniczony pakiet SDK nie śledzi wyświetleń ani kliknięć, ale udostępnia metody rejestrowania kliknięć i wyświetleń, pakiet SDK do reklam mobilnych Google może śledzić te zdarzenia i powiadamiać o nich adapter. Klasa UnifiedNativeAdMapper
zawiera 2 metody: recordImpression()
i handleClick()
, które mogą implementować zdarzenia niestandardowe, aby wywołać odpowiednią metodę w obiekcie reklamy natywnej z użyciem pośrednictwa:
Java
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
Ponieważ obiekt SampleNativeAdMapper
zawiera odwołanie do natywnego obiektu Sample SDK, może wywołać odpowiednią metodę tego obiektu, aby zgłosić kliknięcie lub wyświetlenie. Pamiętaj, że metoda handleClick()
przyjmuje 1 parametry: obiekt View
odpowiadający komponentowi reklamy natywnej, który otrzymał kliknięcie.
Śledzenie kliknięć i wyświetleń za pomocą SDK z zapośredniczeniem
Niektóre pośredniczące biblioteki SDK mogą samodzielnie śledzić kliknięcia i wyświetlenia. W takim przypadku musisz zastąpić domyślne śledzenie kliknięć i wyświetleń, wykonując w konstruktorze klasy UnifiedNativeAdMapper
te 2 wywołania:
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, pośredniczący pakiet SDK musi mieć dostęp do widoków, które umożliwiają śledzenie. Zdarzenie niestandardowe powinno zastąpić metodę trackViews()
i wykorzystać ją do przekazania widoku reklamy natywnej do pośredniczącego pakietu SDK w celu śledzenia. Przykładowy pakiet SDK z naszego przykładowego projektu dotyczącego zdarzeń niestandardowych (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 pośredniczący pakiet SDK obsługuje śledzenie poszczególnych komponentów, może sprawdzić w poziomie komponentu clickableAssetViews
, które widoki powinny być klikalne. Ta mapa jest powiązana z nazwą zasobu w elementach NativeAdAssetNames
. Obiekt 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 natywnego obiektu reklamy.
Przekazywanie zdarzeń zapośredniczenia do pakietu SDK do reklam mobilnych Google
Wszystkie funkcje wywołania zwrotnego obsługiwane przez pośredniczenie znajdziesz w dokumentacji MediationNativeAdCallback
.
Ważne jest, aby zdarzenie niestandardowe przekazywało jak najwięcej wywołań zwrotnych, aby aplikacja otrzymywała zdarzenia o takim samym znaczeniu z pakietu SDK do reklam mobilnych Google. Oto przykład użycia wywołań zwrotnych:
To kończy implementację zdarzeń niestandardowych w przypadku reklam natywnych. Pełny przykład jest dostępny na GitHub.