ネイティブ広告

ネイティブ広告は、プラットフォームにネイティブな UI コンポーネントを通じてユーザーに表示される広告アセットです。これらは、すでにレイアウトを作成しているものと同じタイプのビューを使用して表示され、アプリのビジュアル デザインに合わせてフォーマットできます。

ネイティブ広告の読み込み時には、アプリが広告のアセットを含むオブジェクトを受け取ります。アプリは Google Mobile Ads SDK ではなく、その広告アセットの表示を担当します。

大まかに言うと、ネイティブ広告の実装は、SDK を使って広告を読み込んでから、アプリに広告コンテンツを表示するという 2 つの段階で構成されます。

このページでは、SDK を使用して ネイティブ広告を読み込む方法について説明します。

Prerequisites

常にテスト広告でテストする

アプリの開発とテストでは必ずテスト広告を使用し、配信中の実際の広告は使用しないでください。

テスト広告を読み込む際は、次に示す Android ネイティブ広告向けのテスト専用広告ユニット ID を使うと便利です。

ca-app-pub-3940256099942544/2247696110

この ID は、すべてのリクエストに対してテスト広告を返す特別な ID で、アプリのコーディング、テスト、デバッグで使うことができます。なお、このテスト用 ID は、アプリを公開する前に必ずご自身の広告ユニット ID に置き換えてください。

Google Mobile Ads SDK のテスト広告の仕組みについて詳しくは、テスト広告をご覧ください。

広告を読み込んでいます

ネイティブ広告の読み込みには AdLoader クラスを使用します。このクラスは、独自の Builder クラスを使って作成時にカスタマイズできるようになっています。アプリのビルド時に AdLoader にリスナーを追加することで、受け取る準備が整っているネイティブ広告のタイプをアプリで指定できます。AdLoader は、これらの型のみをリクエストします。

AdLoader を作成する

次のコードは、ネイティブ広告を読み込むことができる AdLoader の作成方法を示しています。

Java

AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Show the ad.
        }
    })
    .withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError adError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(new NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd { ad : NativeAd ->
        // Show the ad.
    }
    .withAdListener(object : AdListener() {
        override fun onAdFailedToLoad(adError: LoadAdError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build()

forNativeAd() メソッドは、NativeAd 形式の AdLoader を準備します。広告が正常に読み込まれると、リスナー オブジェクトの onNativeAdLoaded() メソッドが呼び出されます。

AdLoader で AdListener を設定する(省略可)

AdLoader を作成するときに、withAdListener 関数がローダに AdListener を設定します。このメソッドは唯一のパラメータとして AdListener を受け取ります。このパラメータは、広告ライフサイクル イベントが発生すると AdLoader からコールバックを受け取ります。

Java

.withAdListener(new AdListener() {
    // AdListener callbacks can be overridden here.
})

Kotlin

.withAdListener(object : AdListener() {
    // AdListener callbacks can be overridden here.
})

広告をリクエスト

AdLoader の作成が完了したら、それを使用して広告をリクエストします。そのために利用できるメソッドは loadAd()loadAds() の 2 つです。

loadAd()

このメソッドは、1 つの広告のリクエストを送信します。

Java

adLoader.loadAd(new AdRequest.Builder().build());

Kotlin

adLoader.loadAd(AdRequest.Builder().build())

loadAds()

このメソッドは、複数の広告のリクエストを 5 つまで送信します。

Java

adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

adLoader.loadAds(AdRequest.Builder().build(), 3)

どちらのメソッドも、最初のパラメータとして AdRequest オブジェクトを受け取ります。これは、バナーやインタースティシャルと同じ AdRequest クラスです。他の広告フォーマットの場合と同様に、AdRequest クラスのメソッドを使用してターゲティング情報を追加できます。

複数の広告を読み込む(省略可)

loadAds() メソッドは、追加のパラメータ(SDK がリクエストに対して読み込む広告の数)を受け取ります。この上限は 5 回で、リクエストした広告の正確な数が SDK から返されるという保証はありません。

返される Google 広告は互いに異なりますが、予約済み広告枠やサードパーティの購入者の広告は、必ずしも一意であるとは限りません。

メディエーションを使用している場合は、loadAds() メソッドを使用しないでください。現時点では、メディエーション用に設定された広告ユニット ID に対して複数のネイティブ広告をリクエストすることはできません。

コールバック

loadAd() を呼び出した後、あらかじめ定義されたリスナー メソッドにコールバックを 1 回行って、ネイティブ広告オブジェクトを配信するかエラーを報告します。

loadAds() を呼び出した後、このようなコールバックが少なくとも 1 回(リクエストされた広告数を上限として)行われます。複数の広告をリクエストするアプリでは、コールバック実装で AdLoader.isLoading() を呼び出して、読み込みプロセスが完了したかどうかを判断する必要があります。

onNativeAdLoaded() コールバックで isLoading() を確認する方法の例を次に示します。

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading()) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }
}).build();
adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }.build()
adLoader.loadAds(AdRequest.Builder().build(), 3)

リソースを解放する

読み込まれたネイティブ広告では、必ず destroy() メソッドを使用してください。これにより、使用されているリソースが解放され、メモリリークが防止されます。

アクティビティの onDestroy() メソッド内で、すべての NativeAd 参照が破棄されるようにします。

onNativeAdLoaded コールバックでは、逆参照となる既存のネイティブ広告を破棄してください。

もう 1 つの重要なチェックは、アクティビティが破棄された場合、このメソッドが返された広告で destroy() を呼び出し、すぐに返すことです。

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed()` is a method on Activity.
        if (isDestroyed()) {
            nativeAd.destroy();
            return;
        }
        ...
    }
}).build();

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd { nativeAd ->
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed` is a method on Activity.
        if (isDestroyed) {
            nativeAd.destroy()
            return@forNativeAd
        }
        ...
    }.build()

おすすめの方法

広告を読み込む際は次のルールに従います。

  • ネイティブ広告をリストで使用するアプリでは、広告リストを事前キャッシュに保存する必要があります。

  • 広告のキャッシュ保存時には、キャッシュを消去し、1 時間後に再読み込みします。

  • 最初のリクエストの読み込みが完了するまで、AdLoaderloadAd() または loadAds() を呼び出さないでください。

動画広告のハードウェア アクセラレーション

動画広告をネイティブ広告のビューに適切に表示するには、ハードウェア アクセラレーションを有効にする必要があります。

ハードウェア アクセラレーションはデフォルトで有効になっていますが、一部のアプリでは無効にすることもできます。その場合は、広告を使用するアクティビティ クラスのハードウェア アクセラレーションを有効にすることをおすすめします。

ハードウェア アクセラレーションの有効化

ハードウェア アクセラレーションをグローバルに有効にするとアプリが正しく動作しない場合は、個々のアクティビティでそれを制御できます。ハードウェア アクセラレーションを有効または無効にするには、AndroidManifest.xml<application> 要素と <activity> 要素で android:hardwareAccelerated 属性を使用します。次の例では、アプリ全体でハードウェア アクセラレーションを有効にしつつ、1 つのアクティビティで無効にしています。

<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
    <!-- For activities that don't use ads, hardwareAcceleration can be false. -->
    <activity android:hardwareAccelerated="false" />
</application>

ハードウェア アクセラレーションを制御するオプションについて詳しくは、ハードウェア アクセラレーション ガイドをご覧ください。アクティビティが無効の場合、個々の広告ビューではハードウェア アクセラレーションを有効にできないため、アクティビティ自体でハードウェア アクセラレーションが有効になっている必要があります。

広告の表示

広告を読み込んだら、あとはユーザーに広告を表示するだけです。 方法については、ネイティブ アドバンス ガイドをご覧ください。