広告ネットワーク メディエーション アダプタの開発

このガイドは、メディエーション アダプタの構築を検討している広告ネットワークを対象としています。 パブリッシャー様は、パブリッシャー様向けのメディエーション手順をご覧ください。

広告ネットワーク アダプタは、広告ネットワークと Google モバイル広告メディエーションの間の通信レイヤです。

アダプタは、バナー広告をサポートする MediationBannerAdapter と、インタースティシャル広告をサポートする MediationInterstitialAdapter を実装します。また、適切なタイミングで MediationBannerListenerMediationInterstitialListener のコールバックを呼び出して、Google モバイル広告メディエーションにこれらのイベントを通知する必要があります。イベントはデベロッパーに転送することもできます。

サンプル広告ネットワーク

このガイドでは、サンプル広告ネットワーク用のアダプタの作成方法を説明します。サンプル広告ネットワークには、ほとんどの広告ネットワークで提供されているクラスの代表的な次のクラスが含まれています。

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

これらのクラスの詳細については、SDK の実装全体をご覧ください。

バナー アダプタを実装する

バナー広告をサポートするアダプタを実装するには、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() {}
}

MediationBannerAdapter の実装に入る前に、サーバーのパラメータやメディエーション エクストラ、それらの値をアダプタに渡す方法について説明します。

サーバー パラメータ

多くの場合、広告ネットワークではパブリッシャーを識別するために識別子が必要になります。たとえば、このサンプル広告ネットワークで必要なのは広告ユニットのみです。これらの必須パラメータは、requestBannerAd() 内の serverParameters バンドルで提供されます。開発中は、必要なキーがバンドルにすでに入力されていると見なすことができます。

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 から、広告をリクエストして配信するために必要なサーバー パラメータをパブリッシャーに尋ねるアンケートが送信されます。AdMob は、その入力を使用して AdMob 管理画面でネットワークを設定します。次のスクリーンショットは、Millennial Media には APID が、InMobi には App ID が必須であることを示しています。

AdMob は、アダプタをインスタンス化する際に、この情報を使用して serverParameters バンドルに値を入力します。

パブリッシャー様がメディエーション広告ネットワークを設定する方法について詳しくは、こちらの記事をご覧ください。

追加のターゲティング パラメータ

MediationAdRequest には、次のようなターゲティングに使用できる一般的なターゲティング情報が含まれています。

メディエーションの追加パラメータ

広告ネットワークが、MediationAdRequest では提供されないターゲティング情報をサポートしている場合、アプリ デベロッパーは、ご利用のネットワークに専用の mediationExtras のバンドルを渡すことができます。メディエーションは、メディエーションの追加パラメータを渡す方法の一例を提供します。

デベロッパーがこの情報を必要に応じて簡単に受け渡すには、アダプタにバンドル ビルダー クラスを指定します。ネットワークで収入の値の受け渡しが サポートされているとしますアダプタには、収入を設定するビルダークラスを追加できます。

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

このクラスは、デベロッパーがネットワークのバンドルを生成するためのクリーンな API を提供します。

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

requestBannerAd()

サーバーのパラメータとメディエーション エクストラについて理解したところで、それらを使用して MediationBannerAdapter を作成します。

アダプターがインスタンス化された直後に、requestBannerAd() メソッドが呼び出されます。このページで、広告ビューを作成してバナー広告をリクエストします。

サンプル広告ネットワーク用に requestBannerAd() を実装すると、次のようになります。

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

コンテキスト パラメータのタイプが Activity であることを前提としないでください。Google モバイル広告メディエーションは、パブリッシャーの実装内容に応じて、アプリのコンテキストをアダプタに転送する場合があります。アダプタがアプリ コンテキストを処理できない場合は、エラーコード AdRequest.ERROR_CODE_INVALID_REQUEST を指定して onAdFailedToLoad() を呼び出すことをおすすめします。

MediationBannerListener コールバック

提供された MediationBannerListenerrequestBannerAd() に保存し、広告イベントを元の Google モバイル広告メディエーションに転送できるようにします。各コールバックは、広告のライフサイクルの適切なタイミングで呼び出す必要があります。

メソッド 電話をかけるタイミング
onAdLoaded() バナー リクエストが成功しました。
onAdFailedToLoad() バナー リクエストに失敗しました。
onAdClicked() バナーがクリックされた。
onAdOpened() バナーが全画面表示されています。
onAdClosed() ユーザーがバナーをクリックした後、アプリに戻った。
onAdLeftApplication() バナーを表示するとユーザーはアプリから離れます。

サンプル広告ネットワーク アダプタは、イベント転送を処理するために SampleBannerEventForwarder というクラスを作成します。

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

サンプル広告ネットワーク アダプタが、同じコールバックで onAdClickedonAdOpenedonAdLeftApplication をどのように送信したかに注目してください。ネットワークのコールバックが、Google モバイル広告が必要とするコールバックと正確に一致しない場合でも、アダプタ側で適切なマッピングを提供する必要があります。

getBannerView

MediationBannerListener.onAdLoaded() を呼び出すと、メディエーションによって getBannerView() が呼び出され、広告ネットワークのバナービューが画面に表示されます。requestBannerAd() で作成したバナービューを返すだけです。

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

アクティビティのライフサイクル イベント

アプリ デベロッパーがメディエーションにイベントを通知した場合、メディエーションは、onPause() および onResume() アクティビティ イベントをアダプタに通知します。必要に応じて、バナーの一時停止と再開を行います。

@Override
public void onPause() {
}

@Override
public void onResume() {
}

サンプル広告ネットワークには一時停止または再開の呼び出しがないため、空の実装が提供されています。

アダプタが破棄される際、メディエーションは可能な限り onDestroy() を呼び出そうとします。必要なクリーンアップはここで行います。

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

スマートバナー

Google Mobile Ads SDK では、全幅、デバイスのサイズに応じて高さが変わるスマートバナーの広告サイズがサポートされています。

スマートバナーの広告サイズを正確に取得するには、アダプタで adSize.getWidthInPixels(context) を使用して幅を取得し、高さを取得する adSize.getHeight() ではなく adSize.getHeightInPixels(context) を使用する必要があります。これをデバイス密度で割ります。

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

そうすると、広告リクエストを行うときにサイズとして widthInDpheightInDp を使用できます。

これで、これで、バナー用のメディエーション アダプタが機能するようになりました。SampleAdapter の実装全体については、こちらをご覧ください。

インタースティシャル アダプタを実装する

インタースティシャル広告のアダプタの実装は、バナー広告と同様です。インタースティシャル広告をサポートするアダプタを実装するには、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() {}
}

アダプタがバナーもサポートしている場合は、同じアダプタクラスを使用して両方のインターフェースを実装できます。

MediationInterstitialAdapter の実装に進む前に、サーバーのパラメータとメディエーション エクストラについてよく理解しておいてください。

サーバー パラメータ(インタースティシャル)

バナーのサーバー パラメータ セクションをご覧ください。

追加のターゲティング パラメータ(インタースティシャル)

バナーの追加ターゲティング パラメータ セクションをご覧ください。

メディエーションの追加パラメータ(インタースティシャル)

バナーのメディエーションの追加パラメータをご覧ください。

requestInterstitialAd

アダプターがインスタンス化された直後に、requestInterstitialAd() メソッドが呼び出されます。この場合、インタースティシャル広告を作成し、インタースティシャル リクエストを実行します。

サンプル広告ネットワーク用に requestInterstitialAd() を実装すると、次のようになります。

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

コンテキスト パラメータのタイプが Activity であることを想定しないでください。Google モバイル広告メディエーションは、アプリ デベロッパーから渡されたコンテキストを転送します。また、アプリのコンテキストも渡される可能性があります。アダプタがアプリ コンテキストを処理できない場合は、エラーコード AdRequest.ERROR_CODE_INVALID_REQUEST を指定して onAdFailedToLoad を呼び出すことをおすすめします。

Mediation インタースティシャル Listener コールバック

提供された MediationInterstitialListenerrequestInterstitialAd に保存し、広告イベントを Google モバイル広告メディエーションに再び転送できるようにします。各コールバックは、広告ライフサイクルの適切なタイミングで呼び出す必要があります。

メソッド 電話をかけるタイミング
onAdLoaded インタースティシャル リクエストが成功しました。
onAdFailedToLoad インタースティシャル リクエストに失敗しました。
onAdOpened インタースティシャルが表示されています。
onAdClosed インタースティシャルが閉じている。
onAdLeftApplication ユーザーがインタースティシャルを表示すると、そのユーザーが離れる。

showInterstitial

MediationInterstitialListener.onAdLoaded() を呼び出したら、showInterstitial() が呼び出されるまでインタースティシャルの表示を待機します。インタースティシャルを表示するタイミングはアプリ デベロッパーが決定します。インタースティシャル広告がリクエストされてから数分かかる場合があります。

showInterstitial() の実装は非常に簡単です。インタースティシャル オブジェクトを表示するだけです。

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

アクティビティのライフサイクル イベント(インタースティシャル)

バナーのアクティビティのライフサイクル イベントをご覧ください。

アクティビティのライフサイクル イベントを実装すると、メディエーション アダプタでインタースティシャル広告を処理できるようになります。SampleAdapter の実装全体については、こちらをご覧ください。

よくある質問

アダプタがバナー広告とインタースティシャル広告の両方をサポートしておらず、両方をサポートできない場合はどうすればよいですか?

バナーのみをアダプタでサポートする場合、必要なのは MediationBannerAdapter インターフェースの実装のみです。インタースティシャルのみをアダプタでサポートする場合、実装する必要があるのは MediationInterstitialAdapter インターフェースのみです。