Сведите к минимуму запросы на разрешение

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

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

Существует несколько альтернативных способов минимизировать использование разрешений:

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

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

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

Показать ближайшие места

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

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

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

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

Создание и доступ к файлам

Android позволяет создавать файлы и получать к ним доступ без необходимости указывать какие-либо разрешения, связанные с хранилищем или датчиками.

Открыть медиафайлы

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

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

Если вашему приложению необходим доступ к медиафайлам без использования средства выбора фотографий, вам не нужно указывать какие-либо разрешения на доступ к хранилищу:

  • Если вы обращаетесь к медиафайлам, созданным вашим приложением, значит, ваше приложение уже имеет доступ к этим файлам в медиатеке .
  • Если вы получаете доступ к медиафайлам, созданным другими приложениями, используйте Storage Access Framework .

Открыть документы

Ваше приложение может отображать документы, созданные пользователем, как в вашем приложении, так и в другом приложении. Распространенный пример — текстовый файл.

В этой ситуации объявляйте READ_EXTERNAL_STORAGE только для совместимости со старыми устройствами. Установите android:maxSdkVersion равным 28 .

В зависимости от того, какое приложение создало документ, выполните одно из следующих действий:

Сфотографируйте

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

В этой ситуации не следует объявлять разрешение CAMERA . Вместо этого вызовите действие намерения ACTION_IMAGE_CAPTURE .

Записать видео

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

В этой ситуации не следует объявлять разрешение CAMERA . Вместо этого вызовите действие ACTION_VIDEO_CAPTURE .

Определите устройство, на котором запущен экземпляр вашего приложения.

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

В этой ситуации не следует получать доступ к IMEI устройства напрямую. Более того, начиная с Android 10, это невозможно. Вместо этого выполните одно из следующих действий:

  • Получите уникальный идентификатор устройства для экземпляра вашего приложения, используя библиотеку Instance ID .
  • Создайте собственный идентификатор, ограниченный областью действия хранилища вашего приложения. Используйте основные системные функции, такие как randomUUID() .

Сопряжение с устройством через Bluetooth.

Ваше приложение может улучшить пользовательский опыт за счет передачи данных на другое устройство по Bluetooth.

Для поддержки этой функциональности не следует объявлять разрешения ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATIION или BLUETOOTH_ADMIN . Вместо этого используйте сопряжение сопутствующих устройств .

Автоматический ввод номера платежной карты

Сервисы Google Play предлагают библиотеку, которая позволяет автоматически вводить номер платежной карты. Вместо того чтобы запрашивать разрешение на CAMERA , вы можете воспользоваться библиотекой распознавания дебетовых и кредитных карт .

Управление телефонными звонками и текстовыми сообщениями.

Сервисы Android и Google Play предлагают библиотеки, позволяющие управлять телефонными звонками и текстовыми сообщениями без необходимости указывать какие-либо разрешения, связанные с телефонными звонками или SMS-сообщениями.

Введите одноразовый пароль автоматически.

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

Для поддержки этой функциональности на устройствах с поддержкой сервисов Google Play не следует объявлять разрешение READ_SMS . Вместо этого используйте API SMS Retriever .

На других устройствах, если ваше приложение ориентировано на Android 8.0 (уровень API 26) или выше, сгенерируйте токен, специфичный для приложения, используя createAppSpecificSmsToken() . Передайте этот токен другому приложению или сервису, который может отправлять SMS-сообщения для подтверждения.

Проверить номер телефона пользователя

Для безопасной проверки номера телефона пользователя в вашем приложении рекомендуется использовать API цифровых учетных данных (Digital Credentials API ). Использование этого API напрямую или через широкий спектр совместимых агрегаторов позволяет надежно проверять информацию об учетной записи пользователя без запроса конфиденциальных разрешений устройства. Решение на базе Firebase см. в разделе «Проверка номера телефона в Firebase» .

В качестве альтернативы, вы можете подтвердить номер телефона пользователя с помощью одноразового пароля, используя API SMS Retriever .

Автоматический ввод номера телефона пользователя.

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

Для поддержки этой функциональности на устройствах, работающих под управлением сервисов Google Play, не следует объявлять разрешение READ_PHONE_STATE . Вместо этого используйте библиотеку Phone Number Hint .

Фильтрация телефонных звонков

Чтобы свести к минимуму ненужные отвлечения для пользователя, ваше приложение может фильтровать телефонные звонки на предмет спама.

Для поддержки этой функциональности не следует объявлять разрешение READ_PHONE_STATE . Вместо этого используйте API CallScreeningService .

Совершайте телефонные звонки

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

Для поддержки этой функциональности используйте действие намерения ACTION_DIAL вместо действия ACTION_CALL . ACTION_CALL требуется разрешение CALL_PHONE , которое необходимо установить на устройствах, не способных совершать звонки, например, на некоторых планшетах.

Приостановите воспроизведение мультимедиа, если приложение прервано.

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

Для поддержки этой функциональности не следует объявлять разрешение READ_PHONE_STATE . Вместо этого реализуйте обработчик события onAudioFocusChange() , который запускается автоматически при изменении аудиофокуса системы. Подробнее о реализации аудиофокуса можно узнать здесь.

Сканирование штрихкодов

Android поддерживает API Google Code Scanner , работающий на базе сервисов Google Play, что позволяет расшифровывать штрих-коды без запроса разрешений на использование камеры. Этот API помогает сохранить конфиденциальность пользователей и снижает вероятность необходимости создания собственного пользовательского интерфейса для сканирования штрих-кодов.

API сканирует штрихкод и возвращает в ваше приложение только результаты сканирования. Обработка изображений происходит на устройстве, и Google не хранит никаких данных или результатов сканирования.

Если вашему приложению требуется поддержка сложных сценариев использования или форматов штрихкодов, или если ему необходим пользовательский интерфейс, используйте вместо этого API сканирования штрихкодов ML Kit .

Сбросить неиспользуемые разрешения

Android предоставляет несколько способов сбросить неиспользуемые разрешения во время выполнения до их состояния по умолчанию — «запрещено».

Ознакомьтесь с рекомендациями по проектированию .

Запросить разрешения во время выполнения

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

Ознакомьтесь с рекомендациями по проектированию .

Объясните, почему вашему приложению требуются разрешения.

Использование requestPermissions() отображает диалоговое окно, указывающее, какие разрешения ваше приложение хочет использовать, но не объясняет, почему, что может сбить пользователя с толку.

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

Обработка отказов в предоставлении доступа

Ваше приложение должно помогать пользователям понимать последствия отказа в предоставлении разрешения до и после того, как они примут такое решение.

Ознакомьтесь с рекомендациями по проектированию .