ネイティブ広告のカスタム イベント

前提条件

カスタム イベントの設定を完了します。

ネイティブ広告をリクエストする

ウォーターフォール メディエーション チェーンでカスタム イベント広告申込情報に到達すると、 次のコマンドを実行すると、指定したクラス名で loadNativeAd() メソッドが呼び出されます。 カスタム テーブルを作成する イベントをご覧ください。この例では このメソッドは SampleCustomEvent にあり、 SampleNativeCustomEventLoaderloadNativeAd() メソッド。

ネイティブ広告をリクエストするには、Adapter を拡張するクラスを作成または変更して、 loadNativeAd() を実装する。Adapter を拡張するクラスがすでに存在する場合、 そこで loadNativeAd() を実装します。さらに、新しいクラスを作成して実装し、 UnifiedNativeAdMapper

このカスタム イベントの例では、 SampleCustomEventAdapter クラスを拡張してから、デリゲートします。 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 は次のタスクを行います。

  • ネイティブ広告を読み込んでいます。

  • UnifiedNativeAdMapper クラスを実装する。

  • 広告イベント コールバックを受信して Google Mobile Ads SDK に送ります。

アド マネージャーの UI で定義されているオプション パラメータは、 広告設定に含まれていますこのパラメータには、 adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD)。 このパラメータは通常、広告ネットワーク SDK で実装される 渡す必要があります。

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

広告が正常に取得されたか、エラーが発生したかに応じて、 呼び出すと、 onSuccess() または onFailure()onSuccess() は、次の実装を実装するクラスのインスタンスを渡すことで呼び出されます。 MediationNativeAd

通常、これらのメソッドは 実装する必要があります。この例では、サンプル SDK が 関連するコールバックを含む SampleAdListener がある

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

ネイティブ広告をマッピングする

SDK ごとに、ネイティブ広告用の独自のフォーマットがあります。別のユーザーが 「title」を含むオブジェクト別のフィールドを別のフィルタに 「headline」。また、インプレッションのトラッキングと SDK ごとにクリック数は異なります。

UnifiedNativeAdMapper はこれらの差異を調整し、 メディエーションされる SDK のネイティブ広告オブジェクトを、 Google Mobile Ads SDK を使用しますカスタム イベントはこのクラスを拡張して、 独自のマッパーが用意されますサンプル広告マッパーが 次のサンプル カスタム イベント プロジェクトを使用します。

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

次に、コンストラクタ コードを詳しく見てみましょう。

メディエーション向けネイティブ広告オブジェクトへの参照を保持する

コンストラクタは、SampleNativeAd パラメータ(使用するネイティブ広告クラス)を受け取ります。 サンプル SDK によってネイティブに処理されますマッパーには、 クリック イベントとインプレッション イベントを渡すようにする必要があります。SampleNativeAd は ローカル変数として格納されます。

マッピングされたアセット プロパティを設定する

コンストラクタは、SampleNativeAd オブジェクトを使用して、 UnifiedNativeAdMapper

このスニペットでは、メディエーションが行われた広告の価格データを取得し、それを使用してマッパーの広告の価格を 価格:

Java

if (sampleAd.getPrice() != null) {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    String priceString = formatter.format(sampleAd.getPrice());
    setPrice(priceString);
}

この例では、メディエーションされる広告では価格が double として保存されますが、 アド マネージャーでは、同じアセットに String が使用されます。「 マッパーがこれらのタイプのコンバージョンを処理します。

画像アセットをマッピングする

画像アセットのマッピングは、次のようなデータ型のマッピングよりも複雑です。 double または String。画像は自動的にダウンロードされるか、 URL 値として返されます。ピクセルから dpi へのスケーリングもさまざまです。

Google Mobile Ads SDK では、こうした細かい設定を簡単に管理できるよう、 NativeAd.Image クラス。これと同じように、サブクラスを作成して を UnifiedNativeAdMapper でマッピングするには、メディエーションされるネイティブ広告をマッピングする場合、 画像アセットをマッピングする場合の NativeAd.Image のサブクラス。

カスタム イベントの SampleNativeMappedImage クラスの例を以下に示します。

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

SampleNativeAdMapper は、この行にマッピングされた画像クラスを使用して、 マッパーのアイコン画像アセット:

Java

setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(),
    SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));

エクストラ バンドルにフィールドを追加する

メディエーションされる SDK によっては、 アド マネージャーのネイティブ広告フォーマットですUnifiedNativeAdMapper クラスに含まれる setExtras() メソッドを使用すると、アセットを ありますSampleNativeAdMapper は、サンプル SDK の 「レベルの素晴らしさ」asset:

Java

Bundle extras = new Bundle();
extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness());
this.setExtras(extras);

パブリッシャーは、NativeAd クラスを使用してデータを取得できます。getExtras() メソッドを呼び出します。

AdChoices

カスタム イベントは、 UnifiedNativeAdMappersetAdChoicesContent() メソッド。こちらが AdChoices アイコンを提供する方法を示す SampleNativeAdMapper:

Java

public SampleNativeAdMapper(SampleNativeAd ad) {
    ...
    setAdChoicesContent(sampleAd.getInformationIcon());
}

インプレッション イベントとクリック イベント

Google Mobile Ads SDK とメディエーション向け SDK の両方とも、 インプレッションまたはクリックが発生しますが、これらのイベントをトラッキングする必要がある SDK は 1 つだけです。そこで、 カスタム イベントで使用できる 2 種類のアプローチは、 メディエーション向け SDK は、インプレッションとクリックの独自のトラッキングをサポートしています。

Google Mobile Ads SDK を使ってクリックとインプレッションをトラッキングする

メディエーション向け SDK が独自のインプレッションとクリックのトラッキングを実行せず、 クリックとインプレッションを記録するメソッドを提供するため、Google Mobile Ads SDK では 追跡してアダプタに通知します「 UnifiedNativeAdMapper クラスには、次の 2 つのメソッドが含まれます。 recordImpression()handleClick() カスタム イベントは、メディエーションされる ネイティブ広告オブジェクト:

Java

@Override
public void recordImpression() {
  sampleAd.recordImpression();
}

@Override
public void handleClick(View view) {
  sampleAd.handleClick(view);
}

SampleNativeAdMapper がサンプル SDK のネイティブへのリファレンスを保持しているため そのオブジェクトの適切なメソッドを呼び出して、クリックをレポートできます。 です。handleClick() メソッドは 単一パラメータ: 広告アセットに対応する View オブジェクト 確認しました

メディエーション向け SDK でクリックとインプレッションをトラッキングする

メディエーション向け SDK の中には、クリックとインプレッションを独自にトラッキングしたいものがあります。イン デフォルトのクリックとインプレッションのトラッキングを 次の 2 つの呼び出しを、 UnifiedNativeAdMapper:

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

クリックとインプレッションのトラッキングをオーバーライドするカスタム イベントは、 onAdClicked() イベントと onAdImpression() イベントを Google モバイルに報告する 。

インプレッションとクリックをトラッキングするには、メディエーションされる SDK がおそらく ビューに移動してトラッキングを有効にしますカスタム イベントは trackViews() メソッドを呼び出し、これを使用してネイティブ広告のビューをメディエーション対象 追跡する SDKカスタム イベント サンプル プロジェクトのサンプル SDK( (このガイドのコード スニペットは使用されている)では、このアプローチは使用していません。でも、 変更された場合、カスタム イベントコードは次のようになります。

Java

@Override
public void trackViews(View containerView,
    Map<String, View> clickableAssetViews,
    Map<String, View> nonClickableAssetViews) {
  sampleAd.setNativeAdViewForTracking(containerView);
}

メディエーション向け SDK が個々のアセットのトラッキングをサポートしている場合、その SDK は内部 clickableAssetViews: クリック可能にするビューを確認します。この地図は NativeAdAssetNames のアセット名をキーにしています。UnifiedNativeAdMapper カスタム イベントによってオーバーライドできる、対応する untrackView() メソッドが用意されている ビューへの参照をすべて解放してネイティブ広告との関連付けを解除する 渡されます。

メディエーション イベントを Google Mobile Ads SDK に転送する

メディエーションでサポートされているすべてのコールバックは、 MediationNativeAdCallback ドキュメント

カスタム イベントは、できるだけ多くのコールバックを これにより、アプリはこれらの同等のイベントを Google Mobile Ads SDK があります。コールバックの使用例を次に示します。

これで、ネイティブ広告のカスタム イベントの実装が完了しました。サンプル全体 は GitHub