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

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

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

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

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

Котлин

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

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

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

На поддерживаемых устройствах под управлением Android 12 или более поздней версии пользователи могут включать и отключать доступ к камере и микрофону для всех приложений на устройстве, нажав один переключатель. Доступ к переключаемым параметрам можно получить из раздела «Быстрые настройки» , как показано на рисунке 3, или из раздела «Конфиденциальность» в системных настройках.

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

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

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

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

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

Котлин

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

Ява

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