Инструменты разработчика7 мин чтения
Как отправить звонилку в Google Play в 2026 году и не сойти с ума
Приложение для звонков было готово к ревью в Google Play, но кнопку отправки держали две анкеты, доступные только в консоли: декларация активных служб и Data safety. Рассказываем, в каком порядке их проходить.
В июле 2026 года мы отправили Android-сборку ID Caller — нашего приложения для приватных аудио- и видеозвонков без номера телефона — на ревью в production-трек Google Play. AAB подписан, листинг готов, во внутреннем треке уже лежал рабочий релиз, а кнопка отправки всё равно не нажималась. Держали две анкеты: декларация активных служб и Data safety. Обе живут только в Play Console: Play Developer API, через который мы ведём листинги, контакты, треки и заливку AAB, их не отдаёт.
Это гайд, которого нам не хватало в тот день. Скриншотов нет: консоль часто меняется, поэтому мы описываем, чего хочет каждая форма, а названия кнопок приводим по русскому интерфейсу — в нём мы и работали. Там, где консоль нас подловила, стоит предупреждение.
Что блокирует отправку
Для звонилки эти анкеты раздела App content должны быть заполнены, прежде чем Play примет релиз на ревью:
- Data safety.
- Декларация активных служб — к ней нужна ссылка на демо-видео.
- Декларация полноэкранных intent'ов.
- Категория приложения.
- Контактный email.
Последние три занимают минуты; шаги ниже — в основном про первые две. Порядок такой: манифест, потом видео, потом письменные ответы для Data safety и только затем анкеты.
Шаг 1: выпишите, что заявляет манифест
На Android 14+ декларация активных служб строится по разрешениям FOREGROUND_SERVICE_* из манифеста, так что начинаем с него. Во время звонка ID Caller держит foreground-сервис, пока приложение в фоне: microphone — для звука, camera — для видео, phoneCall — потому что входящие идут через self-managed ConnectionService из Telecom.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- Входящие через Telecom (self-managed) + FCM, full-screen UI с локскрина,
FGS активного звонка -->
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
<!-- ... -->
<!-- FGS активного звонка: microphone + camera (видео) + phoneCall (Telecom) -->
<service
android:name=".call.CallForegroundService"
android:exported="false"
android:foregroundServiceType="phoneCall|microphone|camera" />Три типизированных разрешения — три пункта, которые придётся обосновать в декларации; у USE_FULL_SCREEN_INTENT своя декларация (шаг 5). Запишите список: заодно это чек-лист для видео.
Рантайм-половина тех же типов
Три типа в манифесте не означают, что сервис всегда может стартовать со всеми тремя. Android 14+ проверяет runtime-разрешение за каждым типом, поэтому маску типов мы собираем из того, что пользователь действительно выдал:
// Android 14+ проверяет runtime-права под заявленные типы:
// microphone без RECORD_AUDIO и camera без CAMERA — SecurityException.
// phoneCall (MANAGE_OWN_CALLS — normal-право) допустим всегда.
private fun foregroundServiceTypes(): Int {
var types = ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL
if (granted(Manifest.permission.RECORD_AUDIO)) {
types = types or ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
}
if (granted(Manifest.permission.CAMERA)) {
types = types or ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA
}
return types
}Ревью этого не поймало. Поймали отчёты о сбоях в Play уже после релиза: 8 крашей у 3 пользователей ровно с этим SecurityException.
Шаг 2: сначала демо-видео, потом декларация
Декларация выглядит лёгкой: несколько чекбоксов и описаний. Подвох в том, что Google требует ссылку на видео по каждому разрешению активной службы. Поэтому видео — первым делом.
- Возьмите тестовое устройство, на котором работает запись экрана через adb (
adb shell screenrecord), и проверьте, что полученный файл действительно проигрывается. - Постройте сценарий так, чтобы видео показывало службы за работой в фоне. Наш: входящий видеозвонок → приём → Home (приложение уходит в фон, звонок жив) → шторка с нотификацией «ID Caller · Идёт звонок» → возврат в приложение → завершение.
- Держите ролик коротким. Наш длится 50 секунд.
- Выложите видео по ссылке, которую сможет открыть ревьюер.
- В декларации отметьте разрешения камеры, микрофона и телефонного звонка и опишите применение: трансляция камеры и аудио, пока приложение в фоне, плюс VoIP-звонки.
- Вставьте одну и ту же ссылку для каждого разрешения. Один ролик со всем сценарием звонка закрывает все три.
- Сохраните форму.
Внимание
Без ссылки на видео по каждому разрешению декларация не сохраняется. Откроете её раньше, чем готово видео, — отметить чекбоксы и написать описания получится, а сохранить ничего не выйдет.
Совет
Не каждый телефон умеет записывать собственный экран. На нашем realme (ColorOS) прошивка запрещает screenrecord — Permission denied и в /sdcard, и в /data/local/tmp. На Fold из нашего парка устройств пишется пустой файл. Honor справился, Redmi тоже умеет; снимали на Honor.
Шаг 3: запишите ответы Data safety до того, как откроете форму
Именно эта анкета заблокировала нас наглухо. В ней стояло «приложение не собирает данные», и форма приняла это без возражений. Проблема всплыла только на предварительной проверке Google перед ревью: она выдала «Недействительная декларация о безопасности данных» и заблокировала кнопку отправки. На деле у приложения есть identity-ID, push-токен и аналитика AppMetrica.
Мы не знаем, на какой сигнал опирается проверка, и это неважно: декларация была неверной. Если у вашей звонилки есть push-токен или SDK аналитики, «данные не собираются» — неправда.
Исправление — заполнять форму по документу, а не по памяти. Ответы лежат в репозитории (docs/store/google-data-safety.md) и выведены из политики конфиденциальности и того, что реально хранит сервер. Для ID Caller это:
- Собирает данные пользователей: да. Передаёт их: нет.
- Шифрование при передаче: да. REST и WebSocket — только по TLS, медиа — по DTLS-SRTP.
- Удаление по запросу: да. Удаление ID в приложении (Настройки → Аккаунт → Удалить ID) стирает на сервере identity, связи и push-токены; неактивный ID удаляется через 12 месяцев.
- User IDs: 12-значный ID Caller ID и его публичный ключ Ed25519 — для работы приложения.
- Device or other IDs: push-токен (FCM или RuStore), который доставляет входящие, — для работы приложения; внутренний device id AppMetrica без рекламных ID — для аналитики.
- App interactions: сессии и события использования из AppMetrica — для аналитики.
Все типы отмечены как обязательные и не временные. Список того, что не собирается, важен не меньше, и у каждого пункта есть причина: ни имени, ни email, ни телефона (аккаунтов нет), ни контактов (адресная книга не читается), ни аудио (звонки не записываются), ни фото (QR-сканер работает на устройстве), ни геолокации (IP-адрес используется для установления соединения и не сохраняется).
Примечание
Шпаргалка — живой документ. Когда в сентябре мы добавили крэш-репортинг через Sentry, пункт App info and performance перешёл из «не собирается» в «собирается» — тем же коммитом, что и текст политики конфиденциальности. Любой новый SDK — повод пройти Data safety заново.
Шаг 4: заполняйте Data safety строго вперёд
С ответами перед глазами форма занимает минуты — если уважать две её привычки.
- Начните с первого вопроса — собирает ли приложение или передаёт ли оно обязательные типы данных пользователей (в английском интерфейсе — «Does your app collect or share any of the required user data types?») — и ответьте «Да».
- На остальные вводные вопросы (шифрование при передаче, удаление данных) ответьте по шпаргалке.
- Двигайтесь вперёд только кнопкой «Далее». Не прыгайте между шагами по степперу.
- На шагах с типами данных отметьте каждый тип из шпаргалки и для каждого укажите: собирается или передаётся, обязателен или нет, с какими целями.
- Перед сохранением откройте превью и убедитесь, что в нём перечислены ваши типы данных.
- Сохраните и вернитесь к релизу. У нас кнопка отправки разблокировалась, как только декларация совпала с реальностью.
Внимание
«Назад» в этой форме — не навигация. Кнопка откатывает несохранённые ответы к состоянию, которое хранится на сервере. Ходите по шагам кнопкой «Далее» и сохраняйтесь, прежде чем уйти.
Внимание
Ответ «Нет» на первый вопрос молча пропускает шаги с типами данных (шаги 3–4 формы), и превью показывает «Данные не собираются». Ровно это состояние у нас и отклонила предварительная проверка. Если превью показывает такое, а у приложения есть push-токен, начните заново с первого вопроса.
Шаг 5: мелкие анкеты и отправка
- Полноэкранные intent'ы: заявите сценарий «Совершение и приём звонков» с разрешением по умолчанию.
- Категория: «Связь».
- Контакты: email и сайт. В отличие от деклараций, их можно проставить через Play Developer API.
- Сначала залейте AAB во внутренний трек, потом создайте production-релиз. Мы выбрали 177 стран и полное внедрение.
- Включите управляемую публикацию, если хотите сами выбирать момент выхода. После одобрения Google релиз ждёт на странице «Обзор публикации», пока кто-нибудь не нажмёт «Опубликовать»; автоматически ничего не выходит.
- Отправьте релиз на ревью.
Примечание
Каждая новая отправка снова проходит ревью, поэтому правки листинга и новые сборки мы собирали и отправляли вместе, а не по одной.
Когда анкеты стали говорить правду, следующий релиз прошёл спокойно: версия 1.1 прошла предварительную проверку Play без проблем. Остались только неблокирующие предупреждения: нет R8-mapping и нативных отладочных символов.
Чек-лист
- Прежде чем открывать консоль, выпишите все разрешения
FOREGROUND_SERVICE_*из манифеста. - Запишите одно демо-видео, где звонок живёт в фоне (запись экрана сначала проверьте на устройстве), и держите ссылку наготове до того, как откроете декларацию.
- Храните ответы Data safety в репозитории и выводите их из политики конфиденциальности и реального перечня данных. Push-токены и аналитика — это собираемые данные.
- Никогда не считайте «Данные не собираются» безопасным вариантом по умолчанию: Play проверяет это до ревью.
- В форме Data safety двигайтесь только вперёд кнопкой «Далее» и проверяйте превью перед сохранением. «Назад» сбрасывает несохранённое, а «Нет» на первый вопрос пропускает типы данных.
- Анкеты App content заполняются только в консоли: API за вас этого не сделает.
- Включите управляемую публикацию, если хотите сами решать, когда одобренный релиз выйдет в стор.
- Каждый новый SDK — аналитика, крэш-репортинг — означает новый проход по Data safety.
ONLYAPPS Team
Нови-Сад, Сербия · onlyapps.org