前提条件
カスタム イベントのセットアップを完了します。
ネイティブ広告をリクエストする
ウォーターフォール メディエーション チェーンでカスタム イベント広告申込情報に到達すると、
次のコマンドを実行すると、指定したクラス名で loadNativeAd()
メソッドが呼び出されます。
カスタム テーブルを作成する
イベントをご覧ください。この場合、メソッドは SampleCustomEvent
にあり、SampleNativeCustomEventLoader
で loadNativeAd()
メソッドを呼び出します。
ネイティブ広告をリクエストするには、Adapter
を拡張するクラスを作成または変更して、
loadNativeAd()
を実装する。Adapter
を拡張するクラスがすでに存在する場合、
そこで loadNativeAd()
を実装します。さらに、新しいクラスを作成して実装し、
UnifiedNativeAdMapper
。
カスタム イベントの例では、
SampleCustomEvent
は Adapter
クラスを拡張してから、デリゲートします。
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 に報告する。
AdMob の管理画面で定義されたオプション パラメータが広告設定に含まれます。このパラメータには、
adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD)
。
このパラメータは通常、広告オブジェクトをインスタンス化する際に広告ネットワーク SDK が要求する広告ユニット ID です。
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
。
通常、これらのメソッドは
実装する必要があります。この例では、関連するコールバックを含む SampleAdListener
が「Sample SDK」に含まれています。
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 を使用しますカスタム イベントによりこのクラスが拡張され、メディエーション向け 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. } }
次に、コンストラクタ コードを詳しく見てみましょう。
メディエーション向けネイティブ広告オブジェクトへの参照を保持する
コンストラクタは、サンプル SDK がネイティブ広告用に使用するネイティブ広告クラスである SampleNativeAd
パラメータを受け取ります。マッパーには、
クリック イベントとインプレッション イベントを渡すようにする必要があります。SampleNativeAd
はローカル変数として保存されます。
マッピングされたアセット プロパティを設定する
コンストラクタは SampleNativeAd
オブジェクトを使用して、アセットを UnifiedNativeAdMapper
に自動入力します。
このスニペットは、メディエーション対象広告の価格データを取得し、そのデータを使ってマッパーの価格を設定します。
Java
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
この例では、メディエーションされる広告では価格が double
として保存されますが、
AdMob では、同じアセットに 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 によっては、
AdMob ネイティブ広告フォーマット。UnifiedNativeAdMapper
クラスには、これらのアセットをパブリッシャーに渡すために使用される setExtras()
メソッドが含まれています。SampleNativeAdMapper
では、これが、サンプル SDK の「degree of awesomeness」アセットに対して使用されます。
Java
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
パブリッシャーは、NativeAd
クラスを使用してデータを取得できます。getExtras()
メソッドを呼び出します。
AdChoices
カスタム イベントは、
UnifiedNativeAdMapper
の setAdChoicesContent()
メソッド。SampleNativeAdMapper
から抜粋した次のスニペットは、AdChoices アイコンを提供する方法を示しています。
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 の中には、クリックとインプレッションを独自にトラッキングしたいものがあります。その場合は、UnifiedNativeAdMapper
のコンストラクタで次の 2 つの呼び出しを行うことによって、デフォルトのクリックとインプレッションのトラッキングをオーバーライドする必要があります。
Java
setOverrideClickHandling(true); setOverrideImpressionRecording(true);
クリックとインプレッションのトラッキングをオーバーライドするカスタム イベントは、onAdClicked()
イベントと onAdImpression()
イベントを Google Mobile Ads SDK に報告する必要があります。
インプレッションとクリックをトラッキングするには、メディエーションされる SDK がおそらく
ビューに移動してトラッキングを有効にしますカスタム イベントは
trackViews()
メソッドを呼び出し、これを使用してネイティブ広告のビューをメディエーション対象
追跡する SDKこのアプローチは、カスタム イベントのサンプル プロジェクト(このガイドのコード スニペットの取得元)のサンプル SDK では使用されませんが、仮に使用される場合、カスタム イベントのコードは次のようになります。
Java
@Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { sampleAd.setNativeAdViewForTracking(containerView); }
メディエーション向け SDK が個々のアセットのトラッキングをサポートしている場合、clickableAssetViews
内でどのビューをクリック可能にする必要があるかを確認できます。この地図は
NativeAdAssetNames
のアセット名をキーとする。UnifiedNativeAdMapper
には対応する untrackView()
メソッドが用意されており、カスタム イベントはこのメソッドをオーバーライドしてビューへの参照をすべて解放し、ネイティブ広告オブジェクトとの関連付けを解除します。
メディエーション イベントを Google Mobile Ads SDK に転送する
メディエーションでサポートされているすべてのコールバックは、
MediationNativeAdCallback
ドキュメント。
カスタム イベントは、できるだけ多くのコールバックを これにより、アプリはこれらの同等のイベントを Google Mobile Ads SDK があります。コールバックの使用例を次に示します。
これで、ネイティブ広告のカスタム イベントの実装が完了しました。サンプル全体は GitHub で入手できます。