ネイティブ広告APIを使用すると、アプリ内に表示する広告のエクスペリエンスをカスタマイズできます。ネイティブ広告APIを使用すると、そのまま表示できる広告を受信するのではなく、タイトル、画像、コールトゥアクションなど、さまざまな広告プロパティのセットを受信することになります。それらを使用して、広告が表示されるカスタムビューを構成する必要があります。
続行する前に、必ずAudience NetworkのスタートガイドとAndroidのスタートガイドすべてに目を通しておいてください。
このガイドでは、以下のネイティブ広告配置を実装します。次のコンポーネントを使用してネイティブ広告を作成します。
ビュー1: 広告アイコンビュー2: 広告タイトルビュー3: 広告ラベルビュー4: AdOptionsView | ビュー5: MediaViewビュー6: ソーシャルコンテキストビュー7: 広告の本文ビュー8: コールトゥアクションボタン |
このメソッドは、Android Audience Network SDKバージョン5.1で追加されました。
バージョン5.3.0
以降では、Audience Network Android SDKの明示的な初期化が必須です。Audience Network Android SDKを初期化する方法については、こちらのドキュメントをご覧ください。
広告オブジェクトを作成したり、広告を読み込んだりする前に、Audience Network SDKを初期化してください。アプリの起動時に初期化することをおすすめします。
public class YourApplication extends Application { ... @Override public void onCreate() { super.onCreate(); // Initialize the Audience Network SDK AudienceNetworkAds.initialize(this); } ... }
Facebook広告SDKをインポートするには、お使いのActivityの先頭に以下のコードを追加します。
import com.facebook.ads.*;
次に、NativeAd
オブジェクトをインスタンス化し、NativeAdListener
を作成し、その広告リスナーでloadAd()
を呼び出します。
private final String TAG = "NativeAdActivity".getClass().getSimpleName(); private NativeAd nativeAd; private void loadNativeAd() { // Instantiate a NativeAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, while you are testing and replace it later when you have signed up. // While you are using this temporary code you will only get test ads and if you release // your code like this to the Google Play your users will not receive ads (you will get a no fill error). nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID"); NativeAdListener nativeAdListener = new NativeAdListener() { @Override public void onMediaDownloaded(Ad ad) { // Native ad finished downloading all assets Log.e(TAG, "Native ad finished downloading all assets."); } @Override public void onError(Ad ad, AdError adError) { // Native ad failed to load Log.e(TAG, "Native ad failed to load: " + adError.getErrorMessage()); } @Override public void onAdLoaded(Ad ad) { // Native ad is loaded and ready to be displayed Log.d(TAG, "Native ad is loaded and ready to be displayed!"); } @Override public void onAdClicked(Ad ad) { // Native ad clicked Log.d(TAG, "Native ad clicked!"); } @Override public void onLoggingImpression(Ad ad) { // Native ad impression Log.d(TAG, "Native ad impression logged!"); } }; // Request an ad nativeAd.loadAd( nativeAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); }
後ほど、onAdLoaded()
メソッドにコードを追加するためにここに戻ります。
次のステップでは、広告メタデータを抽出してそのプロパティを使用し、カスタマイズしたネイティブUIを構成します。レイアウトのxmlファイルでカスタムビューを作成するか、コードにエレメントを追加できます。
アプリのネイティブ広告をデザインする際は、ネイティブ広告に関するガイドラインに従ってください。
アクティビティのレイアウトactivity_main.xml
で、Native Ad
のコンテナを追加します。コンテナはcom.facebook.ads.NativeAdLayout
にします。これは、FrameLayout
上のラッパーで、ネイティブの広告レポート作成フローを広告にレンダリングする追加機能があります。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:paddingTop="50dp"> ... <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="50dp"> <com.facebook.ads.NativeAdLayout android:id="@+id/native_ad_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> </ScrollView> ... </RelativeLayout>
ネイティブ広告のカスタムレイアウトnative_ad_layout.xml
を作成します。
以下は、ネイティブ広告のカスタムレイアウトの例です。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ad_unit" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:orientation="vertical" android:paddingLeft="10dp" android:paddingRight="10dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="10dp" android:paddingTop="10dp"> <com.facebook.ads.MediaView android:id="@+id/native_ad_icon" android:layout_width="35dp" android:layout_height="35dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:paddingLeft="5dp" android:paddingRight="5dp"> <TextView android:id="@+id/native_ad_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:textColor="@android:color/black" android:textSize="15sp" /> <TextView android:id="@+id/native_ad_sponsored_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:textColor="@android:color/darker_gray" android:textSize="12sp" /> </LinearLayout> <LinearLayout android:id="@+id/ad_choices_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="end" android:orientation="horizontal" /> </LinearLayout> <com.facebook.ads.MediaView android:id="@+id/native_ad_media" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="5dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="3" android:orientation="vertical"> <TextView android:id="@+id/native_ad_social_context" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:textColor="@android:color/darker_gray" android:textSize="12sp" /> <TextView android:id="@+id/native_ad_body" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:gravity="center_vertical" android:lines="2" android:textColor="@android:color/black" android:textSize="12sp" /> </LinearLayout> <Button android:id="@+id/native_ad_call_to_action" android:layout_width="100dp" android:layout_height="30dp" android:layout_gravity="center_vertical" android:layout_weight="1" android:background="#4286F4" android:paddingLeft="3dp" android:paddingRight="3dp" android:textColor="@android:color/white" android:textSize="12sp" android:visibility="gone" /> </LinearLayout> </LinearLayout>
onAdLoaded()
メソッドを、Native Ad's
プロパティを取得して表示するよう、次のように変更します。private NativeAdLayout nativeAdLayout; private LinearLayout adView; private NativeAd nativeAd; private void loadNativeAd() { // Instantiate a NativeAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, while you are testing and replace it later when you have signed up. // While you are using this temporary code you will only get test ads and if you release // your code like this to the Google Play your users will not receive ads (you will get a no fill error). nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID"); NativeAdListener nativeAdListener = new NativeAdListener() { ... @Override public void onAdLoaded(Ad ad) { // Race condition, load() called again before last ad was displayed if (nativeAd == null || nativeAd != ad) { return; } // Inflate Native Ad into Container inflateAd(nativeAd); } ... }; // Request an ad nativeAd.loadAd( nativeAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); } private void inflateAd(NativeAd nativeAd) { nativeAd.unregisterView(); // Add the Ad view into the ad container. nativeAdLayout = findViewById(R.id.native_ad_container); LayoutInflater inflater = LayoutInflater.from(NativeAdActivity.this); // Inflate the Ad view. The layout referenced should be the one you created in the last step. adView = (LinearLayout) inflater.inflate(R.layout.native_ad_layout_1, nativeAdLayout, false); nativeAdLayout.addView(adView); // Add the AdOptionsView LinearLayout adChoicesContainer = findViewById(R.id.ad_choices_container); AdOptionsView adOptionsView = new AdOptionsView(NativeAdActivity.this, nativeAd, nativeAdLayout); adChoicesContainer.removeAllViews(); adChoicesContainer.addView(adOptionsView, 0); // Create native UI using the ad metadata. MediaView nativeAdIcon = adView.findViewById(R.id.native_ad_icon); TextView nativeAdTitle = adView.findViewById(R.id.native_ad_title); MediaView nativeAdMedia = adView.findViewById(R.id.native_ad_media); TextView nativeAdSocialContext = adView.findViewById(R.id.native_ad_social_context); TextView nativeAdBody = adView.findViewById(R.id.native_ad_body); TextView sponsoredLabel = adView.findViewById(R.id.native_ad_sponsored_label); Button nativeAdCallToAction = adView.findViewById(R.id.native_ad_call_to_action); // Set the Text. nativeAdTitle.setText(nativeAd.getAdvertiserName()); nativeAdBody.setText(nativeAd.getAdBodyText()); nativeAdSocialContext.setText(nativeAd.getAdSocialContext()); nativeAdCallToAction.setVisibility(nativeAd.hasCallToAction() ? View.VISIBLE : View.INVISIBLE); nativeAdCallToAction.setText(nativeAd.getAdCallToAction()); sponsoredLabel.setText(nativeAd.getSponsoredTranslation()); // Create a list of clickable views List<View> clickableViews = new ArrayList<>(); clickableViews.add(nativeAdTitle); clickableViews.add(nativeAdCallToAction); // Register the Title and CTA button to listen for clicks. nativeAd.registerViewForInteraction( adView, nativeAdMedia, nativeAdIcon, clickableViews); }
インプレッションの記録とクリックの処理は、SDKによって自動的に行われます。広告のビューを有効にするには、NativeAd
インスタンスに登録しなければなりません。ビューのすべての広告エレメントをクリック可能にするには、以下を使用して登録します。
registerViewForInteraction(View view, MediaView adMediaView, MediaView adIconView)
registerViewForInteractionをNativeAdsで使用すると、SDKはその呼び出しがメインスレッドで実行されていることをチェックして、競合状態を回避します。このチェックには、Preconditions.checkIsOnMainThread()
が使用されます。自分の実装がこの基準を満たしていることを確認してください。バックグランドスレッドからregisterViewForInteractionを呼び出そうとすると、アプリがクラッシュします。
読み込まれてからすぐに広告が表示されない場合、開発者は広告が無効になっていないか確認する必要があります。正常に読み込まれた後、広告は60分間有効になります。無効な広告を表示している場合は、支払いを受けられません。isAdInvalidated()
を呼び出して広告を有効にする必要があります。
以下を参考にしてください。ただし、このコードは例に過ぎないので、そのままプロジェクトにコピーして使用しないでください。
private NativeAd nativeAd; private void loadNativeAd() { // Instantiate a NativeAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, while you are testing and replace it later when you have signed up. // While you are using this temporary code you will only get test ads and if you release // your code like this to the Google Play your users will not receive ads (you will get a no fill error). nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID"); NativeAdListener nativeAdListener = new NativeAdListener() { ... }; // Request an ad nativeAd.loadAd( nativeAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); // Here is just an example for displaying the ad with delay // Please call this method at appropriate timing in your project showNativeAdWithDelay(); } private void showNativeAdWithDelay() { /** * Here is an example for displaying the ad with delay; * Please do not copy the Handler into your project */ Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { // Check if nativeAd has been loaded successfully if(nativeAd == null || !nativeAd.isAdLoaded()) { return; } // Check if ad is already expired or invalidated, and do not show ad if that is the case. You will not get paid to show an invalidated ad. if(nativeAd.isAdInvalidated()) { return; } inflateAd(nativeAd); // Inflate NativeAd into a container, same as in previous code examples } }, 1000 * 60 * 15); // Show the ad after 15 minutes }
快適な操作性とより良い結果を得るには、利用者が意図せずクリックしてしまわないよう広告のクリック可能な領域をコントロールすることをおすすめします。クリックできない余白の運用について詳しくは、Audience Network SDKポリシーをご覧ください。
registerViewForInteraction(View view, MediaView adMediaView, MediaView adIconView, List<View> clickableViews)
を使用して、クリックできるビューのリストを登録すると、クリックできる対象を細かくコントロールできます。たとえば、上述の例のように広告タイトルとコールトゥアクションボタンのみをクリック可能にする場合は、次のように記述します。
@Override public void onAdLoaded(Ad ad) { ... // Create a list of clickable views List<View> clickableViews = new ArrayList<>(); clickableViews.add(nativeAdTitle); clickableViews.add(nativeAdCallToAction); // Register the Title and CTA button to listen for clicks. nativeAd.registerViewForInteraction( adView, nativeAdMedia, nativeAdIcon, clickableViews); ... }
ビューを再利用して、時間の経過と共に異なる広告を表示する場合は、同じビューをNativeAd
の別のインスタンスに登録する前に、必ずunregisterView()
を呼び出してください。
コードを実行すると、ネイティブ広告が表示されます。
ネイティブ広告カバー画像を表示する場合、Meta Audience Network MediaViewを必ず使用しなければなりません。これは、画像アセットと動画アセットを両方とも表示できます。ネイティブ動画広告ユニットのデザインガイドラインは、こちらで確認できます。
デフォルトでは、ネイティブ広告の読み込み時に画像と動画のアセットはすべて事前キャッシュされます。これにより、nativeAd
の読み込みが終わったらすぐにMediaView
が動画を再生できます。
private void loadNativeAd() { ... nativeAd.loadAd(); }
ネイティブ広告読み込み時にNativeAd.MediaCacheFlag.ALL
を明示的に指定することもできます。
private void loadNativeAd() { ... nativeAd.loadAd( nativeAd.buildLoadAdConfig() .withMediaCacheFlag(NativeAdBase.MediaCacheFlag.ALL) .build()); }
Audience Networkはネイティブ広告で2つのキャッシュオプションをサポートしています。その定義は、NativeAd.MediaCacheFlag
enumでします。
キャッシュ定数 | 説明 |
---|---|
| すべて事前キャッシュ(アイコン、画像、動画)、デフォルト |
| 事前キャッシュなし |
広告が読み込まれると、title
、icon
、coverImage
、callToAction
の各プロパティに何らかの値が入ります。他のプロパティの値は、nullや空である可能性もあります。そのような場合にも適切に対処できるようコーディングしてください。
表示する広告がない場合、onError
が error.code
と共に呼び出されます。独自のカスタムレポートレイヤーやメディエーションレイヤーを使用する場合は、必要に応じてコードの値を確認して、表示する広告がない状況を検出できます。表示する広告がない場合、別のアドネットワークをフォールバックとして使用できますが、直後に広告のリクエストを再送信しないようにしてください。
受信した広告メタデータは、最大1時間はキャッシュに保存され、再利用できます。それ以降にメタデータを使用する場合、呼び出しを実行して新しい広告を読み込みます。
MediaCacheFlag.NONE
をloadAd
メソッドで使用することにより、このデフォルトをオーバーライドすることができます。デフォルトのメディアキャッシュ設定をオーバーライドするかどうかの決定は、注意深く行ってください。private final String TAG = NativeAdActivity.class.getSimpleName(); private NativeAd nativeAd; private void loadNativeAd() { // Instantiate a NativeAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, while you are testing and replace it later when you have signed up. // While you are using this temporary code you will only get test ads and if you release // your code like this to the Google Play your users will not receive ads (you will get a no fill error). nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID"); NativeAdListener nativeAdListener = new NativeAdListener() { ... }; // Request an ad without auto cache nativeAd.loadAd( nativeAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .withMediaCacheFlag(NativeAdBase.MediaCacheFlag.NONE) .build()); }
onAdLoaded
を呼び出せたら、手動でdownloadMedia
メソッドを呼び出して、適切なときにネイティブ広告のすべてのメディアのダウンロードを開始できます。@Override public void onAdLoaded(Ad ad) { if (nativeAd == null || nativeAd != ad) { return; } nativeAd.downloadMedia(); }
registerViewForInteraction
メソッドを呼び出し、onMediaDownloaded
コールバックでメディアの読み込みが終わたら広告を表示します。@Override public void onMediaDownloaded(Ad ad) { if (nativeAd == null || nativeAd != ad) { return; } inflateAd(nativeAd); // Inflate NativeAd into a container, same as in previous code examples }
自動キャッシュなしで広告を読み込み、手動でdownloadMedia
を呼び出してダウンロードを開始しなかった場合、メディアのダウンロードが始まるのは、registerViewForInteraction
が呼び出されたときです。インプレッションの対象となるには、すべてのメディアが読み込まれ表示される必要があります。
Audience Networkの動画広告では、ハードウェアアクセラレーションを使用したレンダリングを有効にする必要があります。有効にしない場合は、動画の表示中に画面が黒くなることがあります。対象広告:
ハードウェアアクセラレーションは、ターゲットAPIレベルが14以上(Ice Cream Sandwich, Android 4.0.1)の場合はデフォルトで有効になっていますが、アプリレベルまたはアクティビティレベルで明示的に有効にすることもできます。
Androidのマニフェストファイルで、次の属性を<application>
タグに追加し、アプリ全体でハードウェアアクセラレーションを有効にします。
<application android:hardwareAccelerated="true" ...>
アプリの特定のアクティビティに対してのみこの機能を有効にする場合は、Androidのマニフェストファイルで次の機能を<activity>
タグに追加します。以下の例では、インタースティシャル広告とリワード動画のレンダリングに使用されるAudienceNetworkActivity
に対してハードウェアアクセラレーションを有効にします。
<activity android:name="com.facebook.ads.AudienceNetworkActivity" android:hardwareAccelerated="true" .../>
GithubでAudience Network Androidコードサンプルをご確認ください。プロジェクトをIDEにインポートして、機器またはエミュレータで実行します。
アプリを公開して収益を得る準備が整ったら、Audience NetworkのポリシーとFacebookコミュニティ規定を順守していることを確認してから、アプリのレビューを申請します。
アプリにネイティブ広告を追加する方法については、ネイティブ広告テンプレートのガイドをご覧ください。
ネイティブ広告の使い方を示すコードサンプルを参考にしてください。SDKの一部としてNativeAdSample
が提供されています。これは、AudienceNetwork/samples
フォルダ内にあります。プロジェクトをIDEにインポートして、デバイスまたはエミュレータで実行します。
その他のリソース |
スタートガイドAudience Networkを開始するためのテクニカルガイド コードサンプルAudience Network広告の統合のサンプル | よくある質問Audience Networkのよくある質問 ネイティブ広告テンプレートネイティブ広告の統合に使用できる、よりシンプルなアプローチ |