Sobes.tech
Junior

¿Qué tipos de permisos existen en las aplicaciones Flutter?

sobes.tech AI

Respuesta de la IA

Los permisos en las aplicaciones Flutter son gestionados por el sistema operativo del dispositivo (Android o iOS). Flutter proporciona acceso a las API correspondientes de la plataforma para solicitar y verificar estos permisos.

Tipos principales de permisos:

  • Permisos en tiempo de instalación (Install-time permissions): Se otorgan automáticamente durante la instalación de la aplicación. No requieren solicitud explícita al usuario durante la ejecución de la aplicación. En Android, pertenecen a las categorías normal y signature.
  • Permisos en tiempo de ejecución (Runtime permissions): Son los permisos más importantes y sensibles, como acceso a la ubicación, cámara, micrófono, contactos y archivos. Requieren una solicitud explícita al usuario durante la ejecución de la aplicación. El usuario puede conceder o denegar dicho permiso. En Android, pertenecen a la categoría dangerous.
  • Permisos especiales (Special permissions): Permisos que requieren una interacción especial con el usuario para ser concedidos, como el permiso para dibujar sobre otras ventanas (ACTION_MANAGE_OVERLAY_PERMISSION) o para modificar configuraciones del sistema (WRITE_SETTINGS).

Flutter utiliza plugins para interactuar con la API de la plataforma y gestionar permisos. El plugin más común es permission_handler.

Al trabajar con permission_handler, se utilizan los siguientes estados de permisos:

  • granted: Permiso concedido.
  • denied: Permiso denegado (posible volver a solicitar).
  • restricted: Permiso restringido por la plataforma.
  • permanentlyDenied: Permiso denegado de forma definitiva, se debe dirigir al usuario a la configuración de la aplicación.
  • limited: Permiso concedido parcialmente (por ejemplo, acceso solo a fotos seleccionadas en iOS).

Ejemplo de solicitud de permiso para acceder a la cámara:

import 'package:permission_handler/permission_handler.dart';

// Función asíncrona para solicitar permiso
Future<void> requestCameraPermission() async {
  // Obtenemos el estado del permiso
  var status = await Permission.camera.status;
  // Si el permiso aún no está concedido
  if (status.isDenied) {
    // Solicitamos el permiso
    status = await Permission.camera.request();
    // Verificamos el estado después de la solicitud
    if (status.isGranted) {
      // Permiso concedido, se puede usar la cámara
      print('Permiso de cámara concedido');
    } else if (status.isPermanentlyDenied) {
      // Permiso denegado de forma definitiva, dirigimos al usuario a la configuración
      print('Permiso de cámara denegado permanentemente, abrir configuración');
      openAppSettings(); // Función de permission_handler para abrir configuraciones
    } else {
      // Permiso denegado, pero se puede solicitar nuevamente
      print('Permiso de cámara denegado');
    }
  } else if (status.isGranted) {
    // Permiso ya concedido
    print('Permiso de cámara ya concedido');
  }
}

Es importante agregar los permisos correspondientes en los archivos de manifiesto para Android (android/app/src/main/AndroidManifest.xml) y en Info.plist para iOS (ios/Runner/Info.plist).

Ejemplo de agregar permiso en AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Permiso para acceder a la cámara -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Tus actividades -->
    </application>
</manifest>

Ejemplo de agregar descripción del uso del permiso en Info.plist (para iOS, necesario para permisos en tiempo de ejecución):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	...
	<!-- Descripción del uso de la cámara -->
	<key>NSCameraUsageDescription</key>
	<string>Esta aplicación usa su cámara para tomar fotos.</string>
	...
</dict>
</plist>

Es importante solicitar permisos en el momento adecuado cuando se use la función que requiere permiso, para no crear una experiencia negativa para el usuario.