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

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

Запрос разрешений у пользователей прерывает поток пользователей, и пользователи могут отклонить ваш запрос. Кроме того, каждый раз, когда вы объявляете новое разрешение, вы должны проверять, как ваше приложение запрашивает и передает пользовательские данные . Некоторые особенно конфиденциальные разрешения и 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, вы не можете этого сделать. Вместо этого выполните одно из следующих действий:

  • Получите уникальный идентификатор устройства для экземпляра вашего приложения, используя библиотеку идентификаторов экземпляров .
  • Создайте свой собственный идентификатор, привязанный к хранилищу вашего приложения. Используйте базовые системные функции, такие как 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-сообщение.

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

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

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

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

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

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

Делайте телефонные звонки

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

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

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

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

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

Сканировать штрих-коды

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

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

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

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

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

Прочтите руководство по проектированию .

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

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

Прочтите руководство по проектированию .

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

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

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

Обработка отказов в разрешениях

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

Прочтите руководство по проектированию .

,

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

Запрос разрешений у пользователей прерывает поток пользователей, и пользователи могут отклонить ваш запрос. Кроме того, каждый раз, когда вы объявляете новое разрешение, вы должны проверять, как ваше приложение запрашивает и передает пользовательские данные . Некоторые особенно конфиденциальные разрешения и 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, вы не можете этого сделать. Вместо этого выполните одно из следующих действий:

  • Получите уникальный идентификатор устройства для экземпляра вашего приложения, используя библиотеку идентификаторов экземпляров .
  • Создайте свой собственный идентификатор, привязанный к хранилищу вашего приложения. Используйте базовые системные функции, такие как 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-сообщение.

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

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

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

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

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

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

Делайте телефонные звонки

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

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

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

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

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

Сканировать штрих-коды

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

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

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

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

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

Прочтите руководство по проектированию .

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

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

Прочтите руководство по проектированию .

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

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

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

Обработка отказов в разрешениях

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

Прочтите руководство по проектированию .