С помощью API нативной баннерной рекламы можно создать индивидуально настроенную нативную рекламу без использования объектов оформления рекламодателя, таких как изображения, видео или контент кольцевой галереи. Как и в случае с нативной рекламой, вы получаете набор свойств рекламы, таких как название, значок и призыв к действию, которые позволяют разработать для нее индивидуально настроенное представление. Однако в отличие от баннерной рекламы API нативной баннерной рекламы позволяет работать с нативной компоновкой, благодаря чему вы полностью контролируете расположение компонентов рекламного объявления.
Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и Android.
Из этого руководства вы узнаете, как реализовать размещение нативной баннерной рекламы. Вы создадите нативную баннерную рекламу со следующими компонентами:
Представление 1. AdOptionsViewПредставление 2. Метка "Реклама"Представление 3. Значок рекламы | Представление 4. Заголовок рекламыПредставление 5. Социальный контекстПредставление 6. Кнопка призыва к действию |
Этот метод добавлен в SDK Audience Network 5.1 для Android.
Начиная с версии 5.3.0
явная инициализация SDK Audience Network для Android обязательна. Информацию о том, как инициализировать SDK Audience Network для Android, см. в этом документе.
Чтобы создавать рекламные объекты и загружать рекламу, необходимо инициализировать SDK Audience Network. Рекомендуется сделать это при запуске приложения.
public class YourApplication extends Application { ... @Override public void onCreate() { super.onCreate(); // Initialize the Audience Network SDK AudienceNetworkAds.initialize(this); } ... }
Чтобы импортировать SDK Facebook Ads, добавьте в начало действия следующий код:
import com.facebook.ads.*;
Затем создайте экземпляр объекта NativeBannerAd
, задайте AdListener
и вызовите loadAd(...)
в классе Activity:
public class NativeBannerAdActivity extends Activity { private final String TAG = NativeBannerAdActivity.class.getSimpleName(); private NativeBannerAd nativeBannerAd; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Instantiate a NativeBannerAd 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). nativeBannerAd = new NativeBannerAd(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!"); } }); // load the ad nativeBannerAd.loadAd( nativeBannerAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); } }
Позднее мы вернемся к этому шагу и добавим код метода onAdLoaded()
.
Следующий шаг — получение метаданных рекламы и использование ее свойств для создания пользовательского нативного интерфейса. Вы можете создать индивидуальное представление в XML-файле компоновки или добавить элементы в код.
Разработать оформление нативной баннерной рекламы в приложении вам поможет наше руководство по нативной баннерной рекламе.
Добавьте в компоновку Activity activity_main.xml
контейнер нативной баннерной рекламы. Контейнер должен представлять собой com.facebook.ads.NativeAdLayout, то есть оболочку FrameLayout с дополнительными функциями, которые позволяют нам отображать нативный поток отчетов о рекламе поверх объявлений. Позднее, в методе onAdLoaded()
, в этот контейнер нужно будет подставить представление нативной рекламы.
<?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"> ... <com.facebook.ads.NativeAdLayout android:id="@+id/native_banner_ad_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" /> ... </RelativeLayout>
Создайте для своей нативной баннерной рекламы пользовательскую компоновку native_banner_ad_unit.xml
:
Ниже приведен пример пользовательской компоновки для нативной баннерной рекламы:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <RelativeLayout android:id="@+id/ad_choices_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="2dp" /> <TextView android:id="@+id/native_ad_sponsored_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:ellipsize="end" android:lines="1" android:padding="2dp" android:textColor="@android:color/darker_gray" android:textSize="12sp" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white"> <com.facebook.ads.MediaView android:id="@+id/native_icon_view" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:orientation="vertical" android:paddingLeft="53dp" android:paddingRight="83dp"> <TextView android:id="@+id/native_ad_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:textColor="@android:color/black" android:textSize="15sp" android:textStyle="bold" /> <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:textSize="12sp" /> </LinearLayout> <Button android:id="@+id/native_ad_call_to_action" android:layout_width="80dp" android:layout_height="50dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:background="#4286F4" android:gravity="center" android:paddingLeft="3dp" android:paddingRight="3dp" android:textColor="@android:color/white" android:textSize="12sp" android:visibility="gone" /> </RelativeLayout> </LinearLayout>
onAdLoaded()
таким образом, чтобы он извлекал свойства Native Banner Ad's
и показывал рекламу:public class NativeBannerAdActivity extends Activity { private NativeAdLayout nativeAdLayout; private LinearLayout adView; private NativeBannerAd nativeBannerAd; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Instantiate a NativeBannerAd 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). nativeBannerAd = new NativeBannerAd(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 (nativeBannerAd == null || nativeBannerAd != ad) { return; } // Inflate Native Banner Ad into Container inflateAd(nativeBannerAd); } ... }); // load the ad nativeBannerAd.loadAd( nativeBannerAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); } private void inflateAd(NativeBannerAd nativeBannerAd) { // Unregister last ad nativeBannerAd.unregisterView(); // Add the Ad view into the ad container. nativeAdLayout = findViewById(R.id.native_banner_ad_container); LayoutInflater inflater = LayoutInflater.from(NativeBannerAdActivity.this); // Inflate the Ad view. The layout referenced is the one you created in the last step. adView = (LinearLayout) inflater.inflate(R.layout.native_banner_ad_layout, nativeAdLayout, false); nativeAdLayout.addView(adView); // Add the AdChoices icon RelativeLayout adChoicesContainer = adView.findViewById(R.id.ad_choices_container); AdOptionsView adOptionsView = new AdOptionsView(NativeBannerAdActivity.this, nativeBannerAd, nativeAdLayout); adChoicesContainer.removeAllViews(); adChoicesContainer.addView(adOptionsView, 0); // Create native UI using the ad metadata. TextView nativeAdTitle = adView.findViewById(R.id.native_ad_title); TextView nativeAdSocialContext = adView.findViewById(R.id.native_ad_social_context); TextView sponsoredLabel = adView.findViewById(R.id.native_ad_sponsored_label); MediaView nativeAdIconView = adView.findViewById(R.id.native_icon_view); Button nativeAdCallToAction = adView.findViewById(R.id.native_ad_call_to_action); // Set the Text. nativeAdCallToAction.setText(nativeBannerAd.getAdCallToAction()); nativeAdCallToAction.setVisibility( nativeBannerAd.hasCallToAction() ? View.VISIBLE : View.INVISIBLE); nativeAdTitle.setText(nativeBannerAd.getAdvertiserName()); nativeAdSocialContext.setText(nativeBannerAd.getAdSocialContext()); sponsoredLabel.setText(nativeBannerAd.getSponsoredTranslation()); // Register the Title and CTA button to listen for clicks. List<View> clickableViews = new ArrayList<>(); clickableViews.add(nativeAdTitle); clickableViews.add(nativeAdCallToAction); nativeBannerAd.registerViewForInteraction(adView, nativeAdIconView, clickableViews); } }
SDK будет автоматически регистрировать показы и обрабатывать клики. Обратите внимание: чтобы активировать эту функцию, необходимо зарегистрировать представление рекламы с помощью экземпляра NativeBannerAd
. Чтобы сделать элементы рекламы интерактивными, зарегистрируйте ее, используя следующий код:
registerViewForInteraction(View view, MediaView adIconView)
Если сразу же после загрузки рекламное объявление не показывается, разработчик должен проверить, не стала ли реклама недействительной. После успешной загрузки реклама остается действительной в течение 60 минут. Показ недействительной рекламы не оплачивается. Чтобы проверить рекламу, вызовите метод isAdInvalidated()
.
Следуйте идее ниже, но не копируйте код в свой проект, так как это всего лишь пример:
public class NativeBannerAdActivity extends Activity { private NativeBannerAd nativeBannerAd; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Instantiate a NativeBannerAd 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). nativeBannerAd = new NativeBannerAd(this, "YOUR_PLACEMENT_ID"); NativeAdListener nativeAdListener = new NativeAdListener() { ... }); // load the ad nativeBannerAd.loadAd( nativeBannerAd.buildLoadAdConfig() .withAdListener(nativeAdListener) .build()); } private void showAdWithDelay() { /** * 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 nativeBannerAd has been loaded successfully if(nativeBannerAd == null || !nativeBannerAd.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(nativeBannerAd.isAdInvalidated()) { return; } inflateAd(nativeBannerAd); // Inflate Native Banner Ad into Container same as in previous code example } }, 1000 * 60 * 15); // Show the ad after 15 minutes } }
Если вы хотите сделать свою рекламу удобной для пользователей и результативной, всегда старайтесь настроить интерактивную область так, чтобы пользователи не нажимали на нее по ошибке. Подробнее о правилах в отношении некликабельного свободного пространства см. на странице Политика Facebook Audience Network.
Чтобы точно определить интерактивную область, зарегистрируйте в registerViewForInteraction(View view, MediaView adIconView, List<View> clickableViews)
список представлений, на которые можно нажать. Например, чтобы в предыдущем примере сделать интерактивными только заголовок рекламы и кнопку призыва к действию, используйте такой код:
@Override public void onAdLoaded(Ad ad) { ... List<View> clickableViews = new ArrayList<>(); clickableViews.add(nativeAdTitle); clickableViews.add(nativeAdCallToAction); nativeBannerAd.registerViewForInteraction(mAdView, nativeAdIconView, clickableViews); ... }
Если представление будет использоваться для показа других рекламных объявлений, вызовите unregisterView()
перед регистрацией того же самого представления для другого экземпляра NativeBannerAd
.
Выполните код, и вы увидите нативную баннерную рекламу:
Если реклама загружена, значения присваиваются следующим свойствам: title
, icon
и callToAction
. Другие свойства могут быть нулевыми или пустыми. Ваш код должен быть достаточно надежным и предусматривать обработку таких случаев.
Если рекламы для отображения нет, вызывается метод onError
с элементом error.code
. Если вы используете собственную настроенную службу отчетов или агрегацию, для обнаружения подобных случаев можно проверить значение кода. В этой ситуации вы можете перейти на другую рекламную сеть, но не отправляйте сразу же после этого повторный запрос на получение рекламы.
Полученные вами метаданные рекламы можно кэшировать и использовать их в течение 30 минут. Если вы планируете использовать метаданные после этого периода времени, выполните вызов, чтобы загрузить новую рекламу.
Ознакомьтесь с нашими образцами кода Audience Network для Android на портале Github. Импортируйте проекты в свою интегрированную среду разработки и запустите ее на устройстве или в эмуляторе.
Когда вы будете готовы показывать рекламу в приложении, отправьте свое приложение на проверку. Перед отправкой убедитесь в том, что оно соответствует политикам Audience Network и Нормам сообщества Facebook.
Если вы хотите добавить нативную рекламу в свое приложение, ознакомьтесь с руководством по шаблону нативной рекламы.
Изучите наши примеры кода, демонстрирующие способы использования нативной рекламы. NativeBannerAdSample
является частью SDK и находится в папке AudienceNetwork/samples
. Импортируйте проект в свою интегрированную среду разработки и запустите его на устройстве или в эмуляторе.
Дополнительные ресурсы |
Руководство по началу работыТехническое руководство по началу работы с Audience Network Примеры кодаПримеры интеграции рекламы из Audience Network | Часто задаваемые вопросыЧасто задаваемые вопросы о Audience Network Шаблон нативной рекламыАвтоматизированная интеграция нативной рекламы |