[{"data":1,"prerenderedAt":77},["ShallowReactive",2],{"tutorial-gestire-i-permessi-runtime-in-flutter-con-permission-handler":3,"comments-tutorial-gestire-i-permessi-runtime-in-flutter-con-permission-handler":76},{"id":4,"title":5,"slug":6,"excerpt":7,"intro":8,"cover_image":9,"video_url":10,"difficulty":11,"estimated_minutes":12,"flutter_version":13,"status":14,"published_at":15,"meta_title":16,"meta_description":17,"category":18,"author":22,"steps":24},30,"Gestire i permessi runtime in Flutter con permission_handler","gestire-i-permessi-runtime-in-flutter-con-permission-handler","Impara a richiedere e gestire i permessi di sistema (fotocamera, posizione, storage) in modo corretto su Android e iOS usando il pacchetto permission_handler.","Molte funzionalità delle app moderne — accedere alla fotocamera, alla posizione GPS o ai contatti — richiedono il consenso esplicito dell'utente. In Flutter la gestione dei permessi runtime è semplificata dal pacchetto `permission_handler`, che offre un'API unificata per Android e iOS.\n\nIn questo tutorial vedremo come installare il pacchetto, configurare correttamente i file nativi, richiedere un permesso, gestire i diversi stati (concesso, negato, negato permanentemente) e reindirizzare l'utente alle impostazioni di sistema quando necessario.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Ftutorials\u002F6c2d2be5-9f11-451c-8259-c0436f114527.jpg",null,"intermediate",35,"3.x","published","2026-07-06T04:30:41+00:00","Permessi runtime in Flutter con permission_handler","Guida pratica per richiedere e gestire i permessi di fotocamera, posizione e storage in Flutter con il pacchetto permission_handler.",{"id":19,"name":20,"slug":21},1,"Guide","guide",{"id":19,"name":23},"Flutter Bot",[25,32,40,47,55,62,69],{"id":26,"position":19,"title":27,"body":28,"code_snippet":29,"code_language":30,"expected_result":31,"demo_url":10,"video_url":10},202,"Aggiungere la dipendenza permission_handler","Apri il file `pubspec.yaml` e aggiungi il pacchetto `permission_handler` nella sezione delle dipendenze. Successivamente esegui `flutter pub get` dal terminale per scaricarlo.","dependencies:\n  flutter:\n    sdk: flutter\n  permission_handler: ^11.3.1","yaml","Il pacchetto viene scaricato correttamente ed è disponibile per l'import nel progetto.",{"id":33,"position":34,"title":35,"body":36,"code_snippet":37,"code_language":38,"expected_result":39,"demo_url":10,"video_url":10},203,2,"Configurare Android","Su Android devi dichiarare i permessi nel file `android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml`. Aggiungi le voci relative ai permessi che intendi utilizzare, ad esempio fotocamera e posizione. I permessi runtime funzionano da Android 6.0 (API 23) in poi.\n\nVerifica inoltre che `minSdkVersion` nel file `android\u002Fapp\u002Fbuild.gradle` sia almeno 21 (raccomandato dalla libreria).","\u003Cmanifest xmlns:android=\"http:\u002F\u002Fschemas.android.com\u002Fapk\u002Fres\u002Fandroid\">\n    \u003Cuses-permission android:name=\"android.permission.CAMERA\" \u002F>\n    \u003Cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \u002F>\n\n    \u003Capplication ...>\n        ...\n    \u003C\u002Fapplication>\n\u003C\u002Fmanifest>","xml","L'app Android riconosce i permessi dichiarati e può richiederli a runtime.",{"id":41,"position":42,"title":43,"body":44,"code_snippet":45,"code_language":38,"expected_result":46,"demo_url":10,"video_url":10},204,3,"Configurare iOS","Su iOS ogni permesso richiede una descrizione testuale nel file `ios\u002FRunner\u002FInfo.plist`, altrimenti l'app verrà rifiutata dall'App Store o crasherà al momento della richiesta. Aggiungi le chiavi `NSCameraUsageDescription` e `NSLocationWhenInUseUsageDescription` con un messaggio chiaro.\n\nInoltre, `permission_handler` richiede di abilitare le macro dei permessi nel `Podfile`. Aggiungi il blocco `post_install` per definire solo i permessi che usi.","\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa la fotocamera per scattare foto.\u003C\u002Fstring>\n\u003Ckey>NSLocationWhenInUseUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa la posizione per mostrarti contenuti vicini.\u003C\u002Fstring>","iOS mostrerà i messaggi descrittivi nel popup di richiesta permesso, evitando crash.",{"id":48,"position":49,"title":50,"body":51,"code_snippet":52,"code_language":53,"expected_result":54,"demo_url":10,"video_url":10},205,4,"Verificare lo stato di un permesso","Prima di richiedere un permesso è buona pratica controllarne lo stato corrente. Il metodo `.status` restituisce un oggetto `PermissionStatus` che può assumere valori come `granted`, `denied`, `permanentlyDenied` o `restricted`.\n\nQuesto ti permette di evitare richieste inutili se il permesso è già stato concesso.","import 'package:permission_handler\u002Fpermission_handler.dart';\n\nFuture\u003Cvoid> checkCameraStatus() async {\n  final status = await Permission.camera.status;\n\n  if (status.isGranted) {\n    print('Permesso fotocamera già concesso');\n  } else if (status.isDenied) {\n    print('Permesso negato, va richiesto');\n  } else if (status.isPermanentlyDenied) {\n    print('Permesso negato permanentemente');\n  }\n}","dart","In console viene stampato lo stato attuale del permesso fotocamera.",{"id":56,"position":57,"title":58,"body":59,"code_snippet":60,"code_language":53,"expected_result":61,"demo_url":10,"video_url":10},206,5,"Richiedere il permesso e gestire l'esito","Per richiedere un permesso usa il metodo `.request()`, che mostra il popup di sistema e restituisce il nuovo `PermissionStatus`. Gestisci tutti i casi: se concesso procedi con la funzionalità, se negato mostra un messaggio, se negato permanentemente indirizza l'utente alle impostazioni.\n\nIl metodo `openAppSettings()` apre la schermata delle impostazioni dell'app, unico modo per riabilitare un permesso negato permanentemente.","Future\u003Cvoid> requestCameraPermission() async {\n  final status = await Permission.camera.request();\n\n  if (status.isGranted) {\n    \u002F\u002F Procedi: apri la fotocamera\n    print('Permesso concesso');\n  } else if (status.isPermanentlyDenied) {\n    \u002F\u002F L'utente ha negato definitivamente\n    await openAppSettings();\n  } else {\n    print('Permesso negato');\n  }\n}","Viene mostrato il popup di sistema; in base alla scelta dell'utente l'app procede o apre le impostazioni.",{"id":63,"position":64,"title":65,"body":66,"code_snippet":67,"code_language":53,"expected_result":68,"demo_url":10,"video_url":10},207,6,"Creare un widget di esempio completo","Uniamo tutto in una schermata pratica con un pulsante che richiede il permesso fotocamera e mostra un `SnackBar` con l'esito. Questo pattern è riutilizzabile per qualsiasi altro permesso cambiando semplicemente `Permission.camera`.","import 'package:flutter\u002Fmaterial.dart';\nimport 'package:permission_handler\u002Fpermission_handler.dart';\n\nclass PermissionScreen extends StatelessWidget {\n  const PermissionScreen({super.key});\n\n  Future\u003Cvoid> _handleCamera(BuildContext context) async {\n    final status = await Permission.camera.request();\n    String message;\n\n    if (status.isGranted) {\n      message = 'Fotocamera abilitata!';\n    } else if (status.isPermanentlyDenied) {\n      message = 'Permesso bloccato: apri le impostazioni';\n      await openAppSettings();\n    } else {\n      message = 'Permesso negato';\n    }\n\n    if (context.mounted) {\n      ScaffoldMessenger.of(context).showSnackBar(\n        SnackBar(content: Text(message)),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('Permessi')),\n      body: Center(\n        child: ElevatedButton.icon(\n          onPressed: () => _handleCamera(context),\n          icon: const Icon(Icons.camera_alt),\n          label: const Text('Richiedi fotocamera'),\n        ),\n      ),\n    );\n  }\n}","Toccando il pulsante appare il popup di permesso e successivamente uno SnackBar con l'esito della richiesta.",{"id":70,"position":71,"title":72,"body":73,"code_snippet":74,"code_language":53,"expected_result":75,"demo_url":10,"video_url":10},208,7,"Gestire più permessi contemporaneamente","Spesso serve richiedere più permessi in una sola volta, ad esempio fotocamera e microfono per registrare un video. Puoi passare una lista di `Permission` al metodo `request()` di una `List`, ottenendo una mappa con lo stato di ciascuno.\n\nQuesto approccio riduce il numero di popup e migliora l'esperienza utente.","Future\u003Cvoid> requestMultiple() async {\n  final Map\u003CPermission, PermissionStatus> statuses = await [\n    Permission.camera,\n    Permission.microphone,\n  ].request();\n\n  final tuttiConcessi = statuses.values.every((s) => s.isGranted);\n\n  if (tuttiConcessi) {\n    print('Tutti i permessi concessi');\n  } else {\n    statuses.forEach((permission, status) {\n      print('$permission: $status');\n    });\n  }\n}","Vengono richiesti in sequenza i permessi della lista e si ottiene lo stato dettagliato di ognuno.",[],1785219609623]