ym88659208ym87991671
Android-разработка | Документация для разработчиков

Android-разработка

Обновлено 3 марта 2026

Эта инструкция предназначена для разработчиков мобильных приложений на платформе Android, желающих интегрировать компонент ЕЛК (Единый Личный Кабинет) в свое приложение. Здесь подробно описан процесс интеграции и настройка внешнего вида элемента.

Шаг 1. Подключение Android SDK

Минимальная поддерживая версия Android: 26

Для корректной работы необходимо также установить и подключить SIDSDK_CORE.

Android SDK для работы с Единым личным кабинетом.

1.1 Добавьте репозиторий:

repositories {
mavenCentral()
}

1.2 Подключите зависимость на SIDSDK_ELK:

implementation("io.github.sid-sdk:SIDSDK_ELK:1.1.1")

Версия может отличаться. Информацию об актуальной версии SDK вы найдете в Release notes Android SIDSDK-ELK.

Шаг 2. Инициализировать SDK

Необходимо убедиться, что выполнена инициализация SDK.

Руководство по инициализации SDK для Android

Шаг 3. Настроить переход на веб-интерфейс партнера

Настройте бесшовный переход на веб-интерфейс партнера для мобильных приложений.

Подробная инструкция по настройке бесшовного перехода на веб-интерфейс партнера:

Получение AppToken

AppToken — это специальный токен, необходимый для авторизации пользователя. Для его получения добавьте в запрос на авторизацию дополнительный скоуп mapp_sso.

val uri = SID.Login.createUriForLogin(
scope = "openid mapp_sso", // добавьте все необходимые вам scope
state = "random_state",
nonce = "random_nonce",
redirectUrl= "partner://redirect",
codeChallenge: "code_challenge",
codeChallengeMethod: PkceUtils.getCodeChallengeMethod()
)

Для сохранения необходимо вызвать метод SID.Login.getIDAuthResult(intent: Intent) для проверки результата авторизации. Без данного метода appToken не сохранится.

val resultModel = SID.Login.getIDAuthResult(intent)

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

Проверка AppToken на валидность

Проверку AppToken на валидность следует выполнять при каждом запуске вашего приложения, после инициализации SDK Сбер ID.

//Подпишитесь на получение событий.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
//Необходимо обновить токен
}
AppTokenEvents.IsValid -> {
// Токен валиден
}
...
}
}

//Старт проверки токена на проверку
SID.AppToken.checkAppTokenForValid()

Стоит отметить, что методы, работающие с AppToken, используют общую шину SID.AppToken.subscribeToEvents(this) для всех ответов. Это означает, что вам достаточно подписаться на события один раз, и вы сможете обрабатывать все запросы, связанные с AppToken, в одном месте. Такой подход позволяет упростить и централизовать обработку событий, связанных с AppToken, что делает код более чистым и поддерживаемым. Во всех последующих примерах будут указаны только необходимые AppTokenEvents для соответствующих шагов. Полное описание можно найти в конце статьи.

Обновление AppToken

При провале проверки на валидность токена, обновите его. Новый токен будет автоматичски перезаписан в случае успешного запроса.

SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
updateAppToken() // Запускаем обновление
}
...
}
private fun updateAppToken() {
val codeVerifide = PkceUtils.generateRandomCodeVerifier(SecureRandom())
val codeChallenge = PkceUtils.deriveCodeVerifierChallenge(codeVerifide)
val oidcParams = OIDCParams(
clientId = "clientId вашего сервиса", // на данный момент необходимо дублировать параметр
scope = "openid mapp_sso", //+добавьте все необходимые вам scope
redirectUrl = "partner://redirect",
state = "random_state",
nonce = "random_nonce",
codeChallenge = codeChallenge,
codeChallengeMethod = PkceUtils.getCodeChallengeMethod()
)
SID.AppToken.updateAppToken(oidcParams)
}
Переход на сайт партнера

Для перехода используйте метод goToPartnerSSO с необходимыми параметрами:

  • webLink — Ссылка на сайт партнера;
  • clientId — Уникальный идентификор партнера, использующего Сбер ID;
  • partnerColorInt? — Предпочтительный цвет для лоадера и окраса UI элементов;
  • openIn — Тип контроллера для открытия страницы партнера SIDOpenInType.webview или SIDOpenInType.browser.
val activity = requireActivity()
val color: Int? = kotlin.runCatching {
Color.parseColor(appTokenColor?.text.toString())
}.getOrNull()

val info = LinkInformation(
webLink = "https://partner.ru/sso_auth",
clientId = "сlientId партнера",
partnerColorInt = color ?: Color.GREEN,
openIn = OpenInConstants.WEB_VIEW / OpenInConstants.BROWSER,
)

SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.Success -> Unit //Удачный переход на партнера
...
}
}

SID.AppToken.goToPartnerSSO(currentActivity = activity, linkInformation = info)

Удаление AppToken

При выходе пользователя из системы не забудьте удалить AppToken.

SID.Login.logout()
События и их обработка

Все события при работе с AppToken подробно описаны здесь

Шаг 4. Встроить UI ЕЛК

Для интеграции контейнера ЕЛК в ваше Android-приложение существует два основных способа:

Способ №1: Интеграция через XML

ELKContainerView — View-контейнер для отображения динамических элементов ЕЛК (ELK) на основе Jetpack Compose. Реализует гибкую систему управления контентом через XML-атрибуты и программные методы.

Основные особенности

  • Поддержка нескольких версий одного контейнера
  • Адаптивное изменение размеров и отступов
  • Обработка событий загрузки/ошибок
  • Возможность программного обновления параметров

Примеры использования

Базовый контейнер

<sid.sdk.elk.presentation.container.ELKContainerView
android:id="@+id/elk_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

Специализированный контейнер

<sid.sdk.elk.presentation.container.ELKContainerView
android:id="@+id/elk_offer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:containerName="offer"
app:containerVersion="3"
app:horizontalPadding="16"
app:elkMinimalLoaderContainerHeight="100" />

Программное управление

elkContainer.setContainerName("promo")
elkContainer.setContainerVersion(2)
elkContainer.setMinimalLoaderHeights(80)

Жизненный цикл

Контейнер автоматически:

  • Загружает данные при VISIBLE/INVISIBLE
  • Приостанавливает загрузку при GONE
  • Перезагружается при изменении параметров

Настройка через XML

АтрибутТипОписание
app:containerNameStringИмя контейнера
app:containerVersionIntegerВерсия контейнера
app:horizontalPaddingIntegerГоризонтальный отступ в dp
app:spaceUserInfoMiniIntegerОтступ под мини-профиль в dp
app:elkMinimalLoaderContainerHeightIntegerМинимальная высота лоадера в dp

Методы управления

// Установка имени контейнера (его не нужно указывать, если вы не знаете его, вероятно вам пока это не нужно)
setContainerName("offer")
// Установка версии контейнера
setContainerVersion(3)
// Установка размеров контейнера
setDimensions(
dimensions = SIDDimensionsELK(
elkHorizontalPadding = 16,
elkSpaceUserInfoMini = 8,
elkMinimalLoaderContainerHeight = 100
)
)
// Установка обработчика событий
subscribeOnContainerEvents { event ->
when(event) {
is ELKEvents.ClickELK -> handleWidgetClick(event)
is ELKEvents.WidgetErrorELK -> showErrorMessage(event)
}
}

Логика загрузки Формирование URL:

https://адрес.ру/[clientID]_[containerName]_v[containerVersion].json

  • При containerName = null → игнорируется в URL
  • При containerVersion = null → игнорируется в URL
Способ №2: Интеграция через Composable-компонент

ELKContainer — Composable-компонент для отображения динамического контента ЕЛК (ELK) на основе параметров. Реализует гибкую систему управления контентом через Jetpack Compose.

Основные особенности

  • Поддержка нескольких версий одного контейнера
  • Автоматическая обработка ошибок загрузки
  • Обработка событий кликов и ошибок
  • Обрезка длинных имен контейнеров до 36 символов

Примеры использования

Базовый контейнер

val parameters = remember {
mutableStateOf(ELKContainerParameters())
}
ELKContainer(
modifier = Modifier.fillMaxWidth(),
activity = { activity },
parameters = parameters.value,
containerEvents = { event ->
when(event) {
is ELKEvents.ClickELK -> handleWidgetClick(event.widgetName)
is ELKEvents.WidgetErrorELK -> showNetworkError(event.httpStatusCode, event.partnerErrorCode)
}
}
)

Специализированный контейнер

val offerParams = remember {
mutableStateOf(ELKContainerParameters(
containerName = "offer",
containerVersion = 3,
dimensions = SIDDimensionsELK(
elkHorizontalPadding = 16,
elkMinimalLoaderContainerHeight = 100
)
))
}
ELKContainer(
modifier = Modifier.fillMaxWidth(),
activity = { activity },
parameters = offerParams.value
)

modifier - Модификаторы для настройки размеров и поведения activity - Текущая активность для взаимодействия с UI parameters - Параметры контейнера (имя, версия, размеры) containerEvents - Обработчик событий ЕЛК

Логика загрузки Формирование URL

https://адрес.ру/[clientID]_[containerName]_v[containerVersion].json

  • Если containerName = null → игнорируется в URL
  • Если containerVersion = null → игнорируется в URL
  • Имя контейнера длиннее 36 символов автоматически обрезается

События ЕЛК

Все события доступны через:

 	 SID.Events.subscribeForELKEvents(owner = lifecycleOwner) { events ->
when(events){
is AppTokenEvents -> {"События апптокен"}
is AuthEvents -> {"События авторизации"}
is ELKEvents -> when(events){
is ELKEvents.ClickELK -> {"Событие на клик по виджету"}
is ELKEvents.ErrorELK -> {"Событие на ошибку root элемента ЕЛК"}
is ELKEvents.HideELK -> {"Событие на скрытие ЕЛК"}
is ELKEvents.ReloadELK -> {"Событие на перезагрузку ЕЛК"}
is ELKEvents.ShowELK -> {"Событие на показ ЕЛК"}
is ELKEvents.WidgetErrorELK -> {"Событие на ошибку загрузки ЕЛК элемента с бекенда партнера"}
is ELKEvents.OpenWidgetELK -> {"Событие на открытие ЕЛК элемента"}
is ELKEvents.ShowWidgetELK -> {"Событие на показ ЕЛК элемента"}
}
}
}

Подробное описание событий ELKEvents можно посмотреть в разделе

Шаг 5. Встроить бейдж

Для интеграции бейджа в ваше Android-приложение можно воспользоваться одним из способов:

Cпособ №1: Composable-компонент для отображения динамического значка (badge)

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

Ключевые особенности:

  • Автоматическая загрузка данных при монтировании через [ViewModel]
  • Отслеживание состояния загрузки ([state])
  • Обработка кликов через [BadgeIntent.ClickBadge]

Использование в Composable-компонентах

fun MyScreen() {
// Получение activity через LocalContext
val activity = remember { (LocalContext.current as? FragmentActivity) }

// Убедитесь, что контекст действительно является FragmentActivity
if (activity != null) {
BadgeElement(
activity = { activity },
modifier = Modifier.padding(8.dp),
place = Byte.MIN_VALUE // Не изменяйте вручную
)
} else {
Text("Невозможно отобразить значок")
}
}
  • activity - лямбда-функция для получения [FragmentActivity], необходимого для навигации при клике. Используется вместо прямой передачи объекта для предотвращения утечек памяти.
  • modifier - модификаторы для настройки внешнего вида компонента
  • place - не должен изменяться вручную.
Способ №2: Android-View для отображения динамического значка (badge)

BadgeView

Как работает:

  • Использует ComposeView для отрисовки Composable-компонента [BadgeElement]
  • Саморегулирует размеры в зависимости от контента
  • Отслеживает видимость через переопределенные методы [onVisibilityChanged] и [onWindowVisibilityChanged]

Ключевые особенности:

  • Поддержка реактивного UI через Compose
  • Автоматическая загрузка данных при монтировании
  • Управление видимостью через флаг containerIsVisible

Добавление через XML

 <sid.sdk.elk.badge.presentation.BadgeView
android:id="@+id/badge_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

Программное добавление

// Пример создания и добавления в родительский контейнер
val badgeView = BadgeView(context)
val parentLayout = findViewById<FrameLayout>(R.id.parent_layout)
parentLayout.addView(badgeView)
  • context - контекст, необходимый для создания View
  • attrs - атрибуты из XML (не используются в текущей реализации)
  • defStyleAttr - стиль по умолчанию (не используется)

Важные моменты при настройке мобильного SDK:

  • Установите клиентские параметры (clientID) через метод setMainSettings().
  • Используйте кастомизацию интерфейса методами типа setUIMode() и setUIPreferences() для обеспечения единого опыта пользователя.
  • Поддерживайте регулярную проверку токенов авторизации через метод checkAppTokenForValid().
  • Обрабатывайте события, подписавшись на соответствующие уведомления через API SDK.
  • Проведите тестирование всех аспектов взаимодействия приложения с сервером и сторонними элементами.

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней

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