Cómo declarar permisos de la app

Como se mencionó en el flujo de trabajo para usar permisos, si la app necesita solicitar permisos, debes declararlos en el archivo de manifiesto. Esto ayuda a que las tiendas de aplicaciones y los usuarios sepan cuál es el conjunto de permisos que podría solicitar tu app.

El proceso para solicitar un permiso depende del tipo de permiso:

Agrega una declaración al manifiesto de la app

Para declarar un permiso que tu app pueda solicitar, incluye el elemento <uses-permission> correspondiente en el archivo de manifiesto de tu app. Por ejemplo, una app que necesita acceder a la cámara tiene esta línea en AndroidManifest.xml:

<manifest ...>
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

Declara el hardware como opcional

Algunos permisos, como CAMERA, brindan a tu app acceso a hardware que solo tienen algunos dispositivos Android. Si tu app declara uno de estos permisos asociados al hardware, determina si de todas maneras podrá ejecutarse en un dispositivo que no tenga ese hardware. En la mayoría de los casos, el hardware no es obligatorio, por lo que es mejor establecer android:required en false en tu declaración de <uses-feature>, como se muestra en el siguiente fragmento de código de un archivo AndroidManifest.xml:

<manifest ...>
    <application>
        ...
    </application>
    <uses-feature android:name="android.hardware.camera"
                  android:required="false" />
<manifest>

Determina la disponibilidad del hardware

Si declaras un componente de hardware como opcional, tu app podrá ejecutarse en dispositivos que no lo tengan. Para comprobar si un dispositivo cuenta con un componente específico, usa el método hasSystemFeature(), como se muestra en el siguiente fragmento de código: Si el hardware no está disponible, inhabilita correctamente esa función en la app.

Kotlin

// Check whether your app is running on a device that has a front-facing camera.
if (applicationContext.packageManager.hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

Java

// Check whether your app is running on a device that has a front-facing camera.
if (getApplicationContext().getPackageManager().hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

Declara permisos por nivel de API

Para declarar un permiso solo en dispositivos que admiten permisos de tiempo de ejecución, es decir, dispositivos con Android 6.0 (nivel de API 23) o versiones posteriores, incluye un elemento <uses-permission-sdk-23> en lugar de un elemento <uses-permission>.

Cuando usas cualquiera de estos elementos, puedes configurar el atributo maxSdkVersion para indicar que los dispositivos que ejecutan una versión de Android posterior al valor especificado no necesitan un permiso en particular. Esto te permite eliminar permisos innecesarios sin perder compatibilidad con dispositivos anteriores.

Por ejemplo, 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. Sin embargo, para la compatibilidad con dispositivos anteriores, puedes declarar el permiso READ_EXTERNAL_STORAGE y establecer android:maxSdkVersion en 28.