Объясните, зачем вам доступ к конфиденциальной информации

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

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

В частности, убедитесь, что в вашем приложении:

  • Не используйте камеру устройства, пока пользователь не предоставит приложению разрешение CAMERA.
  • Не используйте микрофон устройства, пока пользователь не предоставит приложению разрешение RECORD_AUDIO.
  • Запрашивайте разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION только тогда, когда пользователь начинает взаимодействовать с функцией, для которой требуется доступ к данным о местоположении. Подробнее о том, как запрашивать доступ к данным о местоположении…
  • Прежде чем запрашивать разрешение ACCESS_BACKGROUND_LOCATION, дождитесь, пока пользователь предоставит разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION.

Панель управления разрешениями

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

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

Показывать обоснование доступа к данным

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

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

  1. Добавьте действие, которое при запуске объясняет, почему ваше приложение выполняет определенный тип доступа к данным. В этом действии задайте атрибуту android:permission значение START_VIEW_PERMISSION_USAGE.

    Если ваше приложение предназначено для Android 12 или более поздней версии, вы должны явно определить значение для атрибута android:exported.

  2. Добавьте следующий фильтр интентов в недавно добавленное действие:

    <!-- android:exported required if you target Android 12. -->
    <activity android:name=".DataAccessRationaleActivity"
              android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
              android:exported="true">
           <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on
                your app permission's page in system settings.
                VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information
                icon on the Privacy Dashboard screen. -->
        <intent-filter>
           <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
           <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" />
           <category android:name="android.intent.category.DEFAULT" />
           ...
        </intent-filter>
    </activity>
  3. Решите, что должно быть показано в обосновании доступа к данным. Например, вы можете указать сайт приложения или статью Справочного центра. Чтобы предоставить более подробное объяснение о типах данных, к которым ваше приложение получает доступ, а также о том, когда произошел доступ, обработайте дополнительные данные, которые система включает при вызове намерения использования разрешения:

    • Если система вызывает ACTION_VIEW_PERMISSION_USAGE, ваше приложение может получить значение для EXTRA_PERMISSION_GROUP_NAME.
    • Если система вызывает ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD, ваше приложение может получить значения для EXTRA_PERMISSION_GROUP_NAME, EXTRA_ATTRIBUTION_TAGS, EXTRA_START_TIME и EXTRA_END_TIME.

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

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

При нажатии на этот значок открывается окно с обоснованием.

Закругленный прямоугольник в правом верхнем углу, в котором есть значки камеры и микрофона.
Рисунок 2. Индикаторы микрофона и камеры, которые показывают, когда в последний раз использовались эти устройства.

Индикаторы

На устройствах с Android 12 или более поздней версией ОС, когда приложение использует микрофон или камеру, в строке состояния появляется значок. Если приложение работает в режиме комфортного просмотра, значок находится в правом верхнем углу экрана. Пользователи могут открыть быстрые настройки и выбрать значок, чтобы посмотреть, какие приложения сейчас используют микрофон или камеру. На рисунке 2 показан пример скриншота со значками.

Определите местоположение индикаторов на экране

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

Kotlin

view.setOnApplyWindowInsetsListener { view, windowInsets ->
    val indicatorBounds = windowInsets.getPrivacyIndicatorBounds()
    // change your UI to avoid overlapping
    windowInsets
}

Переключатели

Параметры быстрых настроек называются &quot;Доступ к камере&quot; и &quot;Доступ к микрофону&quot;.
Рисунок 3. Переключатели микрофона и камеры в быстрых настройках.

На поддерживаемых устройствах с Android 12 или более поздней версией ОС пользователи могут разрешать и запрещать доступ к камере и микрофону для всех приложений с помощью одного переключателя. Пользователи могут получить доступ к переключаемым параметрам в быстрых настройках, как показано на рисунке 3, или на экране конфиденциальности в системных настройках.

Переключатели камеры и микрофона влияют на все приложения на устройстве:

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

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

Проверьте поддержку устройств

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

Kotlin

val sensorPrivacyManager = applicationContext
        .getSystemService(SensorPrivacyManager::class.java)
        as SensorPrivacyManager
val supportsMicrophoneToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.MICROPHONE)
val supportsCameraToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.CAMERA)

Java

SensorPrivacyManager sensorPrivacyManager = getApplicationContext()
        .getSystemService(SensorPrivacyManager.class);
boolean supportsMicrophoneToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.MICROPHONE);
boolean supportsCameraToggle = sensorPrivacyManager
        .supportsSensorToggle(Sensors.CAMERA);