入札アダプターの開発

このガイドは、入札アダプタを構築する必要がある広告ネットワークを対象としています Google メディエーションでリアルタイム ビッダー(RTB)を利用する場合。もし パブリッシャーの方は、パブリッシャー メディエーションをご確認ください。 できます。

入札アダプタは、統合のクライアントサイドの一部です。アダプター これにより、広告ネットワーク SDK が Google Mobile Ads SDK と通信して、 ビッダーから配信された広告を読み込むことができます。

入札を正しく機能させるには、 初期化、シグナルの収集、広告の読み込み、広告ライフサイクルのリレー できます。このガイドでは、アダプターを使用する方法についても これらのオペレーションを処理するために実装されています。

入札アダプタのワークフロー

初期化

request-response-rendering ライフサイクル全体の詳細なフロー 以下に示しています。

アダプタが担う、ワークフローの以下の部分。

  • ステップ 4 ~ 7: アダプタを初期化して Google Mobile Ads SDK をコールバックする 初期化の完了後です。

  • ステップ 10 ~ 13: 広告ネットワークの SDK からシグナルを収集して、 ビッダーが RTB リクエストに参加し、Google モバイル 。

  • ステップ 18 ~ 21: ビッダーから落札単価が返されたら、 レスポンスを追加します読み込まれたら、Google Mobile Ads SDK に通知します。 広告が読み込まれました

  • ステップ 23 以降: 広告が表示されている間に、Google モバイル広告に通知 インプレッション イベント、クリック イベント、および発生するその他の広告イベントの SDK 広告のライフサイクル全体を通して

で確認できます。

入札アダプタの実装

Google Mobile Ads SDK の入札アダプタを作成するには、以下の要件を満たしている必要があります。 RtbAdapter 抽象クラスを拡張します。以下のセクション RtbAdapter の各抽象メソッドを説明する。

getSDKVersionInfo()

ここでは、SDK のバージョンが返されます。このバージョンは OpenRTB リクエストの一部として追加します。

このメソッドでは、VersionInfo を返す必要があります。以下の例は、 SDK の文字列バージョンを VersionInfo. に変換できます。

@Override
public VersionInfo getSDKVersionInfo() {
  // Get your SDK's version as a string. E.g. "1.2.3"
  // String versionString = YourSdk.getVersion();
  String splits[] = versionString.split("\\.");
  if (splits.length >= 3) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]);
      return new VersionInfo(major, minor, micro);
   }

   String logMessage = String.format("Unexpected SDK version format: %s." +
           "Returning 0.0.0 for SDK version.", sdkVersion);
   Log.w(TAG, logMessage);
   return new VersionInfo(0, 0, 0);
}

getVersionInfo()

ここでは、アダプタのバージョンが返されます。このバージョンは OpenRTB リクエストの一部として追加します。

Google のオープンソースとバージョニング アダプター 4 桁のアダプター バージョン スキームを使用しているが、VersionInfo では 3 つしか使用できない あります。この問題を回避するには、末尾の 2 桁を 次のようにパッチ バージョンに追加します。

@Override
public VersionInfo getVersionInfo() {
  // Get your adapters's version as a string. E.g. "1.2.3.0"
  String versionString = BuildConfig.VERSION_NAME;
  String splits[] = versionString.split("\\.");
  if (splits.length >= 4) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]) * 100 + Integer.parseInt(splits[3]);
      return new VersionInfo(major, minor, micro);
    }

    String logMessage = String.format("Unexpected adapter version format: %s." +
                "Returning 0.0.0 for adapter version.", versionString);
    Log.w(TAG, logMessage);
    return new VersionInfo(0, 0, 0);
}

initialize()

タイムアウト: 30 秒

initialize() メソッドは、アダプタで呼び出される最初のメソッドです。内容 セッションごとに 1 回だけ呼び出されます。このメソッドを使用すると、 完全なリストを表す MediationConfiguration オブジェクト 広告ネットワーク用に設定されているこのアプリ内のプレースメントループ 各プレースメントの認証情報を解析し 関連するデータを SDK に渡して初期化します。

SDK が初期化され、広告リクエストを受信する準備が整ったら、 InitializationCompleteCallbackonInitializationSucceeded() メソッド。 このコールバックはアプリのパブリッシャーに転送され、 広告の読み込みを開始できます

@Override
public void initialize(Context context,
    InitializationCompleteCallback initializationCompleteCallback,
    List<MediationConfiguration> mediationConfigurations) {
  // Initialize your ad network's SDK.
  ...

  // Invoke the InitializationCompleteCallback once initialization completes.
  initializationCompleteCallback.onInitializationSucceeded();
}

collectSignals()

タイムアウト: 1 秒

パブリッシャーが広告をリクエストするたびに、RtbAdapter の新しいインスタンスが 作成され、collectSignals() メソッドが呼び出されます。このインスタンスの RtbAdapter は、広告リクエスト、レスポンス、 表示ライフサイクルを管理できますcollectSignals() メソッドを使用すると、 を使用して、ビッダーに送信するデバイスからのシグナルを OpenRTB リクエスト。

collectSignals() はバックグラウンド スレッドで呼び出されます。 Google Mobile Ads SDK がすべてのアダプタからのシグナルを同時にリクエストする 入札に参加すると敬意を払い、UI スレッドへの呼び出しは制限してください 表示されます。データの収集のためにアダプタや SDK が行う必要がある負荷の大きい作業 シグナルを initialize() メソッドで作成し、キャッシュに保存する必要があります。

シグナルの準備ができたら、onSuccess() コールバックを呼び出します。 生成します。

実装例を次に示します。

@Override
public void collectSignals(RtbSignalData rtbSignalData,
                           SignalCallbacks signalCallbacks) {
  String signals = YourSdk.getSignals();
  signalCallbacks.onSuccess(signals);
}

アダプターがシグナルを収集できない場合は、signalCallbacks.onFailure() を呼び出します。 発生したエラーを説明する文字列が出力されます。

広告の読み込みメソッドを実装する

タイムアウト: 10 秒

ビッダーが落札単価を返すと、Google Mobile Ads SDK がアダプタを呼び出して落札広告を読み込み、 その広告を読み込む必要があるというメッセージがビッダーから返されます

呼び出される読み込みメソッドは広告によって異なります。 リクエストの形式:

広告フォーマット 読み込み方法
バナー loadBannerAd()
インタースティシャル loadInterstitialAd()
リワード loadRewardedAd()

アダプタがサポートする広告フォーマットに、これらのメソッドを実装します。

load メソッドは、インスタンスの同じインスタンスの UI スレッドで呼び出されます。 シグナルを提供したアダプターです。この方法には次の特徴があります。 parameters:

  • MediationAdConfiguration: SDK に必要なパラメータが含まれています。 落札した広告の広告を読み込む(入札レスポンスや認証情報など) AdMob 管理画面で設定したパブリッシャー。

  • Google Mobile Ads SDK への通知に使用する MediationAdLoadCallback オブジェクト 読み込みが成功したか失敗したかを示します。

SDK が広告を読み込んだら、mediationAdLoadCallback.onSuccess() を呼び出します。 イベント広告の読み込みが失敗した場合は、mediationAdLoadCallback.onFailure() を 発生したエラーを説明する文字列です。

mediationAdLoadCallback.onSuccess() メソッドでは、 「Ad」オブジェクトで確認応答しますGoogle モバイル デバイスと 。これらの広告インターフェースでは、広告に関する情報の入力を求められます。

MediationAdConfiguration には getWatermark() もあります メソッドを使用して、PNG 画像を表す base64 でエンコードされた文字列を返します。この画像 透明なオーバーレイで広告上にタイル表示する。 透かしのレンダリング方法に関するその他のガイダンスについては、Google にお問い合わせください。 このフィールドには、表示されている広告に関するメタデータが含まれており、パブリッシャーがこれに基づいて判断できます。 表示された広告のソース

バナーの場合は、バナービューを提供するよう求められます。インタースティシャルと 場合、広告を次の場所に表示する show() メソッドを実装するよう求められます。 できます。ベスト プラクティスとして、クラスは 広告の読み込みもこれらの広告メソッドの実装を担います。

loadBannerAd() の実装例を次に示します。留意点 実装の見た目が異なることに留意してください。 別の SDK と統合できます。

public final class SampleRtbAdapter extends RtbAdapter {
  ...

  @Override
  public void loadBannerAd(
      MediationBannerAdConfiguration adConfiguration,
      MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> callback) {

      SampleBannerRenderer bannerRenderer =
          new SampleBannerRenderer(adConfiguration, callback);
      bannerRenderer.render();
    }
}

// Renders a banner ad, and forwards callbacks to the Google Mobile Ads SDK.
public class SampleBannerRenderer implements MediationBannerAd {
  private MediationBannerAdConfiguration adConfiguration;
  private final MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback;
  private AdView adView;
  private MediationBannerAdCallback callback;

  public SampleRtbBannerRenderer(
      MediationBannerAdConfiguration adConfiguration,
      MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback) {
    this.adConfiguration = adConfiguration;
    this.adLoadCallback = adLoadCallback;
  }

  public void render() {
    adView = new AdView(adConfiguration.getContext());
    adView.setAdSize(adConfiguration.getAdSize());
    // serverParameters are the parameters entered in the AdMob UI for your network.
    adView.setAdUnitId(adConfiguration.getServerParameters().getString("adUnitId"));

    // Map the callbacks from your SDK to Google's SDK.
    adView.setAdListener(new AdListener() {
      // See the next step for more information on callback mapping.
      // ...
    });

    // Get the bid response and watermark from the ad configuration and
    // pass the relevant information to your SDK.
    String ad = adConfiguration.getBidResponse();
    String watermark = adConfiguration.getWatermark();
    Bundle extras = new Bundle();
    extras.putString("bid", ad);
    extras.putString("watermark", watermark);
    AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();
    adView.loadAd(request);
  }

  // MediationBannerAd implementation

  @NonNull
  @Override
  public View getView() {
    return adView;
  }
}

広告表示のライフサイクル イベントをリレーする

アダプタの最後の役割は、Google Mobile Ads SDK に通知することです。 プレゼンテーション ライフサイクル イベントを あります。パブリッシャーは、これらのコールバックが特定の時間に発生することを想定しています。 どの広告ネットワークで広告が配信されます コールバックが可能な限り適切なタイミングで呼び出されるようにすることで、 Mobile Ads SDK からパブリッシャーに転送できます。

アダプタは、該当する場合、次のイベントを呼び出す必要があります。

すべてのフォーマットに共通
方法 いつ電話をかけるか
reportAdClicked() 広告がクリックされた。
reportAdImpression() 広告が表示された
onAdOpened() 広告がフルスクリーン ビューで表示された。
onAdClosed() 広告のフルスクリーン ビューが閉じられた。
onAdLeftApplication() ユーザーが広告経由でアプリから離脱した。
リワード広告
onRewarded() ユーザーに報酬が付与される。
動画コールバック(リワード広告とネイティブ広告)
onVideoStarted() 広告の動画が再生された。
onVideoCompleted() 広告の動画が最後まで再生された。

アダプターが MediationAdLoadCallback<MediationAdT, MediationAdCallbackT> を取得する。 mediationAdLoadCallback.onSuccess() の呼び出し時にオブジェクトを返すことができます。アダプターは このオブジェクトを保持し、それを使用してプレゼンテーション イベントを呼び出す 表示されます

通常、これらのイベントのほとんどは、広告ネットワークの SDK によって行われます。「 アダプタの役割は、広告ネットワーク SDK からのコールバックを Google Mobile Ads SDK

次の例は、プロバイダからコールバックを転送する SDK の広告リスナーを Google Mobile Ads SDK に追加:

adView.setAdListener(new AdListener() {
    public void onAdLoaded() {
        callback = adLoadCallback.onSuccess(SampleBannerRenderer.this);
    }

    public void onAdImpression() {
        if (callback != null) {
            callback.reportAdImpression();
        }
    }

    public void onAdFailedToLoad(LoadAdError adError) {
        adLoadCallback.onFailure("Error: " + adError.toString());
    }

    public void onAdClosed() {
        if (callback != null) {
            callback.onAdClosed();
        }
    }

    public void onAdOpened() {
        if (callback != null) {
            callback.onAdOpened();
            callback.reportAdClicked();
        }
    }

    public void onAdLeftApplication() {
        if (callback != null) {
            callback.onAdLeftApplication();
        }
    }
});

ネイティブ広告のインプレッション トラッキングに必要なアセット

Google Mobile Ads SDK では、ネイティブ広告の 1 ピクセルが 表示されます。広告ネットワーク SDK で特定のアセットを表示する必要がある場合 有効なインプレッションを表示するには 指定することもできますGoogle Mobile Ads SDK は インプレッションが記録される前に、必要なネイティブ アセットが表示されるようになっている必要があります。

ネイティブの必須アセットをご確認ください ドキュメント 入札に必要な追加のアセットを指定する方法の詳細 レスポンスが返されます。

広告エラーを表示

インタースティシャル広告やリワード広告などの全画面フォーマットの場合 コールバック関数として実装を提供します。 MediationInterstitialAd または MediationRewardedAd これにより、Google Mobile Ads SDK がアダプタに広告の表示を依頼できるようになります。

Google Mobile Ads SDK では、アダプタが広告を正常に読み込むと、 パブリッシャーが表示をリクエストしたとき、広告を表示する準備が整っている。つまり すべての番組呼び出しが インプレッションを獲得します

ただし、広告を表示できない特殊なケースもあります。もし 広告を表示できない場合、 onAdFailedToShow() インプレッションをキャンセルします

下の表は、全画面広告フォーマットのインプレッション記録にプレゼンテーション コールバックがどのように影響するかを示しています。

コールバック 結果
onAdOpened() Impression recorded
onAdFailedToShow() Impression failure1
数秒間上記のいずれでもない Impression recorded

1失敗 そのインプレッションに対して広告ネットワークは課金されませんが、 請求対象イベントレートの調整に影響します詳しくは、入札リクエスト シグナルをご覧ください。 情報です。

次のモックサンプルは、広告の読み込み/表示のライフサイクルを 失敗する可能性があります。

final class SampleRtbAdapter extends RtbAdapter implements MediationRewardedAd {

 private MediationRewardedAdCallback callback;
 private RewardedAd rewardedAd;

 ...

  @Override
  public void loadRewardedAd(
      MediationRewardedAdConfiguration adConfiguration,
      final MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback> loadCallback) {

    // Load an ad. This mock example uses Google's SDK, but in practice
    // your adapter will load the ad using your ad network's SDK.
    RewardedAd.load(adConfiguration.getContext(),
        "ca-app-pub-3940256099942544/5224354917",
        new AdRequest.Builder().build(),
        new RewardedAdLoadCallback() {
          @Override
          public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
            // When the ad loads, invoke the load success callback.
            callback = loadCallback.onSuccess(SampleRtbAdapter.this);
          }
        });
  }

  @Override
  public void showAd(Context context) {
    // In this mock example, your ad network requires an activity context, but
    // didn't receive one, making you unable to show the ad.
    if (!(context instanceof Activity)) {
      AdError error = new AdError(1, "Context must be an activity",
          "com.google.ads.mediation.sample");
      callback.onAdFailedToShow(error);
    }

    // This example shows Google SDK's callbacks, but it's likely your SDK
    // has similar presentation callbacks.
    rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
      @Override
      public void onAdShowedFullScreenContent() {
        // Your ad network SDK successfully showed the ad. Call onAdOpened().
        callback.onAdOpened();
      }

      @Override
      public void onAdFailedToShowFullScreenContent(AdError adError) {
        // Your ad network SDK failed to show the ad, invoke onAdFailedToShow.
        // In practice, you will map your SDK's error to an AdError.
        AdError error = new AdError(adError.getCode(), adError.getMessage(),
            adError.getDomain());
        callback.onAdFailedToShow(adError);
      }
    });


    rewardedAd.show((Activity) context, ...);
  }
}