Sobes.tech
Junior

Quali tipi di permessi esistono nelle applicazioni Flutter?

sobes.tech AI

Risposta dell'AI

Le autorizzazioni nelle applicazioni Flutter sono gestite dal sistema operativo del dispositivo (Android o iOS). Flutter fornisce l'accesso alle API della piattaforma corrispondenti per richiedere e verificare queste autorizzazioni.

Tipi principali di autorizzazioni:

  • Autorizzazioni al momento dell'installazione (Install-time permissions): Sono concesse automaticamente durante l'installazione dell'app. Non richiedono una richiesta esplicita all'utente durante l'esecuzione. Su Android, appartengono alle categorie normal e signature.
  • Autorizzazioni in tempo di esecuzione (Runtime permissions): Sono le autorizzazioni più importanti e sensibili, come l'accesso alla posizione, alla fotocamera, al microfono, ai contatti e ai file. Richiedono una richiesta esplicita all'utente durante l'esecuzione. L'utente può concedere o negare questa autorizzazione. Su Android, appartengono alla categoria dangerous.
  • Autorizzazioni speciali (Special permissions): Permessi che richiedono un'interazione particolare con l'utente per essere concessi, come il permesso di disegnare sopra altre finestre (ACTION_MANAGE_OVERLAY_PERMISSION) o di modificare le impostazioni di sistema (WRITE_SETTINGS).

Flutter utilizza plugin per interagire con l'API della piattaforma e gestire le autorizzazioni. Il plugin più comune è permission_handler.

Quando si lavora con permission_handler, si utilizzano i seguenti stati di autorizzazione:

  • granted: Autorizzazione concessa.
  • denied: Autorizzazione negata (può essere richiesta di nuovo).
  • restricted: Autorizzazione limitata dalla piattaforma.
  • permanentlyDenied: Autorizzazione negata definitivamente, è necessario indirizzare l'utente alle impostazioni dell'app.
  • limited: Autorizzazione parzialmente concessa (ad esempio, accesso solo a foto selezionate su iOS).

Esempio di richiesta di autorizzazione per l'accesso alla fotocamera:

import 'package:permission_handler/permission_handler.dart';

// Funzione asincrona per richiedere l'autorizzazione
Future<void> requestCameraPermission() async {
  // Ottieni lo stato dell'autorizzazione
  var status = await Permission.camera.status;
  // Se l'autorizzazione non è ancora concessa
  if (status.isDenied) {
    // Richiedi l'autorizzazione
    status = await Permission.camera.request();
    // Controlla lo stato dopo la richiesta
    if (status.isGranted) {
      // Autorizzazione concessa, puoi usare la fotocamera
      print('Autorizzazione fotocamera concessa');
    } else if (status.isPermanentlyDenied) {
      // Autorizzazione negata definitivamente, indirizza l'utente alle impostazioni
      print('Autorizzazione fotocamera negata permanentemente, apri impostazioni');
      openAppSettings(); // funzione di permission_handler per aprire le impostazioni
    } else {
      // Autorizzazione negata, può essere richiesta di nuovo
      print('Autorizzazione fotocamera negata');
    }
  } else if (status.isGranted) {
    // Autorizzazione già concessa
    print('Autorizzazione fotocamera già concessa');
  }
}

È importante aggiungere le autorizzazioni corrispondenti nei file di manifest per Android (android/app/src/main/AndroidManifest.xml) e in Info.plist per iOS (ios/Runner/Info.plist).

Esempio di aggiunta di autorizzazione in AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Autorizzazione per l'accesso alla fotocamera -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Le tue attività -->
    </application>
</manifest>

Esempio di aggiunta della descrizione dell'uso dell'autorizzazione in Info.plist (per iOS, necessario per le autorizzazioni in tempo di esecuzione):

<?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>
	...
	<!-- Descrizione del motivo per usare la fotocamera -->
	<key>NSCameraUsageDescription</key>
	<string>Questa applicazione utilizza la tua fotocamera per scattare foto.</string>
	...
</dict>
</plist>

È importante richiedere le autorizzazioni al momento opportuno quando si utilizza la funzione che le richiede, per evitare di creare un'esperienza utente negativa.