Comments (4)
Dear @lukehutch,
Unfortunately, this is a known edge case. How it works is explained in the documentation:
I'll close this issue for now, feel free to reopen the issue if new information pops-up.
/**
* Returns a {@link PermissionConstants} for a given permission.
* <p>
* When {@link PackageManager#PERMISSION_DENIED} is received, we do not know if the permission was
* denied permanently. The OS does not tell us whether the user dismissed the dialog or pressed
* 'deny'. Therefore, we need a more sophisticated (read: hacky) approach to determine whether the
* permission status is {@link PermissionConstants#PERMISSION_STATUS_DENIED} or
* {@link PermissionConstants#PERMISSION_STATUS_NEVER_ASK_AGAIN}.
* <p>
* The OS behavior has been researched experimentally and is displayed in the following diagrams:
* <p>
* State machine diagram:
* <p>
* Dismissed
* ┌┐
* ┌──┘▼─────┐ Granted ┌───────┐
* │Not asked├──────────►Granted│
* └─┬───────┘ └─▲─────┘
* │ Granted │
* │Denied ┌───────────┘
* │ │
* ┌─▼────────┴┐ ┌────────────────────────────────┐
* │Denied once├────────►Denied twice(permanently denied)│
* └──▲┌───────┘ Denied └────────────────────────────────┘
* └┘
* Dismissed
* <p>
* Scenario table listing output of
* {@link ActivityCompat#shouldShowRequestPermissionRationale(Activity, String)}:
* ┌────────────┬────────────────┬─────────┬───────────────────────────────────┬─────────────────────────┐
* │ Scenario # │ Previous state │ Action │ New state │ 'Show rationale' output │
* ├────────────┼────────────────┼─────────┼───────────────────────────────────┼─────────────────────────┤
* │ 1. │ Not asked │ Dismiss │ Not asked │ false │
* │ 2. │ Not asked │ Deny │ Denied once │ true │
* │ 3. │ Denied once │ Dismiss │ Denied once │ true │
* │ 4. │ Denied once │ Deny │ Denied twice (permanently denied) │ false │
* └────────────┴────────────────┴─────────┴───────────────────────────────────┴─────────────────────────┘
* <p>
* To distinguish between scenarios, we can use
* {@link ActivityCompat#shouldShowRequestPermissionRationale(Activity, String)}. If it returns
* true, we can safely return {@link PermissionConstants#PERMISSION_STATUS_DENIED}. To distinguish
* between scenarios 1 and 4, however, we need an extra mechanism. We opt to store a boolean
* stating whether permission has been requested before. Using a combination of checking for
* showing the permission rationale and the boolean, we can distinguish all scenarios and return
* the appropriate permission status.
* <p>
* Changing permissions via the app info screen, so outside of the application, changes the
* permission state to 'Granted' if the permission is allowed, or 'Denied once' if denied. This
* behavior should not require any additional logic.
*
* @param activity the activity for context
* @param permissionName the name of the permission
* @param grantResult the result of the permission intent. Either
* {@link PackageManager#PERMISSION_DENIED} or {@link PackageManager#PERMISSION_GRANTED}.
* @return {@link PermissionConstants#PERMISSION_STATUS_GRANTED},
* {@link PermissionConstants#PERMISSION_STATUS_DENIED}, or
* {@link PermissionConstants#PERMISSION_STATUS_NEVER_ASK_AGAIN}.
*/
from flutter-geolocator.
I am also facing this problem.
from flutter-geolocator.
Permission.location.status may instead be used.
from flutter-geolocator.
@TimHoogstrate How about adding one additional catch-all -- that if Geolocator.requestPermission()
returns within some short period of time (e.g. 100ms), then the status is set to permanently denied?
Actually it would be great if Geolocator
could distinguish between "known permanently denied" (if Geolocator.requestPermission()
returns immediately) and "may be permanently denied"...
from flutter-geolocator.
Related Issues (20)
- [Feature Request]: Switch to package:web to support wasm compilation HOT 2
- [Bug]: Windows suddenly not giving right location HOT 1
- [Bug]: App crashes when calling getCurrentPosition() HOT 12
- geolocator_android deprecated issues HOT 5
- [Bug]: Requires newer version of Kotlin Gradle Plugin HOT 22
- [Bug]: requestPermission Future never resolves, when application goes to background, when "Allow to use location" popup is displayed
- [Bug]: Geolocator.getPositionStream().listen causes a crash when user choses to only share approximate location on permission dialog HOT 2
- [Question]: getCurrentPosition not working on iOS Testflight HOT 5
- [Question]: Using IOS background location update but the gps keeps drifting
- [Question]: how can start when i cancel and restart HOT 4
- [Feature Request]: Expose Location.hasBearingAccuracy() from Android platform HOT 1
- [Bug]: The connection to Google Play services was lost due to service disconnection HOT 1
- [Enhancement proposal]: LocationAccuracyStatus dartdocs out of date HOT 1
- [Question]: Ios background stop location updates HOT 7
- [Question]: iOS keeps requesting location data while the app is in use HOT 2
- [Question]: I just install the package but still throw the error showing in the image. HOT 1
- [Bug]: macOS, LOCATION UPDATE FAILURE:Error reason: (null)Error description: The operation couldn’t be completed. (kCLErrorDomain error 0.) HOT 4
- [Question]: [!] Your project requires a newer version of the Kotlin Gradle plugin. │ │ Find the latest version on https://kotlinlang.org/docs/releases.html#release-details, then │ │ update D:\my_happy\android\build.gradle: │ │ ext.kotlin_version = '<latest-version>' HOT 3
- Stopping Background Location Service and Unregistering Listeners HOT 4
- [Bug]: GeoLocator does not work on MacOs HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from flutter-geolocator.