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

最上位の build.gradlegoogle() リポジトリまたは maven { url "https://maven.google.com" } への参照が含まれていることを確認します。

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

Android Support Library の代わりに 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)、返される広告に適用するスタイル ID、および SearchAdOptions を指定する必要があります。コンストラクタで指定する Context は、SearchAdController を含み、広告 View を配置する Activity である必要があります。
  • loadAds を呼び出して新規ユーザー検索を指定し、非同期の広告リクエストを開始します。以前の loadAds の呼び出しから読み込まれた広告は、新しい呼び出しが行われると内部広告キャッシュから消去されます。
  • createAdView を使用して View を作成し、広告クリエイティブを表示します。
  • 広告が読み込まれたら、以前に createAdView で生成した View を使用して populateAdView を呼び出し、キャッシュされた広告をその View にレンダリングします。データを入力する View に加えて、adKey(広告を一意に識別するための任意の文字列)を指定します。これにより、キャッシュから返された特定の広告クリエイティブがその adKey に関連付けられるため、同じ adKey がその後の populateAdView の呼び出しに渡されると、同じ広告が返されます。たとえば、adKey="keyA"populateAdView が初めて呼び出され、ハイキング シューズの広告がレンダリングされた場合、その後 adKey="keyA"populateAdView が呼び出されるたびに、同じハイキング ブーツの広告が表示されます。(loadAds を新たに呼び出すと、キャッシュに保存された広告と関連する広告キーがすべて消去されます)。

SearchAdOptions

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

View

  • SearchAdControllercreateAdView() を呼び出して、広告を保持する 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 を作成し、SearchAdController に対して loadAds を呼び出して、非同期広告リクエストを開始します。

// 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 で定義します。