Cómo explicar el acceso a información más sensible

Los permisos relacionados con la ubicación, el micrófono y la cámara otorgan a tu app acceso a información sensible de los usuarios. La plataforma incluye varios mecanismos, que se describen en esta página, para ayudar a los usuarios a mantenerse informados y controlar qué apps pueden acceder a la ubicación, el micrófono y la cámara.

Estas funciones del sistema que protegen la privacidad no deberían afectar la manera en la que tu app administra los permisos relacionados con la ubicación, el micrófono y la cámara, siempre y cuando cumplas las prácticas recomendadas de privacidad.

En especial, asegúrate de hacer lo siguiente en tu app:

  • Espera para acceder a la cámara del dispositivo hasta que el usuario otorgue el permiso CAMERA a la app.
  • Espera para acceder al micrófono del dispositivo hasta que el usuario otorgue el permiso RECORD_AUDIO a la app.
  • Espera hasta que el usuario interactúe con una función de tu app que requiera ubicación antes de solicitar los permisos ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION, según se describe en la guía sobre cómo solicitar permisos de ubicación.
  • Espera hasta que el usuario otorgue a tu app los permisos ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION antes de solicitar el permiso ACCESS_BACKGROUND_LOCATION.

Panel de privacidad

En un cronograma vertical, se muestran las diferentes apps que accedieron a la información de la ubicación y la hora en la que se produjo el acceso.
Figura 1: Pantalla de uso de la ubicación, parte del panel de privacidad.

En dispositivos compatibles que ejecutan Android 12 o versiones posteriores, aparece la pantalla del panel de privacidad en la configuración del sistema. En esta pantalla, los usuarios pueden acceder a distintas pantallas que se muestran cuando las apps acceden a la información de la ubicación, la cámara y el micrófono. En cada una, se muestra un cronograma del momento en que diferentes apps accedieron a un tipo específico de datos. En la Figura 1, se muestra el cronograma de acceso a los datos para la información de la ubicación.

Muestra los motivos del acceso a los datos

La app puede mostrarles los motivos a los usuarios para que comprendan por qué la app accede a la información de la ubicación, la cámara o el micrófono. Esos motivos pueden aparecer en la pantalla nueva del panel de privacidad, en la pantalla de permisos de la app o en ambas.

Para explicar por qué la app accede a la información de la ubicación, la cámara y el micrófono, sigue estos pasos:

  1. Agrega una actividad que, cuando se inicie, brinde algún motivo que explique por qué la app realiza un tipo particular de acción para acceder a datos. Dentro de esa actividad, establece el atributo android:permission en START_VIEW_PERMISSION_USAGE.

    Si la app se orienta a Android 12 o versiones posteriores, debes definir un valor para el atributo android:exported de forma explícita.

  2. Agrega el siguiente filtro de intents a la actividad recién añadida:

    <!-- 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. Decide qué debe mostrar la actividad de los motivos del acceso a tus datos. Por ejemplo, puedes mostrar el sitio web de la app o un artículo del Centro de ayuda. Para brindar una explicación más detallada sobre los tipos de datos a los que accede la app y el momento en que se produjo este acceso, controla los valores adicionales que el sistema incluye cuando invoca el intent de uso de permisos:

Según los filtros de intents que agregues, los usuarios verán un ícono de información junto al nombre de la app en determinadas pantallas:

  • Si agregas el filtro de intents que incluye la acción VIEW_PERMISSION_USAGE, los usuarios verán el ícono en la página de permisos de la app en la configuración del sistema. Puedes aplicar esta acción a todos los permisos de tiempo de ejecución.
  • Si agregas el filtro de intents que incluye la acción VIEW_PERMISSION_USAGE_FOR_PERIOD, los usuarios verán el ícono junto al nombre de la app cada vez que esta aparezca en la pantalla del panel de privacidad.

Cuando los usuarios seleccionan ese ícono, se inicia la actividad de los motivos de la app.

Rectángulo redondeado en la esquina superior derecha, que incluye el ícono de una cámara y de un micrófono
Figura 2: Indicadores de acceso al micrófono y a la cámara, que muestran el acceso reciente a los datos.

Indicadores

En dispositivos que ejecutan Android 12 y versiones posteriores, cuando una app accede al micrófono o a la cámara, aparece un ícono en la barra de estado. Si la app está en modo envolvente, el ícono aparece en la esquina superior derecha de la pantalla. Los usuarios pueden abrir Configuración rápida y seleccionar el ícono para ver qué apps están usando el micrófono o la cámara en ese momento. En la Figura 2, se muestra un ejemplo de captura de pantalla que contiene los íconos.

Cómo identificar la ubicación en la pantalla de los indicadores

Si tu app admite el modo envolvente o una IU de pantalla completa, los indicadores pueden superponerse temporalmente a la IU de tu app. Para ayudar a adaptar la IU a estos indicadores, el sistema introduce el método getPrivacyIndicatorBounds(), que se muestra en el siguiente fragmento de código. Esta API te permite identificar los límites en los que pueden aparecer los indicadores. Es posible que luego decidas organizar la IU de la pantalla de manera diferente.

Kotlin

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

Botones de activación

Los azulejos de Configuración rápida se etiquetan como &quot;Acceso a la cámara&quot; y &quot;Acceso al micrófono&quot;.
Figura 3: Botones de activación del micrófono y de la cámara en Configuración rápida.

En los dispositivos compatibles que ejecutan Android 12 o versiones posteriores, los usuarios pueden habilitar o inhabilitar el acceso a la cámara y al micrófono para todas las apps del dispositivo presionando una sola opción de activación. Los usuarios pueden acceder a opciones que se pueden activar o desactivar desde Configuración rápida, como se muestra en la Figura 3, o desde la pantalla de privacidad en la configuración del sistema.

Los botones de activación de la cámara y del micrófono afectan a todas las apps del dispositivo:

  • Cuando el usuario desactiva el acceso a la cámara, tu app recibe un feed de cámara en blanco.
  • Cuando desactiva el acceso al micrófono, recibe audio vacío. Además, los sensores de movimiento tienen un límite de frecuencia, independientemente de si declaras el permiso HIGH_SAMPLING_RATE_SENSORS.

Cuando el usuario desactiva el acceso a la cámara o al micrófono, y luego inicia una app que necesita acceder a la información de estos, el sistema le recuerda al usuario que se desactivó el botón de activación para todo el dispositivo.

Cómo verificar la compatibilidad de tus dispositivos

Para comprobar si un dispositivo admite los botones de activación del micrófono y de la cámara, agrega la lógica que aparece en el siguiente fragmento de código:

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);