Custom Native Ad Formats

カスタム ネイティブ広告フォーマット

アド マネージャーでは、システム定義のネイティブ広告フォーマットに加え、アセットのカスタムリストを定義することで、独自のネイティブ広告フォーマットも作成できます。こうしたフォーマットはカスタム ネイティブ広告フォーマットと呼ばれ、予約済みの広告と一緒に使用できます。このフォーマットでは、任意の構造化データをアプリに渡すことが可能です。この広告は NativeCustomTemplateAd オブジェクトで表されます。

カスタム ネイティブ広告フォーマットの読み込み

このガイドでは、カスタム ネイティブ広告フォーマットの読み込みと表示方法について説明します。

AdLoader の作成

統合ネイティブ広告の場合と同様に、カスタム ネイティブ広告フォーマットは AdLoader オブジェクトを使って読み込みます。次の例をご覧ください。

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
          @Override
          public void onCustomTemplateAdLoaded(NativeCustomTemplateAd ad) {
              // Show the custom template and record an impression.
          }
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String s) {
              // Handle the click action
          }
      })
    .withAdListener( ... )
    .withNativeAdOptions( ... )
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
        .forCustomTemplateAd("10063170",
            { ad ->
                // Show the custom template and record an impression.
            },
            { ad, s ->
            // Handle the click action
            })
        .withAdListener( ... )
        .withNativeAdOptions( ... )
        .build()

アプリ インストール広告のリクエストでは、forUnifiedNativeAd メソッドを使用して AdLoader を設定しますが、カスタム テンプレート広告のリクエストでは forCustomTemplateAd メソッドを使用します。このメソッドには、次の 3 つのパラメータが渡されます。

  • AdLoader でリクエストすべきカスタム テンプレートのテンプレート ID。それぞれのカスタム ネイティブ広告フォーマットには、テンプレート ID 値が割り当てられています。このパラメータは、AdLoader を通じてアプリでリクエストするテンプレートを示します。
  • 広告が正常に読み込まれたときに呼び出す OnCustomTemplateAdLoadedListener
  • 広告がタップまたはクリックされたときに呼び出す OnCustomClickListener(省略可)。リスナーの詳細については、以下の「クリックとインプレッションの処理」のセクションをご覧ください。

1 つの広告ユニットで複数のクリエイティブ テンプレートを配信するよう設定できるため、固有のテンプレート ID を使って forCustomTemplateAd を複数回呼び出して、複数のカスタム ネイティブ広告フォーマットに対応できる AdLoader を作成することもできます。

テンプレート ID

カスタム ネイティブ広告フォーマットの一意的な参照に使うテンプレート ID は、アド マネージャー管理画面の [配信] タブの [クリエイティブ] > [ネイティブ広告フォーマット] で確認できます。

各カスタム ネイティブ広告フォーマットのテンプレート ID は、それぞれの名前の下に表示されます。いずれかの名前をクリックすると詳細画面が開き、テンプレートのフィールドに関する情報が表示されます。

ここでは、個々のフィールドを追加、編集、削除できます。なお、右側の [変数 ID] 列には、個々のアセットにアクセスするために使う ID が表示されます。これについては、次のセクションで詳しく説明します。

カスタム ネイティブ広告フォーマットの表示

カスタム ネイティブ広告フォーマットがシステム定義のものと異なる点は、パブリッシャー様が独自の「テンプレート」、つまり広告を構成するアセットのリストを定義できる点です。そのため、カスタム ネイティブ広告フォーマットの表示プロセスは、システム定義フォーマットのものと次の点で異なります。

  1. NativeCustomTemplateAd クラスは、お客様がアド マネージャーで定義したカスタム ネイティブ広告フォーマットを処理するもので、アセットを取得するために名前付きの「ゲッター」ではなく getTextgetImage などのメソッドを使用します。これらは、テンプレート フィールドの変数 ID をパラメータとして使います。
  2. NativeCustomTemplateAd で使うための NativeContentAdView のような、専用の広告ビュークラスはありません。FrameLayout や RelativeLayout など、ご自身のアプリのユーザー エクスペリエンスに適したものを何でもご自由にお使いください。
  3. 専用の ViewGroup クラスがないため、広告のアセット表示に使うビューを登録する必要はありません。そのため、広告表示のコードは数行減りますが、後でクリックを処理する際に追加作業が必要になります。

次に示すのは、NativeCustomTemplateAd を表示する関数の例です。

Java

public void displayCustomTemplateAd (ViewGroup parent,
                                     NativeCustomTemplateAd customTemplateAd) {
    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View adView = inflater.inflate(R.layout.custom_template_ad, parent);

    // Locate the TextView that will hold the value for "Headline" and
    // set its text.
    TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline);
    myHeadlineView.setText(customTemplateAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            nativeCustomTemplateAd.getImage("MainImage").getDrawable());

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

Kotlin

public fun displayCustomTemplateAd (parent: ViewGroup,
                                customTemplateAd: NativeCustomTemplateAd) {
    val adView = layoutInflater
            .inflate(R.layout.ad_simple_custom_template, null)

    val myHeadlineView = adView.findViewById<TextView>(R.id.headline)
    myHeadlineView.setText(customTemplateAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    val myMainImageView = adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            customTemplateAd.getImage("MainImage").drawable;

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

カスタム ネイティブ広告フォーマット用のネイティブ動画

新しいネイティブ広告フォーマットを作成する際は、そのフォーマットを動画対応にすることもできます。

このチェックボックスをオンにしてフォーマットを動画対応にすると、このフォーマット用の新しいクリエイティブを作成する際に、動画アセットを配信するよう指定できます。

アプリに実装する際は、NativeCustomTemplateAd.getVideoMediaView() を使って動画のビューを取得して、そのビューをビュー階層に追加します。広告に動画コンテンツがない場合は、動画なしで広告を表示する代替プランを立てます。

次の例では、広告に動画コンテンツがあるかどうかを確認し、動画がない場合はその表示対象位置に画像を表示しています。

Java

// Called when a custom native ad loads.
@Override
public void onCustomTemplateAdLoaded(NativeCustomTemplateAd ad) {
    VideoController videoController = ad.getVideoController();
    // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder.
    FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder);
    if (videoController.hasVideoContent()) {
        mediaPlaceholder.addView(ad.getVideoMediaView());
    } else {
        ImageView mainImage = new ImageView(this);
        mainImage.setAdjustViewBounds(true);
        // Assumes your native format has an image asset with the name MainImage.
        mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable());
        mediaPlaceholder.addView(mainImage);
    }
}

Kotlin

NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener { ad ->
    val videoController = ad.videoController
    // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder.
    val mediaPlaceholder = adView.findViewById<FrameLayout>(R.id.media_placeholder)
    if (videoController.hasVideoContent())
    {
        mediaPlaceholder.addView(ad.videoMediaView)
    }
    else
    {
        val mainImage = ImageView(this)
        mainImage.adjustViewBounds = true
        // Assumes your native format has an image asset with the name MainImage.
        mainImage.setImageDrawable(ad.getImage("MainImage").drawable)
        mediaPlaceholder.addView(mainImage)
    }
}

カスタム ネイティブ広告で動画をカスタマイズする方法の詳細については、VideoController をご覧ください。

実際に動作するネイティブ動画の例については、アド マネージャーのカスタム レンダリング サンプルをダウンロードしてください。

カスタム ネイティブ広告フォーマットのクリックとインプレッション

カスタム ネイティブ広告フォーマットでは、Google Mobile Ads SDK へのクリック イベントの報告とインプレッションの記録をお客様のアプリで行う必要があります。

インプレッションの記録

カスタム テンプレート広告のインプレッションを記録するには、次のように、対応する NativeCustomTemplateAdrecordImpression メソッドを呼び出します。

myCustomTemplateAd.recordImpression();

アプリで誤って同じ広告に対してこのメソッドを 2 回呼び出すと、1 回のリクエストに対してインプレッションが繰り返し記録されないように SDK で自動的に処理されます。

クリックの報告

アセットビューでクリックが発生したことを SDK に報告するには、対応する NativeCustomTemplateAdperformClick メソッドを呼び出し、クリックされたアセットの名前を渡します。たとえば、カスタム テンプレートに「MainImage」というアセットがあり、そのアセットに対応する ImageView のクリックを報告する場合、コードは次のようになります。

myCustomTemplateAd.performClick("MainImage");

なお、広告に関連付けられているすべてのビューで、このメソッドを呼び出す必要はありません。「Caption」という別のフィールドは表示されるもののクリックやタップされることがないとします。この場合、そのアセットのビューで performClick を呼び出す必要はありません。

カスタム クリック アクションへのレスポンス

カスタム テンプレート広告がクリックされると、SDK は次の 3 つの処理を順番に試み、いずれかのレスポンスを返す可能性があります。

  1. OnCustomClickListener がある場合は、AdLoader から呼び出す。
  2. 広告のディープリンク URL のそれぞれについて、コンテンツ リゾルバの特定を試み、最初に特定したリゾルバを開始する。
  3. ブラウザを開き、広告の従来のリンク先 URL に移動する。

forCustomTemplateAd メソッドは OnCustomClickListener を受け取ります。このメソッドにリスナー オブジェクトを渡すと、SDK は代わりにそのオブジェクトの onCustomClick メソッドを呼び出し、他のアクションは行いません。ただし、リスナーとして null 値を渡すと、SDK は広告に登録されているディープリンクやリンク先 URL にフォールバックします。

カスタム クリック リスナーを使うと、クリックへのレスポンスとして最適なアクション(UI の更新、新しいアクティビティの開始、クリックの記録のみ)をアプリで決定できます。発生したクリックの記録のみを行う例を次に示します。

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
        // Display the ad.
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String assetName) {
            Log.i("MyApp", "A custom click just happened for " + assetName + "!");
          }
      }).build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
    .forCustomTemplateAd("10063170",
        { ad ->
            // Display the ad.
        },
        { ad, assetName ->
                Log.i("MyApp", "A custom click just happened for $assetName!")
    }).build()

最初は、カスタム クリック リスナーがあることに違和感があるかもしれません。クリックの発生をアプリから SDK に伝えたばかりなのに、なぜ SDK からアプリにレポートを返す必要があるのか、疑問に思われるでしょう。

この情報フローはいくつかの理由で有益ですが、最大の理由は、このフローによって SDK がクリックに対するレスポンスを制御し続けられる点です。たとえば、クリエイティブに設定されている第三者のトラッキング URL を自動的に送信したり、コードを追加せずにバックグラウンドで他のタスクを処理したりすることができます。

フィードバックを送信...

Mobile Ads SDK for Android
Mobile Ads SDK for Android
ご不明な点がありましたら、Google のサポートページをご覧ください。