Entwicklung des Ad Network Mediation-Adapters

Dieser Leitfaden richtet sich an Werbenetzwerke, die einen Vermittlungsadapter erstellen möchten. Wenn Sie ein Publisher sind, lesen Sie die Anleitung zur Vermittlung für Publisher.

Ein Werbenetzwerkadapter stellt die Kommunikationsebene zwischen Ihrem Werbenetzwerk und der Google Mobile Ads Mediation dar.

Der Adapter ist für die Implementierung von MediationBannerAdapter für Banneranzeigen und MediationInterstitialAdapter für Interstitial-Anzeigen verantwortlich. Außerdem müssen die Callbacks in MediationBannerListener und MediationInterstitialListener zu den entsprechenden Zeiten aufgerufen werden, um Google Mobile Ads Mediation über diese Ereignisse zu informieren. Die Callbacks können auch an den Entwickler weitergeleitet werden.

Beispiel-Werbenetzwerk

In dieser Anleitung wird gezeigt, wie Sie einen Adapter für ein Sample-Werbenetzwerk erstellen. Das Beispielwerbenetzwerk enthält die folgenden Klassen, die für die von den meisten Werbenetzwerken angebotenen Klassen repräsentativ sind:

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

Weitere Informationen zu diesen Klassen finden Sie in der vollständigen SDK-Implementierung.

Banneradapter implementieren

Wenn Sie einen Adapter implementieren möchten, der Banneranzeigen unterstützt, müssen Sie eine Klasse erstellen, in der MediationBannerAdapter implementiert ist.

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() {}
}

Bevor wir MediationBannerAdapter implementieren, sehen wir uns nun Serverparameter, Vermittlungsextras und die Übergabe dieser Werte an den Adapter an.

Serverparameter

Ihr Werbenetzwerk benötigt wahrscheinlich eine oder mehrere Kennungen, um einen Publisher zu identifizieren. Für das Beispiel-Werbenetzwerk ist beispielsweise nur ein Anzeigenblock erforderlich. Diese erforderlichen Parameter werden im serverParameters-Bundle in requestBannerAd() bereitgestellt. Bei der Entwicklung können Sie davon ausgehen, dass das Bundle bereits die benötigten Schlüssel enthält:

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

Sie erhalten von AdMob einen Fragebogen, in dem Sie gefragt werden, welche Serverparameter Sie von einem Publisher benötigen, um Anzeigen anzufordern und auszuliefern. Anhand dieser Informationen wird Ihr Werbenetzwerk in der AdMob-Benutzeroberfläche konfiguriert. Der folgende Screenshot zeigt, dass für Millennial Media APID und für InMobi eine App-ID erforderlich ist.

AdMob verwendet diese Informationen, um das Bundle serverParameters bei der Instanziierung des Adapters zu füllen.

In diesem Artikel finden Sie weitere Informationen zur Konfiguration von Werbenetzwerken zur Vermittlung durch Publisher.

Zusätzliche Targeting-Parameter

Im MediationAdRequest finden Sie einige allgemeine Ausrichtungsinformationen, die Sie für die Anzeigenausrichtung verwenden können, z. B.:

Vermittlungsextras

Wenn Ihr Werbenetzwerk Targeting-Informationen unterstützt, die von MediationAdRequest nicht bereitgestellt werden, können App-Entwickler ein Bundle von mediationExtras speziell an Ihr Netzwerk übergeben. In der Vermittlung finden Sie ein Beispiel für das Übergeben von Vermittlungsextras.

Damit Entwickler diese Informationen optional übergeben können, können Sie in Ihrem Adapter eine Bundle-Builder-Klasse angeben. Angenommen, Ihr Netzwerk unterstützt die Übergabe eines Einkommenswerts. Sie können Ihrem Adapter eine Builder-Klasse hinzufügen, mit der das Einkommen festgelegt wird:

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

Diese Klasse stellt eine bereinigte API für den Entwickler zur Verfügung, um ein Bundle für Ihr Netzwerk zu generieren:

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

requestBannerAd()

Nachdem Sie nun eine Einführung in Serverparameter und Vermittlungsextras erhalten haben, können wir sie zum Erstellen einer MediationBannerAdapter verwenden.

Die Methode requestBannerAd() wird unmittelbar nach der Instanziierung des Adapters aufgerufen. Hier sollten Sie Ihre Anzeigenansicht erstellen und eine Banneranzeige anfordern.

Eine Implementierung von requestBannerAd() für das Beispielwerbenetzwerk sieht so aus:

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

Gehen Sie nicht davon aus, dass der Kontextparameter vom Typ Activity ist. Je nach Implementierung des Publishers kann die Google Mobile Ads-Vermittlung einen App-Kontext an Ihren Adapter weiterleiten. Wenn Ihr Adapter einen Anwendungskontext nicht verarbeiten kann, empfiehlt es sich, onAdFailedToLoad() mit dem Fehlercode AdRequest.ERROR_CODE_INVALID_REQUEST aufzurufen.

MediationBannerListener-Callbacks

Sie sollten die in requestBannerAd() bereitgestellte MediationBannerListener speichern, damit Anzeigenereignisse zurück an die Google Mobile Ads-Vermittlung weitergeleitet werden können. Jeder Callback muss zur richtigen Zeit im Lebenszyklus der Anzeige aufgerufen werden:

Methode Wann Sie anrufen sollten
onAdLoaded() Die Banneranfrage war erfolgreich.
onAdFailedToLoad() Die Banneranfrage ist fehlgeschlagen.
onAdClicked() Auf das Banner wurde geklickt.
onAdOpened() Das Banner wird im Vollbildmodus angezeigt.
onAdClosed() Der Nutzer kehrt zur App zurück, nachdem er auf ein Banner geklickt hat.
onAdLeftApplication() Das Banner veranlasst den Nutzer, die App zu verlassen.

Der Beispiel-Werbenetzwerkadapter erstellt eine Klasse mit dem Namen SampleBannerEventForwarder für die Ereignisweiterleitung:

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

Der beispielhafte Werbenetzwerkadapter hat onAdClicked, onAdOpened und onAdLeftApplication im selben Callback gesendet. Auch wenn die Callbacks für Ihr Netzwerk nicht genau mit den Callbacks übereinstimmen, die für Google Mobile Ads erforderlich sind, muss der Adapter eine angemessene Zuordnung bereitstellen.

getBannerView

Wenn Sie MediationBannerListener.onAdLoaded() aufrufen, ruft die Vermittlung getBannerView() auf, um die Banneransicht Ihres Werbenetzwerks auf dem Bildschirm anzuzeigen. Kehren Sie einfach zu der Banneransicht zurück, die Sie in requestBannerAd() erstellt haben:

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

Ereignisse im Aktivitätslebenszyklus

Wenn der App-Entwickler die Vermittlung über die Aktivitätsereignisse onPause() und onResume() informiert, wird der Adapter durch die Vermittlung über die Aktivitätsereignisse benachrichtigt. Pausieren Sie das Banner und setzen Sie es fort:

@Override
public void onPause() {
}

@Override
public void onResume() {
}

Das Beispielwerbenetzwerk enthält keinen Pausen- oder Fortsetzungsaufruf und stellt daher eine leere Implementierung bereit.

Bei der Vermittlung wird versucht, onDestroy() aufzurufen, wenn der Adapter gelöscht werden soll. Führen Sie hier alle erforderlichen Bereinigungen durch:

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

Smart-Banner

Das Google Mobile Ads SDK unterstützt Smart-Banner-Anzeigen in voller Breite und mit variabler Höhe, je nach Größe des Geräts.

Um die Anzeigengröße eines Smart-Banners genau zu ermitteln, sollte Ihr Adapter adSize.getWidthInPixels(context) verwenden, um die Breite zu erhalten, und adSize.getHeightInPixels(context) anstelle von adSize.getHeight(), um die Höhe zu erhalten. Er sollte dann durch die Gerätedichte dividiert werden:

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

In einer Anzeigenanfrage können Sie dann widthInDp und heightInDp als Größe verwenden.

Fertig! Sie haben jetzt einen funktionierenden Vermittlungsadapter für Banner. Eine vollständige Implementierung des SampleAdapter findest du hier.

Interstitial-Adapter implementieren

Die Adapterimplementierung für Interstitial-Anzeigen ähnelt der von Banneranzeigen. Um einen Adapter zu implementieren, der Interstitial-Anzeigen unterstützt, müssen Sie eine Klasse erstellen, die MediationInterstitialAdapter implementiert:

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() {}
}

Wenn Ihr Adapter auch Banner unterstützt, können Sie dieselbe Adapterklasse verwenden, um beide Schnittstellen zu implementieren.

Machen Sie sich jetzt mit Serverparametern und Vermittlungsfunktionen vertraut, bevor Sie mit der Implementierung von MediationInterstitialAdapter fortfahren.

Serverparameter (Interstitial)

Weitere Informationen finden Sie im Abschnitt Parameter für Bannerserver.

Zusätzliche Targeting-Parameter (Interstitial)

Weitere Informationen finden Sie im Bereich Zusätzliche Targeting-Parameter für Banner.

Extras zur Vermittlung (Interstitial)

Weitere Informationen finden Sie im Abschnitt Extras für die Bannervermittlung.

requestInterstitialAd

Die Methode requestInterstitialAd() wird unmittelbar nach der Instanziierung des Adapters aufgerufen. Hier sollten Sie Ihre Interstitial-Anzeige erstellen und eine Interstitial-Anzeige anfordern.

Eine Implementierung von requestInterstitialAd() für das Beispielwerbenetzwerk würde so aussehen:

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

Gehen Sie nicht davon aus, dass der Kontextparameter vom Typ „Aktivität“ ist. Bei der Google Mobile Ads-Vermittlung wird der vom App-Entwickler übergebene Kontext weitergeleitet. Es ist möglich, dass ein Anwendungskontext übergeben wird. Wenn Ihr Adapter einen Anwendungskontext nicht verarbeiten kann, empfiehlt es sich, onAdFailedToLoad mit dem Fehlercode AdRequest.ERROR_CODE_INVALID_REQUEST aufzurufen.

MediationInterstitialListener-Callbacks

Sie sollten die in requestInterstitialAd bereitgestellte MediationInterstitialListener speichern, damit Sie Anzeigenereignisse zurück an die Google Mobile Ads-Vermittlung weiterleiten können. Jeder Callback muss zur richtigen Zeit im Lebenszyklus der Anzeige ausgelöst werden:

Methode Wann Sie anrufen sollten
onAdLoaded Die Interstitial-Anfrage wurde erfolgreich ausgeführt.
onAdFailedToLoad Die Interstitial-Anfrage ist fehlgeschlagen.
onAdOpened Das Interstitial wird eingeblendet.
onAdClosed Das Interstitial ist geschlossen.
onAdLeftApplication Das Interstitial führt dazu, dass der Nutzer die App verlässt.

showInterstitial

Nach dem Aufruf von MediationInterstitialListener.onAdLoaded() sollte die Interstitial-Anzeige erst eingeblendet werden, wenn showInterstitial() aufgerufen wird. Der App-Entwickler entscheidet, wann die Interstitial-Anzeige eingeblendet wird. Dies kann einige Minuten nach der Anforderung dauern.

Die Implementierung für showInterstitial() ist ziemlich einfach. Zeigen Sie einfach Ihr Interstitial-Objekt an:

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

Ereignisse im Aktivitätslebenszyklus (Interstitial)

Weitere Informationen finden Sie im Abschnitt Lebenszyklusereignisse der Banneraktivität.

Nachdem Sie Ereignisse im Lebenszyklus der Aktivität implementiert haben, kann Ihr Vermittlungsadapter Interstitial-Anzeigen verarbeiten. Eine vollständige Implementierung des SampleAdapters findest du hier.

Häufig gestellte Fragen

Was mache ich, wenn mein Adapter nur Banner- oder Interstitial-Anzeigen unterstützt, aber nicht beides?

Wenn Ihr Adapter nur Banner unterstützt, müssen Sie nur die Schnittstelle MediationBannerAdapter implementieren. Wenn Ihr Adapter nur Interstitials unterstützt, müssen Sie nur die Schnittstelle MediationInterstitialAdapter implementieren.