「Facebook/ビジネスマネージャ/アプリ広告/AndroidNative」の版間の差分
(→サンプル) |
(→動画サンプルID) |
||
| (同じ利用者による、間の24版が非表示) | |||
| 行12: | 行12: | ||
==サンプル== | ==サンプル== | ||
| + | MyApplication.java | ||
| + | <pre> | ||
| + | import android.app.Application; | ||
| + | import com.facebook.ads.AudienceNetworkAds; | ||
| + | public class MyApplication extends Application { | ||
| + | @Override | ||
| + | public void onCreate() { | ||
| + | super.onCreate(); | ||
| + | // Initialize the Audience Network SDK | ||
| + | AudienceNetworkAds.initialize(this); | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | MainActivity.java を NativeAdActivity.java へリネームして以下の通り記述 | ||
| + | <pre> | ||
| + | import android.support.v7.app.AppCompatActivity; | ||
| + | import android.os.Bundle; | ||
| + | import android.util.Log; | ||
| + | import android.view.LayoutInflater; | ||
| + | import android.view.View; | ||
| + | import android.widget.Button; | ||
| + | import android.widget.LinearLayout; | ||
| + | import android.widget.TextView; | ||
| + | |||
| + | import com.facebook.ads.*; | ||
| + | |||
| + | import java.util.ArrayList; | ||
| + | import java.util.List; | ||
| + | |||
| + | public class NativeAdActivity extends AppCompatActivity { | ||
| + | |||
| + | private final String TAG = NativeAdActivity.class.getSimpleName(); | ||
| + | private NativeAd nativeAd; | ||
| + | private NativeAdLayout nativeAdLayout; | ||
| + | private LinearLayout adView; | ||
| + | |||
| + | @Override | ||
| + | protected void onCreate(Bundle savedInstanceState) { | ||
| + | super.onCreate(savedInstanceState); | ||
| + | setContentView(R.layout.activity_main); | ||
| + | |||
| + | loadNativeAd(); | ||
| + | } | ||
| + | |||
| + | 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, "VID_HD_9_16_39S_APP_INSTALL#YOUR_PLACEMENT_ID"); | ||
| + | |||
| + | nativeAd.setAdListener(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!"); | ||
| + | // Race condition, load() called again before last ad was displayed | ||
| + | if (nativeAd == null || nativeAd != ad) { | ||
| + | return; | ||
| + | } | ||
| + | // Inflate Native Ad into Container | ||
| + | inflateAd(nativeAd); | ||
| + | } | ||
| + | |||
| + | @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!"); | ||
| + | } | ||
| + | }); | ||
| + | // AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx"); | ||
| + | if (nativeAd.isAdLoaded()) { | ||
| + | // Request an ad | ||
| + | nativeAd.loadAd(); | ||
| + | } | ||
| + | } | ||
| + | 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, 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. | ||
| + | AdIconView 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); | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
| + | ↑AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx"); は適宜変更 | ||
| + | |||
| + | res/layout/activity_main.xml | ||
| + | <pre> | ||
| + | <?xml version="1.0" encoding="utf-8"?> | ||
| + | <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
| + | xmlns:app="http://schemas.android.com/apk/res-auto" | ||
| + | xmlns:tools="http://schemas.android.com/tools" | ||
| + | android:layout_width="match_parent" | ||
| + | android:layout_height="match_parent" | ||
| + | tools:context=".NativeAdActivity"> | ||
| + | |||
| + | <TextView | ||
| + | android:layout_width="wrap_content" | ||
| + | android:layout_height="wrap_content" | ||
| + | android:text="Hello World!" | ||
| + | app:layout_constraintBottom_toBottomOf="parent" | ||
| + | app:layout_constraintLeft_toLeftOf="parent" | ||
| + | app:layout_constraintRight_toRightOf="parent" | ||
| + | app:layout_constraintTop_toTopOf="parent" /> | ||
| + | |||
| + | <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> | ||
| + | |||
| + | </android.support.constraint.ConstraintLayout> | ||
| + | </pre> | ||
| + | |||
| + | res/layout/native_ad_layout.xml | ||
| + | <pre> | ||
| + | <?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.AdIconView | ||
| + | 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> | ||
| + | </pre> | ||
| + | |||
| + | ==テストデバイス== | ||
| + | AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx"); | ||
| + | nativeAd.loadAd(); | ||
| + | loadAd()直前にaddTestDeviceを追加 | ||
| + | |||
| + | addTestDeviceは実機をつないで接続するとその端末のTestDeviceがlogcatに表示されるので、それを入力する。 | ||
| + | |||
| + | https://www.programcreek.com/java-api-examples/?class=com.facebook.ads.AdSettings&method=addTestDevice | ||
| + | |||
| + | AudienceNetworkAds.initialize()の下とかだとだめっぽい。 | ||
| + | |||
| + | ==動画サンプルID== | ||
| + | NativeAd nativeAd = new NativeAd(this, "VID_HD_9_16_39S_APP_INSTALL#YOUR_PLACEMENT_ID"); | ||
| + | とか | ||
| + | NativeAd nativeAd = new NativeAd(this, "VID_HD_16_9_46S_APP_INSTALL#YOUR_PLACEMENT_ID"); | ||
| + | これだとフォーマットがランダムで出る?(facebookログインが必要?) | ||
| + | NativeAd nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID"); | ||
| + | |||
| + | https://developers.facebook.com/docs/audience-network/testing/inserted-code/ | ||
| + | |||
| + | https://developers.facebook.com/docs/audience-network/audio-guideline | ||
| + | |||
| + | ==音声が混ざらないように== | ||
| + | https://developers.facebook.com/docs/audience-network/audio-guideline | ||
| + | |||
| + | ==adChoiceアイコン== | ||
| + | <pre> | ||
| + | AdOptionsView adOptionsView = new AdOptionsView(mActivity, nativeAd, nativeAdLayout); | ||
| + | adOptionsView.setSingleIcon(true); // デフォルトだと○にinfoアイコンと▷にchoiceアイコンの2つだが、これをtrueにすると▷にchoiceアイコンだけとなる | ||
| + | //adOptionsView.setIconSizeDp(40); // アイコンサイズ設定可能 | ||
| + | //adOptionsView.setIconColor(Color.BLUE); // アイコン色設定可能 | ||
| + | </pre> | ||
| + | |||
| + | =="Native ad failed to load: In order to use cache in Facebook Audience Network SDK you should whitelist 127.0.0.1 in your Network Security Configuration:"エラー== | ||
| + | 以下を追加 | ||
| + | |||
| + | res/xml/network_security_config.xml | ||
| + | <pre> | ||
| + | <?xml version="1.0" encoding="utf-8"?> | ||
| + | <network-security-config> | ||
| + | <domain-config cleartextTrafficPermitted="true"> | ||
| + | <domain includeSubdomains="true">127.0.0.1</domain> | ||
| + | </domain-config> | ||
| + | </network-security-config> | ||
| + | </pre> | ||
| + | |||
| + | AndroidManifest.xml | ||
| + | <pre> | ||
| + | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
| + | package="jp.example.hogeproject"> | ||
| + | <application android:networkSecurityConfig="@xml/network_security_config"> | ||
| + | </application> | ||
| + | </manifest> | ||
| + | </pre> | ||
| + | |||
| + | android9以降ではセキュリティが向上したため必須 | ||
| + | https://developers.facebook.com/docs/audience-network/android-network-security-config?locale=ja_JP | ||
2019年10月30日 (水) 18:38時点における最新版
目次
native広告のandroid組込
https://developers.facebook.com/docs/audience-network/android-native
準備
app/build.gradle追加
dependencies {
compile 'com.android.support:recyclerview-v7:25.3.1' // Required Dependency by Audience Network SDK
compile 'com.facebook.android:audience-network-sdk:5.+'
}
https://developers.facebook.com/docs/audience-network/android
サンプル
MyApplication.java
import android.app.Application;
import com.facebook.ads.AudienceNetworkAds;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Initialize the Audience Network SDK
AudienceNetworkAds.initialize(this);
}
}
MainActivity.java を NativeAdActivity.java へリネームして以下の通り記述
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.facebook.ads.*;
import java.util.ArrayList;
import java.util.List;
public class NativeAdActivity extends AppCompatActivity {
private final String TAG = NativeAdActivity.class.getSimpleName();
private NativeAd nativeAd;
private NativeAdLayout nativeAdLayout;
private LinearLayout adView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadNativeAd();
}
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, "VID_HD_9_16_39S_APP_INSTALL#YOUR_PLACEMENT_ID");
nativeAd.setAdListener(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!");
// Race condition, load() called again before last ad was displayed
if (nativeAd == null || nativeAd != ad) {
return;
}
// Inflate Native Ad into Container
inflateAd(nativeAd);
}
@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!");
}
});
// AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx");
if (nativeAd.isAdLoaded()) {
// Request an ad
nativeAd.loadAd();
}
}
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, 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.
AdIconView 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);
}
}
↑AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx"); は適宜変更
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NativeAdActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<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>
</android.support.constraint.ConstraintLayout>
res/layout/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.AdIconView
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>
テストデバイス
AdSettings.addTestDevice("0bd2axxxxxxxxxxxxxxxxxxxxxxxxx");
nativeAd.loadAd();
loadAd()直前にaddTestDeviceを追加
addTestDeviceは実機をつないで接続するとその端末のTestDeviceがlogcatに表示されるので、それを入力する。
AudienceNetworkAds.initialize()の下とかだとだめっぽい。
動画サンプルID
NativeAd nativeAd = new NativeAd(this, "VID_HD_9_16_39S_APP_INSTALL#YOUR_PLACEMENT_ID");
とか
NativeAd nativeAd = new NativeAd(this, "VID_HD_16_9_46S_APP_INSTALL#YOUR_PLACEMENT_ID");
これだとフォーマットがランダムで出る?(facebookログインが必要?)
NativeAd nativeAd = new NativeAd(this, "YOUR_PLACEMENT_ID");
https://developers.facebook.com/docs/audience-network/testing/inserted-code/
https://developers.facebook.com/docs/audience-network/audio-guideline
音声が混ざらないように
https://developers.facebook.com/docs/audience-network/audio-guideline
adChoiceアイコン
AdOptionsView adOptionsView = new AdOptionsView(mActivity, nativeAd, nativeAdLayout); adOptionsView.setSingleIcon(true); // デフォルトだと○にinfoアイコンと▷にchoiceアイコンの2つだが、これをtrueにすると▷にchoiceアイコンだけとなる //adOptionsView.setIconSizeDp(40); // アイコンサイズ設定可能 //adOptionsView.setIconColor(Color.BLUE); // アイコン色設定可能
"Native ad failed to load: In order to use cache in Facebook Audience Network SDK you should whitelist 127.0.0.1 in your Network Security Configuration:"エラー
以下を追加
res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.example.hogeproject">
<application android:networkSecurityConfig="@xml/network_security_config">
</application>
</manifest>
android9以降ではセキュリティが向上したため必須 https://developers.facebook.com/docs/audience-network/android-network-security-config?locale=ja_JP
