Добавление нативной баннерной рекламы в приложение для Android

С помощью API нативной баннерной рекламы можно создать индивидуально настроенную нативную рекламу без использования объектов оформления рекламодателя, таких как изображения, видео или контент кольцевой галереи. Как и в случае с нативной рекламой, вы получаете набор свойств рекламы, таких как название, значок и призыв к действию, которые позволяют разработать для нее индивидуально настроенное представление. Однако в отличие от баннерной рекламы API нативной баннерной рекламы позволяет работать с нативной компоновкой, благодаря чему вы полностью контролируете расположение компонентов рекламного объявления.

Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и Android.

Из этого руководства вы узнаете, как реализовать размещение нативной баннерной рекламы. Вы создадите нативную баннерную рекламу со следующими компонентами:

Представление 1. AdOptionsView

Представление 2. Метка "Реклама"

Представление 3. Значок рекламы

Представление 4. Заголовок рекламы

Представление 5. Социальный контекст

Представление 6. Кнопка призыва к действию




Создание нативной баннерной рекламы

Шаг 1. Запрос нативной баннерной рекламы

Шаг 2. Создание компоновки нативной баннерной рекламы

Шаг 3. Заполнение компоновки метаданными рекламы

Инициализация SDK Audience Network

Этот метод добавлен в 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);       
    }
    ...
}

Шаг 1. Запрос нативной баннерной рекламы

Чтобы импортировать 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().

Шаг 2. Создание компоновки нативной баннерной рекламы

Следующий шаг — получение метаданных рекламы и использование ее свойств для создания пользовательского нативного интерфейса. Вы можете создать индивидуальное представление в 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>

Шаг 3. Заполнение компоновки метаданными рекламы

Сценарий 1. Немедленное отображение объявления после загрузки. Измените показанный выше метод 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)

Сценарий 2. Отображение объявления через несколько секунд или минут после загрузки. Прежде чем показывать объявление, необходимо проверить, не было ли оно признано недействительным.

Если сразу же после загрузки рекламное объявление не показывается, разработчик должен проверить, не стала ли реклама недействительной. После успешной загрузки реклама остается действительной в течение 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 минут. Если вы планируете использовать метаданные после этого периода времени, выполните вызов, чтобы загрузить новую рекламу.

Дальнейшие действия

  • Если вы хотите добавить нативную рекламу в свое приложение, ознакомьтесь с руководством по шаблону нативной рекламы.

  • Изучите наши примеры кода, демонстрирующие способы использования нативной рекламы. NativeBannerAdSample является частью SDK и находится в папке AudienceNetwork/samples. Импортируйте проект в свою интегрированную среду разработки и запустите его на устройстве или в эмуляторе.

Дополнительные ресурсы

Руководство по началу работы

Техническое руководство по началу работы с Audience Network

Примеры кода

Примеры интеграции рекламы из Audience Network

Часто задаваемые вопросы

Часто задаваемые вопросы о Audience Network

Шаблон нативной рекламы

Автоматизированная интеграция нативной рекламы