Neutron, nuestro motor de IA, obtuvo un 96.75% en el benchmark CyberGym de UC Berkeley. Más información

Seguridad

Seguridad

Novedades en Android M y N: permisos en tiempo de ejecución

En Android, el sistema de permisos fue una de las principales preocupaciones de seguridad de la plataforma por muchas razones...

En Android, el sistema de permisos fue una de las principales preocupaciones de seguridad de la plataforma por muchas razones:

  • El usuario solo tiene dos opciones: o permite que la aplicación obtenga todos los permisos durante la instalación sin tener ni idea de por qué ni cuándo los usará la aplicación, o los rechaza y no puede usar la aplicación en absoluto (una oferta de «lo tomas o lo dejas»).
  • Una vez concedido el permiso durante la instalación, la aplicación puede usarlo durante todo su ciclo de vida sin ninguna notificación, y el usuario no puede denegar los permisos a menos que elimine la aplicación del dispositivo.
  • No es transparente para los usuarios, pero tampoco para los desarrolladores. Puede que su aplicación tenga una funcionalidad atractiva que requiere un permiso específico, pero si no se informa al usuario ni se le explica por qué se necesita, el usuario puede considerarlo sospechoso y decidir no instalar la aplicación.
  • Android ofrece más de 130 permisos únicos. Incluso si el usuario revisa los permisos uno por uno durante la instalación, puede confundirse rápidamente (¿Qué es exactamente BODY_SENSORS? ¿Cuál es la diferencia entre BLUETOOTH, BLUETOOTH_ADMIN y BLUETOOTH_PRIVILEGED?)

¡Por fin se rediseña el sistema de permisos de Android!

A partir de Android 6.0 (Marshmallow), la aplicación no recibirá ningún permiso en el momento de la instalación. En su lugar, la aplicación tiene que solicitar al usuario cada permiso, uno por uno, en tiempo de ejecución. Es un paso importante para proteger la privacidad de los usuarios, al permitirles elegir a qué puede acceder la aplicación y a qué no, y el usuario sigue teniendo la opción de usar la aplicación.

Los desarrolladores deben comprender el nuevo sistema de permisos y adaptar la aplicación para gestionar todos los casos y ofrecer a los usuarios una buena experiencia de uso.

Entonces, como desarrollador, ¿qué debo saber sobre el nuevo sistema de permisos de Android?

1- Hay dos tipos de permisos: permisos normales y permisos peligrosos
- Los permisos normales permiten que la aplicación acceda a datos externos, excluyendo la información privada del usuario. Puede consultar la lista completa aquí.
- Los permisos peligrosos permiten que la aplicación acceda a la información privada del usuario.
2- En todas las versiones de Android, cada vez que desee usar un permiso (tanto normal como peligroso), debe añadir la etiqueta correspondiente en el manifiesto de su aplicación.
3- Los permisos normales se conceden automáticamente y no es necesario solicitarlos en tiempo de ejecución.
4- Si intenta acceder a información privada, debe solicitar explícitamente su «permiso peligroso» en tiempo de ejecución; de lo contrario, el método lanzará una SecurityException que provocará el cierre inesperado de la aplicación.
5- ¡El usuario puede revocar un permiso concedido en cualquier momento!
6- Los permisos se agrupan en grupos de permisos, de modo que, si el usuario ya concedió un permiso de un grupo determinado, puede usar todos los demás permisos de ese grupo sin volver a solicitarlos.
7- Para adaptar su aplicación al nuevo sistema de permisos, debe seguir la lógica siguiente:

Diagrama
Diagrama

8- Como una imagen vale más que mil palabras, veamos algo de código. En este ejemplo, solicitaremos el permiso SEND_SMS (véanse los comentarios):

//Unique identifier to identify each permission request
final private int REQUEST_CODE_ASK_PERMISSIONS = 999;
private void sendSMSWrapper() {
    //Check to see if the permission is available
    int hasSendSMSPermission = checkSelfPermission(Manifest.permission.SEND_SMS);
    if (hasSendSMSPermission != PackageManager.PERMISSION_GRANTED) {
     //if the permission is not granted, check if the user has already denied this request
            if (!shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)) {
  //Explain to the user why we need to send the sms
      Snackbar.Make(layout, "Send SMS is required to share the new events with your contacts.", Snackbar.LengthIndefinite)
             .SetAction("OK", v => RequestPermissions(Manifest.permission.SEND_SMS, REQUEST_CODE_ASK_PERMISSIONS))
             .Show();
      return;
            }
 // request the permission
        requestPermissions(new String[] {Manifest.permission.SEND_SMS},
                REQUEST_CODE_ASK_PERMISSIONS);
        return;
    }
    // execute your code using the user's private information
    sendSMS();
}


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            {
            // Check for SEND_SMS
            if (CheckSelfPermission(Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED
       {
                //Permission Granted
                sendSMS();
            } else {
                // Permission Denied
         var snack = Snackbar.Make(layout, "Send SMS permission is denied.", Snackbar.LengthShort);
         snack.Show();
            }
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

9- Para garantizar la compatibilidad con versiones anteriores, se recomienda usar Support Library v4, que implementa los nuevos métodos para los niveles de API de Android inferiores a 23, de modo que solo tenga que escribir un código y la biblioteca devolverá el valor correspondiente según la versión de Android. De lo contrario, tendrá que comprobar manualmente la versión de Android y aplicar el sistema de permisos antiguo para los niveles de API de Android inferiores a 23 y el nuevo sistema de permisos para los niveles de API más recientes.

if (Build.VERSION.SDK_INT >= 23) {
    // Runtime permission system
} else {
    // Old permission system
}

10- Es importante comprender el nuevo sistema de permisos de Android para ofrecer a sus usuarios una mejor experiencia de uso. Sin embargo, para que su código sea más corto y limpio, puede gestionar los permisos con una biblioteca de terceros. Nuestra favorita es PermissionsDispatcher, que ofrece una API sencilla basada en anotaciones y cubre todos los usos básicos.

11- Para obtener más información sobre el nuevo sistema de permisos, puede consultar las siguientes referencias:

  • Declaración de permisos
  • Uso de permisos
  • Prácticas recomendadas para permisos
  • Lista de todos los permisos de Android
  • Android Marshmallow 6.0: solicitud de permisos

Etiquetas:

android, google