Opracowywanie adaptera zapośredniczenia sieci reklamowej

Ten przewodnik jest przeznaczony dla sieci reklamowych, które chcą utworzyć adapter zapośredniczenia. Jeśli jesteś wydawcą, zapoznaj się z instrukcjami zapośredniczenia wydawcy.

Adapter sieci reklamowej to warstwa komunikacji między siecią reklamową a zapośredniczeniem reklam mobilnych Google.

Adapter odpowiada za wdrożenie MediationBannerAdapter w celu obsługi banerów reklamowych i MediationInterstitialAdapter, by zapewnić obsługę reklam pełnoekranowych. Musi też w odpowiednich momentach wywoływać wywołania zwrotne w MediationBannerListener i MediationInterstitialListener, aby powiadomić zapośredniczenie reklam mobilnych Google o tych zdarzeniach i które można przekazać deweloperowi.

Przykładowa sieć reklamowa

Z tego przewodnika dowiesz się, jak utworzyć adapter na potrzeby przykładowej sieci reklamowej. Przykładowa sieć reklamowa zawiera te klasy, które są reprezentatywne dla klas oferowanych przez większość sieci reklamowych:

class SampleAdView {
    public SampleAdView(Context context);
    public void setSize(SampleAdSize size);
    public void setAdUnit(String sampleAdUnit);
    public void setAdListener(SampleAdListener listener);
    public void fetchAd(SampleAdRequest request);
    public void destroy();
}

class SampleAdSize {
    public SampleAdSize(int width, int height);
    public int getWidth();
    public int getHeight();
}

class SampleAdRequest {
    public SampleAdRequest();
    public void setKeywords(Set<String> keywords);
    public void setTestMode(boolean useTesting);
}

class SampleAdListener {
    public void onAdFetchSucceeded();
    public void onAdFetchFailed(SampleErrorCode code);
    public void onAdFullScreen();
    public void onAdClosed();
}

enum SampleErrorCode {
    UNKNOWN,
    BAD_REQUEST,
    NETWORK_ERROR,
    NO_INVENTORY
}

class SampleInterstitial {
    public SampleInterstitial(Context context);
    public void setAdUnit(String sampleAdUnit);
    public void setAdListener(SampleAdListener listener);
    public void fetchAd(SampleAdRequest request);
    public void show();
    public void destroy();
}

Więcej informacji o tych klasach znajdziesz w opisie pełnej implementacji pakietu SDK.

Wdrożenie adaptera banera

Aby wdrożyć adapter, który obsługuje banery reklamowe, utwórz klasę z implementacją MediationBannerAdapter.

public class SampleAdapter implements MediationBannerAdapter {
    @Override
    public void requestBannerAd(
            Context context,
            MediationBannerListener listener,
            Bundle serverParameters,
            AdSize adSize,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {}

    @Override
    public View getBannerView() {}

    @Override
    public void onDestroy() {}

    @Override
    public void onPause() {}

    @Override
    public void onResume() {}
}

Zanim zajmiemy się implementacją MediationBannerAdapter, omówmy parametry serwera, dodatki do zapośredniczenia oraz sposób przekazywania tych wartości do adaptera.

Parametry serwera

Twoja sieć reklamowa prawdopodobnie potrzebuje identyfikatorów, aby zidentyfikować wydawcę. Przykładowa sieć reklamowa wymaga na przykład tylko jednostki reklamowej. Wymagane parametry są podane w pakiecie serverParameters w usłudze requestBannerAd(). W trakcie programowania możesz założyć, że pakiet będzie już zawierać potrzebne klucze:

private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";

@Override
public void requestBannerAd(
        Context context,
        MediationBannerListener listener,
        Bundle serverParameters,
        AdSize adSize,
        MediationAdRequest mediationAdRequest,
        Bundle mediationExtras) {
    String adUnit = serverParameters.getString(SAMPLE_AD_UNIT_KEY);
    ...
}

AdMob wyśle Ci kwestionariusz z pytaniem, jakich parametrów serwera potrzebujesz od wydawcy, by wysyłać żądania i wyświetlać reklamy. AdMob użyje tych danych do skonfigurowania sieci w interfejsie AdMob. Na zrzucie ekranu poniżej widać, że w przypadku Millennial Media wymagany jest APID, a dla InMobi – identyfikator aplikacji.

AdMob użyje tych informacji do wypełnienia pakietu serverParameters podczas inicjowania adaptera.

Więcej informacji o konfigurowaniu sieci reklamowych z zapośredniczeniem przez wydawców znajdziesz w tym artykule.

Dodatkowe parametry kierowania

MediationAdRequest zawiera podstawowe informacje, których możesz używać do kierowania reklam, np.:

Dodatki do zapośredniczenia

Jeśli Twoja sieć reklamowa obsługuje informacje o kierowaniu, których nie podaje MediationAdRequest, deweloperzy aplikacji mogą przekazywać do Twojej sieci pakiet mediationExtras. Zapośredniczenie to przykład przekazywania dodatkowych informacji o zapośredniczeniu.

Aby ułatwić deweloperom przesyłanie tych informacji, możesz podać w adapterze klasę kreatora pakietów. Załóżmy, że Twoja sieć obsługuje przekazywanie wartości dochodu. Możesz dodać do adaptera klasę konstruktora, która określa dochód:

public static final class BundleBuilder {
    private int income;

    public BundleBuilder setIncome(int income) {
        this.income = income;
        return this;
    }

    public Bundle build() {
        Bundle bundle = new Bundle();
        bundle.putInt("income", income);
        return bundle;
    }
}

Ta klasa udostępnia czysty interfejs API, który umożliwia deweloperowi wygenerowanie pakietu dla Twojej sieci:

Bundle sampleAdapterBundle =
        new SampleAdapter.BundleBuilder().setIncome(100000).build();

requestBannerAd()

Po omówieniu parametrów serwera i dodatkowych funkcji zapośredniczenia możemy je wykorzystać do utworzenia MediationBannerAdapter.

Metoda requestBannerAd() jest wywoływana natychmiast po utworzeniu instancji adaptera. W tym miejscu należy utworzyć widok reklamy i wysłać żądanie banera reklamowego.

Implementacja usługi requestBannerAd() w przypadku przykładowej sieci reklamowej wygląda tak:

public class SampleAdMobAdapter implements MediationBannerAdapter {
    private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";
    private SampleAdView sampleAdView;

    @Override
    public void requestBannerAd(
            Context context, // May be an application context.
            MediationBannerListener listener,
            Bundle serverParameters,
            AdSize adSize,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {
        sampleAdView = new SampleAdView(context);

        if (serverParameters.containsKey(SAMPLE_AD_UNIT_KEY)) {
            sampleAdView.setAdUnit(serverParameters.getString(SAMPLE_AD_UNIT_KEY));
        } else {
            listener.onAdFailedToLoad(this, AdRequest.ERROR_CODE_INVALID_REQUEST);
        }

        sampleAdView.setSize(
                new SampleAdSize(adSize.getWidth(),adSize.getHeight()));

        sampleAdView.setAdListener(
                new SampleBannerEventForwarder(listener, this));

        SampleAdRequest request = new SampleAdRequest();
        request.setTestMode(mediationAdRequest.isTesting());
        request.setKeywords(mediationAdRequest.getKeywords());
        sampleAdView.fetchAd(request);
    }
}

Nie zakładaj, że parametr kontekstu jest typu Activity. W zależności od wdrożenia przez wydawcę zapośredniczenie reklam mobilnych Google może przekazać kontekst aplikacji do adaptera. Jeśli adapter nie obsługuje kontekstu aplikacji, zalecamy wywołanie onAdFailedToLoad() z kodem błędu AdRequest.ERROR_CODE_INVALID_REQUEST.

Wywołania zwrotne MediationBannerListener

Zapisz MediationBannerListener w usłudze requestBannerAd(), aby móc przekazywać zdarzenia reklamowe z powrotem do zapośredniczenia reklam mobilnych Google. Każde wywołanie zwrotne należy wywołać w odpowiednim momencie cyklu życia reklamy:

Metoda Kiedy dzwonić
onAdLoaded() Żądanie banera zostało zrealizowane.
onAdFailedToLoad() Nie udało się zrealizować prośby o baner.
onAdClicked() Kliknięto baner.
onAdOpened() Baner renderuje się w trybie pełnoekranowym.
onAdClosed() Użytkownik wraca do aplikacji po kliknięciu banera.
onAdLeftApplication() Baner powoduje, że użytkownik opuszcza aplikację.

Przykładowy adapter sieci reklamowej tworzy klasę o nazwie SampleBannerEventForwarder do obsługi przekierowania zdarzeń:

public class SampleBannerEventForwarder extends SampleAdListener {
    private MediationBannerListener mediationListener;
    private SampleAdapter adapter;

    public SampleBannerEventForwarder(
            MediationBannerListener listener, SampleAdapter adapter) {
        this.mediationListener = listener;
        this.adapter = adapter;
    }

    @Override
    public void onAdFetchSucceeded() {
        mediationListener.onAdLoaded(adapter);
    }

    @Override
    public void onAdFetchFailed(SampleErrorCode errorCode) {
        switch(errorCode) {
            case UNKNOWN:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_INTERNAL_ERROR);
                break;
            case BAD_REQUEST:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_INVALID_REQUEST);
                break;
            case NETWORK_ERROR:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_NETWORK_ERROR);
                break;
            case NO_INVENTORY:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_NO_FILL);
                break;
        }
    }

    @Override
    public void onAdFullScreen() {
        mediationListener.onAdClicked(adapter);
        mediationListener.onAdOpened(adapter);
        mediationListener.onAdLeftApplication(adapter);
    }

    @Override
    public void onAdClosed() {
        mediationListener.onAdClosed(adapter);
    }
}

Zwróć uwagę, że przykładowy adapter sieci reklamowej wysłał w tym samym wywołaniu zwrotny onAdClicked, onAdOpened i onAdLeftApplication. Mimo że wywołania zwrotne Twojej sieci mogą nie być dokładnie takie same jak wywołania zwrotne Google Ads na telefon komórkowy, obowiązkiem adaptera jest zapewnienie rozsądnego mapowania.

getBannerView

Gdy wywołasz metodę MediationBannerListener.onAdLoaded(), zapośredniczenie wywoła metodę getBannerView(), aby na ekranie pojawił się widok banera Twojej sieci reklamowej. Po prostu przywróć widok banera utworzony w aplikacji requestBannerAd():

@Override
public View getBannerView() {
    return sampleAdView;
}

Zdarzenia cyklu życia aktywności

Jeśli deweloper aplikacji powiadomi adapter o zdarzeniach związanych z aktywnością onPause() i onResume(). Wstrzymaj i wznów wyświetlanie banera w razie potrzeby:

@Override
public void onPause() {
}

@Override
public void onResume() {
}

Przykładowa sieć reklamowa nie zawiera wywołania wstrzymywania ani wznawiania, więc udostępnia pustą implementację.

Zapośredniczenie będzie dążyć do wywołania onDestroy(), gdy adapter będzie miał zostać zniszczony. Przeprowadź niezbędne czyszczenie tutaj:

@Override
public void onDestroy() {
    if (sampleAdView != null) {
        sampleAdView.destroy();
    }
}

Banery inteligentne

Pakiet SDK do reklam mobilnych Google obsługuje rozmiar reklamy inteligentny, który ma pełną szerokość i zmienną wysokość w zależności od rozmiaru urządzenia.

Aby dokładnie określić rozmiar banera inteligentnego, musisz użyć w adapterze właściwości adSize.getWidthInPixels(context), by uzyskać szerokość, i adSize.getHeightInPixels(context), a nie adSize.getHeight(), by uzyskać wysokość. Następnie należy podzielić go przez gęstość urządzenia:

int widthInPixels = adSize.getWidthInPixels(context);
int heightInPixels = adSize.getHeightInPixels(context);
DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
int widthInDp = Math.round(widthInPixels / displayMetrics.density);
int heightInDp = Math.round(heightInPixels / displayMetrics.density);

Następnie w żądaniu reklamy możesz użyć widthInDp i heightInDp jako rozmiaru.

Znakomicie. Masz teraz działający adapter zapośredniczenia dla banerów. Pełną implementację parametru SampleAdapter znajdziesz tutaj.

Implementowanie adaptera reklam pełnoekranowych

Implementacja adaptera w przypadku reklam pełnoekranowych jest podobna do banerów reklamowych. Aby wdrożyć adapter, który obsługuje reklamy pełnoekranowe, utwórz klasę implementującą MediationInterstitialAdapter:

public class SampleAdapter implements MediationInterstitialAdapter {
    @Override
    public void requestInterstitialAd(
            Context context,
            MediationInterstitialListener listener,
            Bundle serverParameters,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {}

    @Override
    public View showInterstitial() {}

    @Override
    public void onDestroy() {}

    @Override
    public void onPause() {}

    @Override
    public void onResume() {}
}

Jeśli Twój adapter również obsługuje banery, możesz zaimplementować oba interfejsy, używając tej samej klasy adaptera.

Zanim wdrożysz MediationInterstitialAdapter, zapoznaj się teraz z parametrami serwera i dodatkowymi informacjami o zapośredniczeniach.

Parametry serwera (reklama pełnoekranowa)

Zobacz sekcję Parametry serwera banerów.

Dodatkowe parametry kierowania (reklamy pełnoekranowe)

Zapoznaj się z sekcją Dodatkowe parametry kierowania banerów.

Dodatki do zapośredniczenia (reklama pełnoekranowa)

Zobacz sekcję Dodatki do zapośredniczenia banerów.

requestInterstitialAd

Metoda requestInterstitialAd() jest wywoływana natychmiast po utworzeniu instancji adaptera. W tym miejscu należy utworzyć reklamę pełnoekranową i wysłać żądanie reklamy pełnoekranowej.

Implementacja usługi requestInterstitialAd() w przykładowej sieci reklamowej wyglądałaby tak:

public class SampleAdapter implements MediationBannerAdapter {
    private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";

    private SampleInterstitial sampleInterstitial;

    @Override
    public void requestInterstitialAd(
            Context context, // May be an application context.
            MediationInterstitialListener listener,
            Bundle serverParameters,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {
        sampleInterstitial = new SampleInterstitial(context);

        if (serverParameters.containsKey(SAMPLE_AD_UNIT_KEY)) {
            sampleInterstitial.setAdUnit(serverParameters.getString(SAMPLE_AD_UNIT_KEY));
        } else {
            listener.onAdFailedToLoad(this, AdRequest.ERROR_CODE_INVALID_REQUEST);
        }

        sampleInterstitial.setAdListener(
                new SampleInterstitialEventForwarder(listener, this));

        // Make an ad request.
        SampleAdRequest request = new SampleAdRequest();
        request.setTestMode(mediationAdRequest.isTesting());
        request.setKeywords(mediationAdRequest.getKeywords());
        sampleInterstitial.fetchAd(request);
    }
}

Nie zakładaj, że parametr kontekstu jest typu Aktywność. Zapośredniczenie reklam mobilnych Google przekazuje kontekst przekazany przez dewelopera aplikacji. Może też przekazywać kontekst z aplikacji. Jeśli adapter nie obsługuje kontekstu aplikacji, zalecamy wywołanie onAdFailedToLoad z kodem błędu AdRequest.ERROR_CODE_INVALID_REQUEST.

Wywołania zwrotne MediationInterstitialListener

Zapisz MediationInterstitialListener w usłudze requestInterstitialAd, aby móc przekazywać zdarzenia reklamowe z powrotem do zapośredniczenia reklam mobilnych Google. Każde wywołanie zwrotne musi zostać wykonane w odpowiednim momencie cyklu życia reklamy:

Metoda Kiedy dzwonić
onAdLoaded Żądanie reklamy pełnoekranowej zostało zrealizowane.
onAdFailedToLoad Nie udało się zrealizować żądania reklamy pełnoekranowej.
onAdOpened Wyświetla się reklama pełnoekranowa.
onAdClosed Reklama pełnoekranowa jest zamknięta.
onAdLeftApplication Reklama pełnoekranowa powoduje, że użytkownik opuszcza aplikację.

showInterstitial

Po wywołaniu MediationInterstitialListener.onAdLoaded() poczekaj, aż reklama pełnoekranowa zostanie wyświetlona do momentu wywołania showInterstitial(). To deweloper aplikacji decyduje, kiedy wyświetlić reklamę pełnoekranową. Może to potrwać do kilku minut od wysłania prośby.

Implementacja funkcji showInterstitial() jest dość prosta. Pokaż tylko obiekt pełnoekranowy:

@Override
public void showInterstitial() {
    sampleInterstitial.show();
}

Zdarzenia cyklu życia aktywności (reklama pełnoekranowa)

Zobacz sekcję Zdarzenia cyklu życia aktywności banera.

Po zaimplementowaniu zdarzeń cyklu życia aktywności adapter zapośredniczenia jest gotowy do obsługi reklam pełnoekranowych. Pełną implementację parametru SampleAdapter znajdziesz tutaj.

Najczęstsze pytania

Co mam zrobić, jeśli mój adapter obsługuje tylko banery lub reklamy pełnoekranowe, ale nie oba jednocześnie?

Jeśli Twój adapter obsługuje tylko banery, wystarczy zaimplementować interfejs MediationBannerAdapter. Jeśli przejściówka obsługuje tylko reklamy pełnoekranowe, wystarczy zaimplementować interfejs MediationInterstitialAdapter.