PlatformException: PERMISSION_DENIED, The operation was denied because the permission scope is insufficient
ID: flutter/insufficient-permission-scope
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Flutter 3.19 | active | — | — | — |
| Dart 3.3 | active | — | — | — |
| Android 14 | active | — | — | — |
| iOS 17.2 | active | — | — | — |
Root Cause
A platform-specific permission (e.g., camera, location, storage) was requested but the user granted only a limited scope, or the permission was not declared in the app manifest.
generic中文
请求了平台特定权限(如摄像头、位置、存储),但用户仅授予了有限范围,或者未在应用清单中声明该权限。
Official Documentation
https://docs.flutter.dev/development/data-and-backend/reading-writing-imagesWorkarounds
-
90% success Use the permission_handler package to explicitly request the permission and check the status before performing the operation. Example: `final status = await Permission.camera.request(); if (status.isGranted) { // proceed } else { // show rationale }`
Use the permission_handler package to explicitly request the permission and check the status before performing the operation. Example: `final status = await Permission.camera.request(); if (status.isGranted) { // proceed } else { // show rationale }` -
95% success Declare the exact permission in AndroidManifest.xml (e.g., <uses-permission android:name="android.permission.CAMERA" />) and in Info.plist (e.g., NSCameraUsageDescription).
Declare the exact permission in AndroidManifest.xml (e.g., <uses-permission android:name="android.permission.CAMERA" />) and in Info.plist (e.g., NSCameraUsageDescription).
-
80% success For Android 14+ granular media permissions, request each sub-permission (e.g., ACCESS_MEDIA_LOCATION) separately using the `photo_manager` or similar package that handles scoped storage.
For Android 14+ granular media permissions, request each sub-permission (e.g., ACCESS_MEDIA_LOCATION) separately using the `photo_manager` or similar package that handles scoped storage.
中文步骤
Use the permission_handler package to explicitly request the permission and check the status before performing the operation. Example: `final status = await Permission.camera.request(); if (status.isGranted) { // proceed } else { // show rationale }`Declare the exact permission in AndroidManifest.xml (e.g., <uses-permission android:name="android.permission.CAMERA" />) and in Info.plist (e.g., NSCameraUsageDescription).
For Android 14+ granular media permissions, request each sub-permission (e.g., ACCESS_MEDIA_LOCATION) separately using the `photo_manager` or similar package that handles scoped storage.
Dead Ends
Common approaches that don't work:
-
50% fail
Over-declaring permissions may cause app store rejection or user distrust; also, runtime permission requests still require user consent and proper handling.
-
75% fail
Ignoring the result means the app proceeds without the required permission, leading to the same exception when the operation is attempted.
-
85% fail
Lowering compileSdkVersion may introduce security vulnerabilities and prevent use of newer APIs; it also does not resolve runtime permission denials on newer devices.