---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/android/native.md
  - https://ads.yandex.com/helpcenter/pt/dev/android/native.md
  - https://ads.yandex.com/helpcenter/ru/dev/android/native.md
  - https://ads.yandex.com/helpcenter/zh/dev/android/native.md
  - href: ru/dev/android/native.md
    type: text/markdown
    title: Markdown version
  - href: llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/ru/llms.txt


[//]: # (Эта страница переводится также на бразильский португальский — pt-BR)

<!--
Используется в Boost: boost/ru/ad-monetization/dev/android
-->

# Нативная реклама

<!-- source: ru/dev/_includes/native-ads.md -->
Нативная реклама — реклама, внешний вид которой может определяться на стороне приложения. Данная особенность позволяет изменять визуальный стиль объявлений и места их размещения с учетом особенностей дизайна приложения.
<!-- endsource: ru/dev/_includes/native-ads.md -->

<!-- source: ru/dev/_includes/native-ads.md -->
Нативные объявления улучшают впечатления от рекламы, поэтому вы можете показывать больше объявлений, не теряя интерес пользователей. Это позволяет обеспечить максимальный доход от рекламы в долгосрочной перспективе.
<!-- endsource: ru/dev/_includes/native-ads.md -->

<!-- source: ru/dev/_includes/native-ads.md -->
Отрисовка рекламы производится нативными средствами платформы, что увеличивает ее производительность и качество.
<!-- endsource: ru/dev/_includes/native-ads.md -->

{% cut "Внешний вид" %}

<img src="https://yastatic.net/s3/doc-binary/src/docs/support/mobile-ads/ru/monetization/_images/native-ru-ex.png" width="200">

{% endcut %}

Это руководство покажет, как интегрировать нативную рекламу в Android‐приложение. В дополнение к примерам кода и инструкции оно содержит рекомендации по использованию данного формата рекламы, а также ссылки на дополнительные ресурсы.


## Пререквизит {#pre}

<!-- source: ru/dev/_includes/pre-android.md -->
1. Выполните шаги по интеграции SDK, описанные в [Быстром старте](https://ads.yandex.com/helpcenter/ru/dev/android/quick-start.md).
2. Заранее [проинициализируйте](https://ads.yandex.com/helpcenter/ru/dev/android/quick-start.md#init) рекламный SDK.
3. Убедитесь, что используете [последнюю версию Yandex Mobile Ads SDK](https://ads.yandex.com/helpcenter/ru/dev/android/changelog-android.md), а в случае использования медиации — наиболее свежую [версию единой сборки](https://ads.yandex.com/helpcenter/ru/dev/android/changelog-android.md).
<!-- endsource: ru/dev/_includes/pre-android.md -->

## Имплементация {#implement}

Основные шаги по интеграции нативной рекламы:

* Создать и настроить загрузчик рекламы NativeAdLoader.
* Зарегистрировать слушатель событий загрузчика объявлений.
* Загрузить рекламу.
* Отобразить загруженное объявление.

## Особенности подключения нативной рекламы {#features}

1. Все вызовы методов Yandex Mobile Ads SDK необходимо выполнять из главного потока.

2. Если вы получили ошибку в коллбэке `onAdFailedToLoad()`, не пытайтесь загрузить новое объявление снова. Если все же необходимо это сделать, ограничьте число повторных попыток загрузки рекламы. Это поможет избежать постоянных неудачных запросов и проблем с подключением в случае ограничений.

3. Рекомендуется держать сильную ссылку на рекламу и ее загрузчик на всем протяжении жизни экрана, в рамках которого происходит взаимодействие с рекламой.

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

5. Объявления с видео, как правило, показывают лучший результат. Для отображения рекламы с видео необходимо чтобы размер рекламного контейнера и компонента MediaView были не меньше 300x160 dp (density-independent pixels).

6. Рекомендуется использовать макет, который включает весь набор возможных компонентов. Как показывает практика, макеты, включающие весь набор компонентов, приводит к лучшим конверсиям.

## Правила отрисовки полноэкранной нативной рекламы {#banner-assets}

<!-- source: ru/dev/_includes/banner-assets.md -->
1. Высота верхней некликабельной сейф-зоны 80 dp. Контролы внутри зоны могут быть кликабельны.

1. Размер визуального элемента (ассета) — не менее 32×32 dp. Это может быть значок закрытия или любой другой значок.

1. Кликабельная зона вокруг ассета — не менее 64×64 dp. Например, если ассет имеет размер 32×32 dp, то отступы вокруг него должны обеспечивать общую кликабельную область 64×64 dp.

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

{% cut "Пример" %}

![](../../_images/common/banner-assets.png)

{% endcut %} 
<!-- endsource: ru/dev/_includes/banner-assets.md -->

## Загрузка рекламы {#load}

Для загрузки нативной рекламы необходимо создать объект `NativeAdLoader`.

Параметры запроса за рекламой настраиваются через объект класса `AdRequest.Builder`. В качестве параметров запроса можно передать идентификатор рекламного блока, способ загрузки изображений и другие данные, способные улучшить качество подбора рекламы. Подробнее читайте в разделе [Таргетирование рекламы](https://ads.yandex.com/helpcenter/ru/dev/android/target.md).

Для получения уведомлений о результате загрузки объявлений, создайте экземпляр `NativeAdLoadListener` и передайте его в метод `loadAd()`.

Для загрузки рекламы вызовите метод `loadAd()`.

В примере ниже показано как загрузить нативную рекламу из Activity:

{% list tabs %}

- Kotlin
  ```kotlin
  class CustomNativeAdActivity : AppCompatActivity(R.layout.activity_custom_native_ad) {

    private val nativeAdView get() = binding.nativeAd.root

    private var nativeAdLoader: NativeAdLoader? = null

    private lateinit var binding: ActivityCustomNativeAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        nativeAdLoader = NativeAdLoader(this)
        nativeAdLoader?.loadAd(
            // Methods in the AdRequest.Builder class can be used here to specify individual options settings.
            AdRequest.Builder("your-ad-unit-id").build(),
            object : NativeAdLoadListener {
                override fun onAdLoaded(p0: NativeAd) {
                    // The ad was loaded successfully. Now you can show loaded ad.
                }

                override fun onAdFailedToLoad(p0: AdRequestError) {
                    // Ad failed to load with AdRequestError.
                    // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                }
            })
    }
  }
  ```
- Java
  ```java
  class CustomNativeAdActivity extends AppCompatActivity {
    private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();

    @Nullable private NativeAdLoader mNativeAdLoader = null;

    private ActivityCustomNativeAdBinding mBinding;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        mNativeAdLoader = new NativeAdLoader(this);
        // Methods in the AdRequest.Builder class can be used here to specify individual options settings.
        mNativeAdLoader.loadAd(
                new AdRequest.Builder("your-ad-unit-id").build(),
                new NativeAdLoadListener() {
                    @Override
                    public void onAdLoaded(@NonNull final NativeAd nativeAd) {
                        // The ad was loaded successfully. Now you can show loaded ad.
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull final AdRequestError error) {
                        // Ad failed to load with AdRequestError.
                        // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                    }
                }
        );
    }
  }
  ```
{% endlist %}

<!-- source: ru/dev/_includes/ad-attributes.md -->
Если вы размещаете рекламу через систему Adfox, после загрузки баннера данные `campaignId`, `bannerId` и `placeId` доступны из объектов `NativeAd` или `BannerAdView` через свойство `adAttributes` типа `AdAttributes`.
<!-- endsource: ru/dev/_includes/ad-attributes.md -->

## Показ рекламных объявлений {#ad-view}

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

### Ручная настройка внешнего оформления нативной рекламы {#config}

Данный способ позволяет самостоятельно сверстать макет нативной рекламы, определить расположение компонентов рекламы относительно друг друга. В объявлении могут присутствовать как обязательные, так и опциональные для показа компоненты. Полный их перечень можно найти в разделе [Компоненты нативной рекламы](https://ads.yandex.com/helpcenter/ru/dev/android/components.md).

{% note tip %}

Рекомендуется использовать макет, который включает весь набор возможных компонентов. Как показывает практика, макет, включающий весь набор компонентов, приводит к лучшим конверсиям.

{% endnote %}

Для каждого компонента рекламного объявления предоставьте View через экземпляр класса `NativeAdViewBinder.Builder`. Класс принимает в качестве аргумента контейнер `NativeAdView`. Все компоненты рекламы должны быть определены как subview данного контейнера.

Сформированный макет рекламного объявления необходимо связать с объектом нативной рекламы `NativeAd`.

{% cut "Пример кода" %}

   {% list tabs %}

   - Kotlin

     ```kotlin
     private fun showAd(nativeAd: NativeAd) {
         val nativeAdViewBinder = binding.nativeAd.run {
             NativeAdViewBinder.Builder(nativeAdView)
                 .setAgeView(age)
                 .setBodyView(body)
                 .setCallToActionView(callToAction)
                 .setDomainView(domain)
                 .setFaviconView(favicon)
                 .setFeedbackView(feedback)
                 .setIconView(icon)
                 .setMediaView(media)
                 .setPriceView(price)
                 .setRatingView(rating)
                 .setReviewCountView(reviewCount)
                 .setSponsoredView(sponsored)
                 .setTitleView(title)
                 .setWarningView(warning)
                 .build()
         }

         when (val result = nativeAd.bindNativeAd(nativeAdViewBinder)) {
             is AdBindingResult.Failure -> {
                 Logger.error(result.exception.message.orEmpty())
             }
             AdBindingResult.Success -> {
                 nativeAd.setNativeAdEventListener(NativeAdEventLogger())
             }
         }
     }

     private inner class NativeAdEventLogger : NativeAdEventListener {

         override fun onAdClicked() {
             // Called when a click is recorded for an ad.
         }

         override fun onImpression(data: ImpressionData?) {
             // Called when an impression is recorded for an ad.
         }
     }
     ```

   - Java

     ```java
     private void showAd(@NonNull final NativeAd nativeAd) {
         final NativeAdViewBinder nativeAdViewBinder = new NativeAdViewBinder.Builder(mNativeAdView)
                 .setAgeView(age)
                 .setBodyView(body)
                 .setCallToActionView(callToAction)
                 .setDomainView(domain)
                 .setFaviconView(favicon)
                 .setFeedbackView(feedback)
                 .setIconView(icon)
                 .setMediaView(media)
                 .setPriceView(price)
                 .setRatingView(rating)
                 .setReviewCountView(reviewCount)
                 .setSponsoredView(sponsored)
                 .setTitleView(title)
                 .setWarningView(warning)
                 .build();
         AdBindingResult result = nativeAd.bindNativeAd(nativeAdViewBinder);
         if (result instanceof AdBindingResult.Failure) {
             Log.e("TAG", ((AdBindingResult.Failure) result).getException().getMessage());
         } else {
             nativeAd.setNativeAdEventListener(new CustomNativeAdActivity.NativeAdEventLogger());
         }
     }

     private class NativeAdEventLogger implements NativeAdEventListener {
         @Override
         public void onAdClicked() {
             // Called when a click is recorded for an ad.
         }

         @Override
         public void onImpression(@Nullable ImpressionData data) {
             // Called when an impression is recorded for an ad.
         }
     }
     ```
   {% endlist %}

{% endcut %}

## Загрузка нескольких рекламных объявлений {#load-more-ads}

Yandex Mobile Ads SDK предоставляет возможность загрузки нескольких рекламных объявлений одним запросом (до девяти объявлений).

Для балкового запроса за рекламой воспользуйтесь экземпляром класса `NativeBulkAdLoader`. Экземпляр класса принимает в методе `loadAds` аргумент `count`, определяющий желаемое количество объявлений за один запрос.

{% cut "Пример кода" %}

   {% list tabs %}

   - Kotlin

     ```kotlin
     class NativeBulkAdLoaderActivity : AppCompatActivity(R.layout.activity_custom_native_ad) {

         private val nativeAdView get() = binding.nativeAd.root

         private var nativeAdsLoader: NativeBulkAdLoader? = null

         private lateinit var binding: ActivityCustomNativeAdBinding

         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
             setContentView(binding.root)

             nativeAdsLoader = NativeBulkAdLoader(this)
             // Methods in the AdRequest.Builder class can be used here to specify individual options settings.
             nativeAdsLoader?.loadAds(
                 AdRequest.Builder("your-ad-unit-id").build(),
                 3,
                 object : NativeBulkAdLoadListener {
                     override fun onAdsLoaded(p0: MutableList<NativeAd>) {
                         // The ads was loaded successfully. Now you can show loaded ads.
                         for (nativeAd in p0) {
                             showAd(nativeAd)
                         }
                     }

                     override fun onAdsFailedToLoad(p0: AdRequestError) {
                         // Ad failed to load with AdRequestError.
                         // Attempting to load a new ads from the onAdFailedToLoad() method is strongly discouraged.
                     }
                 })
         }
     }
     ```
   - Java

     ```java
     class CustomBulkNativeAdActivity extends AppCompatActivity {
         private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();

         @Nullable private NativeBulkAdLoader mNativeAdsLoader = null;

         private ActivityCustomNativeAdBinding mBinding;

         @Override
         public void onCreate(@Nullable Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
             setContentView(mBinding.getRoot());

             mNativeAdsLoader = new NativeBulkAdLoader(this);
             // Methods in the AdRequest.Builder class can be used here to specify individual options settings.
             mNativeAdsLoader.loadAds(
                     new AdRequest.Builder("your-ad-unit-id").build(),
                     3,
                     new NativeBulkAdLoadListener() {
                         @Override
                         public void onAdsLoaded(@NonNull final List<NativeAd> list) {
                             // The ad was loaded successfully. Now you can show loaded ad.
                         }

                         @Override
                         public void onAdsFailedToLoad(@NonNull final AdRequestError error) {
                             // Ad failed to load with AdRequestError.
                             // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                         }
                     }
             );
         }
     }
     ```

   {% endlist %}

{% endcut %}

{% note info %}

Балковый запрос за рекламой позволяет подобрать несколько отличающихся друг от друга объявлений.

Массив рекламных объявлений, полученный в результате балкового запроса, может содержать от 0 до `count` объектов `NativeAd`. Все полученные объекты рекламы можно показывать независимо друг от друга, используя описанные выше способы внешнего оформления нативных объявлений.

{% endnote %}

## Тестирование интеграции нативной рекламы {#test}

### Использование демоблоков для тестирования рекламы {#demo-blocks}

Для проверки корректной интеграции нативной рекламы, а также для тестирования вашего приложения, рекомендуется использовать тестовую рекламу.

Для гарантированного возврата тестовых объявлений на каждый запрос за рекламой, мы создали специальный демонстрационный идентификатор рекламного места. Используйте его для проверки корректной интеграции рекламы.

Демонстрационный `adUnitId` для комбинаторной рекламы: `demo-native-content-yandex`.

Демонстрационный `adUnitId` для рекламы мобильных приложений: `demo-native-app-yandex`.

{% note warning %}

Убедитесь, что перед выкладыванием приложения в store, вы заменили демонстрационный идентификатор рекламного места на настоящий, полученный в интерфейсе Рекламной сети Яндекса.

{% endnote %}

<!-- Список всех доступных демонстрационных идентификаторов рекламного места доступен в разделе [Тестовые объявления](ссылка). -->

### Проверка корректной интеграции рекламы {#test-int}

Проверить корректность интеграции нативной рекламы можно через встроенный в sdk анализатор.

Данный инструмент проверяет корректность подключения нативной рекламы и выводит в лог подробный отчет.
Для просмотра отчета, выполните поиск по ключевому слову "YandexAds" в инструменте отладки Android-приложений [Logcat](https://developer.android.com/studio/command-line/logcat).

```bash
adb logcat -v brief '*:S YandexAds'
```

В случае успешной интеграции, вы увидите следующее сообщение:
```bash
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type native was integrated successfully
```

В случае обнаружения проблем при интеграции нативной рекламы — подробный отчет о проблемах и рекомендации по их устранению.

### Индикатор корректной интеграции нативной рекламы {#indicator}

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

{% note info %}

Теперь индикатор корректной интеграции можно включить/отключить в [Debug Panel](https://ads.yandex.com/helpcenter/ru/dev/android/debug-panel.md).

{% endnote %}

Чтобы включить отображение индикатора в отладочном режиме, вызовите метод `enableDebugErrorIndicator` со значением `true`:

```java
YandexAds.enableDebugErrorIndicator(true)
```
{% list tabs %}

- Успешная интеграция

  Если интеграция прошла успешно, то в отладочном режиме, поверх рекламного объявления появится рамка светлого зеленого цвета.

  <img src="https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/ru/images/indicator-ok.png">

- Интеграция с ошибкой

  Если при интеграции нативной рекламы допущена ошибка, то в отладочном режиме, поверх рекламного объявления, появится индикатор. По нажатию на индикатор вы увидите сообщение с отладочной информацией, по которой можно понять причину ошибки. Повторное нажатие на индикатор скрывает сообщение.

  #|
   || <img src="https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/ru/images/house_closed_1.png"> | <img src="https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/ru/images/house_open_1.png"> ||
  |#


{% endlist %}

Чтобы выключить отображение индикатора в отладочном режиме, вызовите метод `enableDebugErrorIndicator` со значением `false`:

```java
YandexAds.enableDebugErrorIndicator(false)
```

## Аппаратное ускорение для видеорекламы {#speed-up}

Чтобы видеореклама успешно проигрывалась на экране вашего приложении, необходимо чтобы было включено аппаратное ускорение (подробнее в [документации](https://developer.android.com/guide/topics/graphics/hardware-accel)).

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

{% cut "Код включения аппаратного ускорения" %}

```
<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
</application>
```

{% endcut %}
