Cómo evaluar si tu app debe declarar permisos

Antes de declarar los permisos de tu app, evalúa si debes hacerlo. Cada vez que el usuario pruebe una función que requiera un permiso de tiempo de ejecución, tu app deberá interrumpir el trabajo del usuario con una solicitud de permiso. El usuario debe tomar una decisión. Si el usuario no comprende por qué tu app solicita un permiso en particular, es posible que lo rechace o incluso desinstale la app.

Considera si otra app instalada podría realizar la función en nombre de la tuya. En estos casos, debes delegar la tarea a otra app con un intent. Al hacerlo, no es necesario declarar los permisos necesarios, ya que la otra app declara el permiso.

Alternativas a la declaración de permisos

En esta sección, se describen varios casos de uso que tu app puede entregar sin declarar la necesidad de permisos.

Cómo mostrar lugares cercanos

Es posible que tu app necesite conocer la ubicación aproximada del usuario. Esto es útil para mostrar información de reconocimiento de la ubicación, como restaurantes cercanos.

Algunos casos de uso requieren una estimación aproximada de la ubicación de un dispositivo, a unos 2 km (1.25 millas). En estos casos, puedes declarar el permiso ACCESS_COARSE_LOCATION. Es mejor no declarar el permiso y, en su lugar, solicitar al usuario que ingrese una dirección o un código postal.

Otros casos de uso requieren una estimación más precisa de la ubicación de un dispositivo. Solo en esos casos, es correcto declarar el permiso ACCESS_FINE_LOCATION.

Cómo tomar fotos

Es posible que los usuarios tomen fotos en tu app con la app de cámara del sistema preinstalada.

En este caso, no declares el permiso CAMERA. En su lugar, invoca la acción de intent ACTION_IMAGE_CAPTURE.

Cómo grabar videos

Es posible que los usuarios graben videos en tu app con la app de cámara del sistema preinstalada.

En este caso, no declares el permiso CAMERA. En su lugar, invoca la acción de intent ACTION_VIDEO_CAPTURE.

Cómo abrir el contenido multimedia que creó tu app

Tu app puede mostrar contenido multimedia, como fotos o videos, que el usuario creó mientras la usaba. En este caso, no es necesario que uses el permiso READ_EXTERNAL_STORAGE en dispositivos que ejecutan Android 10 (nivel de API 29) ni versiones posteriores, siempre y cuando la app se oriente a estas versiones. Si la app está orientada a Android 10, inhabilita el almacenamiento específico.

Para lograr la compatibilidad con dispositivos más antiguos, declara el permiso READ_EXTERNAL_STORAGE y establece android:maxSdkVersion en 28.

Busca el archivo en una de las siguientes colecciones, que la tienda de contenido multimedia conoce:

Usa ContentResolver para buscar contenido multimedia directamente desde la tienda, en lugar de intentar descubrirlo por tu cuenta.

Cómo abrir documentos

Tu app puede mostrar documentos que el usuario creó, ya sea en la tuya o en otra aplicación. Un ejemplo común son los archivos de texto.

En este caso, no necesitas usar el permiso READ_EXTERNAL_STORAGE en dispositivos que ejecutan Android 10 o versiones posteriores, siempre y cuando tu app se oriente a estas versiones. Si la app está orientada a Android 10, inhabilita el almacenamiento específico.

Para lograr la compatibilidad con dispositivos más antiguos, declara el permiso READ_EXTERNAL_STORAGE y establece android:maxSdkVersion en 28.

Según la app que haya creado el documento, realiza una de las siguientes acciones:

Cómo identificar el dispositivo que ejecuta una instancia de tu app

Es posible que una instancia específica de tu app necesite saber en qué dispositivo se está ejecutando. Esto es útil para las apps que tienen preferencias o mensajes específicos de dispositivos, como diferentes listas de reproducción para dispositivos de TV y wearables.

En este caso, no accedas directamente al IMEI del dispositivo. De hecho, a partir de Android 10, no puedes hacerlo. Como alternativa, realiza una de las siguientes acciones:

  • Obtén un identificador de dispositivo único para la instancia de tu app mediante la biblioteca de ID de instancia.
  • Crea tu propio identificador específico para el almacenamiento de la app. Usa funciones básicas del sistema, como randomUUID().

Cómo vincular un dispositivo mediante Bluetooth

Es posible que tu app ofrezca una experiencia mejorada mediante la transferencia de datos a otro dispositivo a través de Bluetooth.

Para admitir esta función, no declares los permisos ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIION ni BLUETOOTH_ADMIN. En su lugar, usa la vinculación de dispositivos complementarios.

Cómo detener contenido multimedia cuando se interrumpe la app

Si el usuario recibe una llamada telefónica o si suena una alarma configurada por él, tu app deberá pausar la reproducción multimedia hasta que recupere el foco de audio.

Para admitir esta función, no declares el permiso READ_PHONE_STATE. En su lugar, implementa el controlador de eventos onAudioFocusChange(), que se ejecuta automáticamente cuando el sistema cambia su foco de audio. Descubre cómo implementar el foco de audio.

Cómo filtrar llamadas telefónicas

A fin de reducir las interrupciones innecesarias para el usuario, tu app puede filtrar llamadas telefónicas de spam.

Para admitir esta función, no declares el permiso READ_PHONE_STATE. En su lugar, usa la API de CallScreeningService.