Android 向けの AFS ネイティブ実装

Google Mobile Ads SDK では、カスタム検索スタイルもサポートされています。アプリですでに Google Mobile Ads SDK を使用している場合は、代わりに AFSMA SDK バージョンを使用することをおすすめします。

18.1.0 以前からバージョン 19.0.0 以降にアップグレードする場合は、移行ガイドをご覧ください。

前提条件

この実装ガイドは、読者が次の内容を理解していることを前提としています。

AFS Native SDK をインポートする

SDK を追加する

AFS Native SDK をアプリに追加する手順は次のとおりです。

アプリケーション モジュール ディレクトリ内の build.gradle ファイルを開きます。SDK の最新バージョンの新しいビルドルールを dependencies に追加します。

dependencies {
  implementation 'com.google.android.gms:play-services-afs-native:19.0.3'
}

トップレベルの build.gradle に、google() リポジトリまたは maven { url "https://maven.google.com" } への参照が含まれていることを確認します。

こちらの手順に沿って、Google Play スタンドアロン バージョン マッチャー プラグインをプロジェクトに含めます。このプラグインを適用すると、AFS Native SDK が Google Play 開発者サービスの互換性のないバージョンで使用されている場合、アプリのビルドは許可されずに Gradle ビルドエラーが発生しますが、ランタイム クラッシュが発生する可能性があります。または、プロジェクトで互換性のないバージョンの Google Play 開発者サービスが使用されている場合は、failOnVersionConflict() ResolutionStrategy をプロジェクトに適用してビルドエラーを発生させます。変更を保存し、ツールバーの [Sync Project with Gradle Files] をクリックします。

Android サポート ライブラリの代わりに AndroidX を使用する

バージョン 17.0.0 以降の SDK では、アプリで Android サポート ライブラリではなく Jetpack(AndroidX)ライブラリを使用する必要があります。互換性要件:

  • com.android.tools.build:gradle を v3.2.1 以降に設定します。
  • compileSdkVersion を 28 以降に設定します。
  • Jetpack(AndroidX)を使用するようにアプリを更新します。AndroidX への移行の手順に沿って操作します。

クラス

アプリで AFS ネイティブ広告を配信するには、次のクラスを実装します。

SearchAdController

  • このクラスは、広告の非同期リクエスト、広告のキャッシュ保存と取得、広告のレンダリングを行います。
  • 各広告コンテキストには個別の SearchAdController が必要です。たとえば、検索結果のリストとともに広告を表示する画面と、特定の商品の詳細とともに広告を表示する別の画面がある場合は、SearchAdController のインスタンスを 2 つ(ケースごとに 1 つずつ)作成する必要があります。
  • コンストラクタには、ウェブ プロパティ コード(パブリッシャー ID)、返される広告に適用するスタイル IDSearchAdOptions を指定する必要があります。コンストラクタで指定する Context は、SearchAdController を含み、広告 View を配置する場所である Activity にする必要があります。
  • loadAds を呼び出して新規ユーザーの検索であることを示し、非同期の広告リクエストを開始します。以前の loadAds の呼び出しで読み込まれた広告は、新しい呼び出しが行われると内部広告キャッシュから消去されます。
  • createAdViewView を作成して、広告クリエイティブを表示します。
  • 広告が読み込まれたら、以前に createAdView で生成した ViewpopulateAdView を呼び出して、キャッシュされた広告をその View にレンダリングします。入力される View に加え、adKey(広告を一意に識別する任意の文字列)を指定します。これにより、キャッシュから返された特定の広告クリエイティブがその adKey に関連付けられるため、以降の populateAdView の呼び出しに同じ adKey が渡されると、同じ広告が返されます。たとえば、adKey="keyA" で初めて populateAdView が呼び出され、ハイキング ブーツの広告が表示される場合、その後に adKey="keyA"populateAdView を呼び出すたびに、同じハイキング ブーツの広告が表示されます。(loadAds を新たに呼び出すと、キャッシュに保存された広告と関連付けられている広告キーがすべて消去されます)。

SearchAdOptions

  • このオブジェクトを SearchAdController コンストラクタに渡して、広告のリクエスト方法と表示方法をカスタマイズします。SearchAdOptions.Builder に対して build() を呼び出して、SearchAdOptions オブジェクトを作成します。

View

  • SearchAdController に対して createAdView() を呼び出して、広告を保持する View オブジェクトを作成します。一度に表示できる広告は 1 つまでですが、同じ View を再利用して、時間の経過とともに異なる広告を表示することができます。

SearchAdRequest

  • 非同期の広告リクエストを開始するには、SearchAdRequest を指定して SearchAdControllerloadAds メソッドを呼び出します。SearchAdRequest.Builder に対して build() を呼び出して、SearchAdRequest オブジェクトを作成します。

AdListener

  • このインターフェースを実装して SearchAdController コンストラクタに渡して、いくつかの状態のコールバックを登録します。
  • 注: キャンセルされたリクエスト(最初の呼び出しが解決される前に別の loadAds の呼び出しによってプリエンプトされた loadAds の呼び出し)では、AdListener コールバックは呼び出されません。

実装例

以下の例は、サンプル ActivitySearchAdController を作成する方法を示しています。

//  MainActivity.java implementation
//  (MainActivity is a subclass of Activity)

SearchAdController adController;
// adContainer where we will place our ads in this example.
ViewGroup adContainer;

protected void onCreate(Bundle bundle){
  super.onCreate(bundle);
  adContainer = (ViewGroup) findViewById(...);
  // Specify ad options (not required).
  SearchAdOptions.Builder adOptionsBuilder = new SearchAdOptions.Builder();
  adOptionsBuilder.setAdType(SearchAdOptions.AD_TYPE_TEXT);
  adOptionsBuilder.setPrefetch(true);
  adOptionsBuilder.setNumAdsRequested(3);
  // Provide a callback to trigger when ads are loaded.
  AdListener adListener = new AdListener() {
    public void onAdLoaded() {
      createAndShowAd();
    }
  };
  // Instantiate the SearchAdController.
  adController = new SearchAdController(this, "your-client-id", "your-style-id",
                                        adOptionsBuilder.build(), adListener);
}

ユーザーがクエリを開始したら、SearchAdRequest を作成し、SearchAdControllerloadAds を呼び出して非同期広告リクエストを開始します。

// Create the request.
SearchAdRequest.Builder requestBuilder = new SearchAdRequest.Builder();
requestBuilder.setQuery("user query here");
// Load the ads.
adController.loadAds(requestBuilder.build());

onAdLoaded コールバックを実装して、読み込まれた広告を広告ビューに入力します。

private void createAndShowAd() {
  // Create a new view that will contain the ad.
  View adView = adController.createAdView();
  // Attach the new view to the view hierarchy.
  adContainer.addView(adView);
  // Display the ad inside the adView. We need to provide an adKey to
  // indicate which ad is to be displayed in the adView. In this example, 
  // since we only have one ad, we can provide any constant string. However, 
  // if you intend to display multiple ads, each ad you wish to display
  // should be given a unique adKey of your choosing.
  adController.populateAdView(adView, "demoAd");
}

指定した検索語句に関連する広告が adView に表示されます。

エラーの調査

SearchAdController では、広告を表示する準備ができたことをアプリに通知するために、onAdLoaded() メソッドを持つ AdListener オブジェクトが必要です。また、エラーを検出して修正できるように、onAdFailedToLoad() メソッドを実装する必要があります。たとえば、次の AdListener を使用して実装をデバッグできます。

AdListener adListener = new AdListener() {
    public void onAdLoaded() {
        // Called when an ad is loaded.
        Toast.makeText(MainActivity.this, "Ad Loaded",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Loaded");
    }

    public void onAdLeftApplication() {
        // Called when an ad leaves the application
        // (to go to the browser for example).
        Toast.makeText(MainActivity.this, "Ad Left Application",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Left Application");
    }

    @Override
    public void onAdFailedToLoad(int errorCode) {
        // Called when an ad request failed.
        Toast.makeText(MainActivity.this, "Ad Failed to Load: " + errorCode,
                Toast.LENGTH_SHORT).show();
        Log.e(MainActivity.class.getSimpleName(), "Ad Failed to Load: " +
                errorCode);
    }
};

onAdFailedToLoad() コールバック メソッドで使用される定数は、AdListener で定義されます。