---
title: "Получение пейволов Paywall Builder и их конфигурации в Android SDK"
description: "Узнайте, как получить PB-пейволы в Adapty для лучшего контроля подписок в вашем Android-приложении."
---

После того как вы [разработали визуальную часть пейвола](adapty-paywall-builder) с помощью нового Paywall Builder в дашборде Adapty, его можно отобразить в мобильном приложении. Первый шаг — получить пейвол, связанный с плейсментом, и его конфигурацию отображения, как описано ниже.

:::warning
Новый Paywall Builder работает с Android SDK версии 3.0 и выше.
:::

Обратите внимание, что этот раздел посвящён пейволам, настроенным через Paywall Builder. Если вы реализуете пейволы вручную, обратитесь к разделу [Получение пейволов и продуктов для Remote Config-пейволов в мобильном приложении](fetch-paywalls-and-products-android).

:::tip

Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши [примеры приложений](sample-apps) — они демонстрируют полную настройку: отображение пейволов, совершение покупок и другие базовые функции.

:::

<details>
   <summary>Перед тем как начать отображать пейволы в мобильном приложении (нажмите, чтобы раскрыть)</summary>

1. [Создайте продукты](create-product) в дашборде Adapty.
2. [Создайте пейвол и добавьте в него продукты](create-paywall) в дашборде Adapty.
3. [Создайте плейсменты и добавьте в них пейвол](create-placement) в дашборде Adapty.
4. Установите [Adapty SDK](sdk-installation-android) в своё мобильное приложение.
</details>

## Получение пейвола, созданного с помощью Paywall Builder \{#fetch-paywall-designed-with-paywall-builder\}

Если вы [создали пейвол с помощью Paywall Builder](adapty-paywall-builder), вам не нужно самостоятельно реализовывать его отрисовку в коде приложения. Такой пейвол содержит как содержимое, так и способ его отображения. Тем не менее вам нужно получить его ID через плейсмент, конфигурацию отображения и затем показать пейвол в приложении.

Для оптимальной производительности важно получить пейвол и его [конфигурацию отображения](android-get-pb-paywalls#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder) как можно раньше — чтобы изображения успели загрузиться до того, как пейвол будет показан пользователю.

Для получения пейвола используйте метод `getPaywall`:

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers

...

Adapty.getPaywall("YOUR_PLACEMENT_ID", locale = "en", loadTimeout = 10.seconds) { result ->
    when (result) {
        is AdaptyResult.Success -> {
            val paywall = result.value
            // the requested paywall
        }
        is AdaptyResult.Error -> {
            val error = result.error
            // handle the error
        }
    }
}
```
</TabItem>
<TabItem value="java" label="Java" default>

```java showLineNumbers

...

Adapty.getPaywall("YOUR_PLACEMENT_ID", "en", TimeInterval.seconds(10), result -> {
    if (result instanceof AdaptyResult.Success) {
        AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
        // the requested paywall
      
    } else if (result instanceof AdaptyResult.Error) {
        AdaptyError error = ((AdaptyResult.Error) result).getError();
        // handle the error
      
    }
});
```
</TabItem>

</Tabs>

Параметры:

| Параметр | Наличие | Описание |
|---------|--------|-----------|
| **placementId** | обязательный | Идентификатор нужного [плейсмента](placements). Это значение вы задавали при создании плейсмента в дашборде Adapty. |
| **locale** | <p>опциональный</p><p>по умолчанию: `en`</p> | <p>Идентификатор [локализации пейвола](add-paywall-locale-in-adapty-paywall-builder). Ожидается код языка, состоящий из одного или двух подтегов, разделённых символом «минус» (**-**). Первый подтег — язык, второй — регион.</p><p></p><p>Пример: `en` — английский, `pt-br` — бразильский португальский.</p><p>Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе [Локализации и коды локалей](localizations-and-locale-codes).</p> |
| **fetchPolicy** | по умолчанию: `.reloadRevalidatingCacheData` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует, что пользователи всегда получают актуальные данные.</p><p></p><p>Однако если вы считаете, что ваши пользователи работают в условиях нестабильного интернета, рассмотрите использование `.returnCacheDataElseLoad` — возврат кешированных данных при их наличии. В этом случае данные могут быть не самыми последними, но загрузка будет быстрее вне зависимости от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для уменьшения числа сетевых запросов.</p><p></p><p>Обратите внимание, что кеш сохраняется при перезапуске приложения и очищается только при его переустановке или вручную.</p><p></p><p>Adapty SDK хранит пейволы локально в двух слоях: регулярно обновляемый кеш (описан выше) и [резервные пейволы](fallback-paywalls). Мы также используем CDN для более быстрой загрузки пейволов и отдельный резервный сервер на случай недоступности CDN. Эта система обеспечивает получение актуальных пейволов и надёжность даже при слабом интернет-соединении.</p> |
| **loadTimeout** | по умолчанию: 5 сек | <p>Ограничивает время ожидания для этого метода. По истечении таймаута возвращаются кешированные данные или локальный резерв.</p><p>Обратите внимание, что в редких случаях метод может завершиться чуть позже указанного в `loadTimeout` значения, поскольку операция может включать несколько запросов под капотом.</p><p>Для Android: можно создать `TimeInterval` с помощью функций-расширений (например, `5.seconds`, где `.seconds` из `import com.adapty.utils.seconds`) или `TimeInterval.seconds(5)`. Чтобы не устанавливать ограничение, используйте `TimeInterval.INFINITE`.</p> |

Параметры ответа:

| Параметр | Описание |
| :-------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Paywall   | Объект [`AdaptyPaywall`](https://android.adapty.io/adapty/com.adapty.models/-adapty-paywall/) со списком ID продуктов, идентификатором пейвола, Remote Config и рядом других свойств. |

## Получение конфигурации отображения пейвола, созданного с помощью Paywall Builder \{#fetch-the-view-configuration-of-paywall-designed-using-paywall-builder\}

:::important
Убедитесь, что в Paywall Builder включён переключатель **Show on device**. Если эта опция выключена, конфигурацию отображения получить не удастся.
:::

После получения пейвола проверьте, содержит ли он `ViewConfiguration` — это означает, что он был создан с помощью Paywall Builder. Это определит способ его отображения. Если `ViewConfiguration` присутствует, обрабатывайте его как пейвол Paywall Builder; если нет — [обрабатывайте его как Remote Config-пейвол](present-remote-config-paywalls).

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>

Используйте метод `getViewConfiguration` для загрузки конфигурации отображения.

```kotlin showLineNumbers
if (!paywall.hasViewConfiguration) {
    // use your custom logic
    return
}

AdaptyUI.getViewConfiguration(paywall, loadTimeout = 10.seconds) { result ->
    when(result) {
        is AdaptyResult.Success -> {
            val viewConfiguration = result.value
            // use loaded configuration
        }
        is AdaptyResult.Error -> {
            val error = result.error
            // handle the error
        }
    }
}
```
| Параметр        | Наличие        | Описание                                                     |
| :-------------- | :------------- | :----------------------------------------------------------- |
| **paywall**     | обязательный   | Объект `AdaptyPaywall` для получения контроллера нужного пейвола. |
| **loadTimeout** | по умолчанию: 5 сек | Ограничивает время ожидания для этого метода. По истечении таймаута возвращаются кешированные данные или локальный резерв. Обратите внимание, что в редких случаях метод может завершиться чуть позже указанного в `loadTimeout` значения, поскольку операция может включать несколько запросов под капотом. |

</TabItem>
<TabItem value="java" label="Java" default>

Используйте метод `getViewConfiguration` для загрузки конфигурации отображения.

```java showLineNumbers
if (!paywall.hasViewConfiguration()) {
    // use your custom logic
    return;
}

AdaptyUI.getViewConfiguration(paywall, TimeInterval.seconds(10), result -> {
    if (result instanceof AdaptyResult.Success) {
        AdaptyUI.LocalizedViewConfiguration viewConfiguration =
          ((AdaptyResult.Success<AdaptyUI.LocalizedViewConfiguration>) result).getValue();
        // use loaded configuration
    } else if (result instanceof AdaptyResult.Error) {
        AdaptyError error = ((AdaptyResult.Error) result).getError();
        // handle the error
    }
});
```
| Параметр                 | Наличие        | Описание                                                     |
| :----------------------- | :------------- | :----------------------------------------------------------- |
| **paywall**              | обязательный   | Объект `AdaptyPaywall` для получения контроллера нужного пейвола. |
| **loadTimeout**          | по умолчанию: 5 сек | Ограничивает время ожидания для этого метода. По истечении таймаута возвращаются кешированные данные или локальный резерв. Обратите внимание, что в редких случаях метод может завершиться чуть позже указанного в `loadTimeout` значения, поскольку операция может включать несколько запросов под капотом. |

</TabItem>

</Tabs>

:::note
Если вы используете несколько языков, узнайте, как добавить [локализацию в Paywall Builder](add-paywall-locale-in-adapty-paywall-builder) и как правильно использовать коды локалей [здесь](android-localizations-and-locale-codes).
:::

После загрузки [покажите пейвол](android-present-paywalls).

## Получение пейвола для аудитории по умолчанию для ускоренной загрузки \{#get-a-paywall-for-a-default-audience-to-fetch-it-faster\}

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

Для этого можно использовать метод `getPaywallForDefaultAudience`, который получает пейвол указанного плейсмента для аудитории **All Users**. Однако важно понимать, что рекомендуемый подход — использовать метод `getPaywall`, как описано в разделе [Получение пейвола, созданного с помощью Paywall Builder](#fetch-paywall-designed-with-paywall-builder) выше.

:::warning
Почему мы рекомендуем использовать `getPaywall`

Метод `getPaywallForDefaultAudience` имеет ряд существенных недостатков:

- **Возможные проблемы с обратной совместимостью**: если нужно показывать разные пейволы для разных версий приложения (текущей и будущих), могут возникнуть сложности. Придётся либо проектировать пейволы с поддержкой текущей (устаревшей) версии, либо мириться с тем, что у пользователей с такой версией могут быть проблемы с отрисовкой пейволов.
- **Потеря таргетинга**: все пользователи будут видеть один и тот же пейвол, созданный для аудитории **All Users**, что означает отказ от персонализированного таргетинга (по странам, маркетинговой атрибуции или собственным атрибутам).

Если вы готовы принять эти недостатки ради более быстрой загрузки пейволов, используйте метод `getPaywallForDefaultAudience` как описано ниже. В противном случае придерживайтесь `getPaywall`, описанного [выше](#fetch-paywall-designed-with-paywall-builder).
:::

<Tabs groupId="current-os" queryString>

<TabItem value="kotlin" label="Kotlin" default>
```kotlin showLineNumbers
Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID", locale = "en") { result ->
    when (result) {
        is AdaptyResult.Success -> {
            val paywall = result.value
            // the requested paywall
        }
        is AdaptyResult.Error -> {
            val error = result.error
            // handle the error
        }
    }
}
```
</TabItem>
<TabItem value="java" label="Java" default>
```java showLineNumbers
Adapty.getPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", result -> {
    if (result instanceof AdaptyResult.Success) {
        AdaptyPaywall paywall = ((AdaptyResult.Success<AdaptyPaywall>) result).getValue();
        // the requested paywall

    } else if (result instanceof AdaptyResult.Error) {
        AdaptyError error = ((AdaptyResult.Error) result).getError();
        // handle the error
      
    }
});
```
</TabItem>

</Tabs>

:::note
Метод `getPaywallForDefaultAudience` доступен начиная с Android SDK 2.11.3
:::

| Параметр | Наличие | Описание |
|---------|--------|-----------|
| **placementId** | обязательный | Идентификатор [плейсмента](placements). Это значение вы задавали при создании плейсмента в дашборде Adapty. |
| **locale** | <p>опциональный</p><p>по умолчанию: `en`</p> | <p>Идентификатор [локализации пейвола](add-remote-config-locale). Ожидается код языка, состоящий из одного или нескольких подтегов, разделённых символом «минус» (**-**). Первый подтег — язык, второй — регион.</p><p></p><p>Пример: `en` — английский, `pt-br` — бразильский португальский.</p><p></p><p>Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе [Локализации и коды локалей](localizations-and-locale-codes).</p> |
| **fetchPolicy** | по умолчанию: `.reloadRevalidatingCacheData` | <p>По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует, что пользователи всегда получают актуальные данные.</p><p></p><p>Однако если вы считаете, что ваши пользователи работают в условиях нестабильного интернета, рассмотрите использование `.returnCacheDataElseLoad` — возврат кешированных данных при их наличии. В этом случае данные могут быть не самыми последними, но загрузка будет быстрее вне зависимости от качества соединения. Кеш регулярно обновляется, поэтому его безопасно использовать в течение сессии для уменьшения числа сетевых запросов.</p><p></p><p>Обратите внимание, что кеш сохраняется при перезапуске приложения и очищается только при его переустановке или вручную.</p> |

## Настройка ассетов \{#customize-assets\}

Для настройки изображений и видео в пейволе используйте пользовательские ассеты.

Главные изображения и видео имеют предопределённые ID: `hero_image` и `hero_video`. В пакете пользовательских ассетов вы обращаетесь к этим элементам по их ID и настраиваете их поведение.

Для других изображений и видео нужно [задать пользовательский ID](custom-media) в дашборде Adapty.

Например, вы можете:

- Показывать разным пользователям разные изображения или видео.
- Показывать локальное изображение-превью, пока загружается основное изображение с сервера.
- Показывать превью перед воспроизведением видео.

:::important
Для использования этой функции обновите Adapty Android SDK до версии 3.7.0 или выше.
:::

Пример того, как предоставить пользовательские ассеты через простой словарь:

```kotlin showLineNumbers
val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val paywallView = AdaptyUI.getPaywallView(
    activity,
    viewConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
```

:::note
Если ассет не найден, пейвол вернётся к своему стандартному виду.
:::