Coder Social home page Coder Social logo

[Bug]: Tapping outside Android location permission dialog results in `LocationPermission.deniedForever` about flutter-geolocator HOT 4 CLOSED

lukehutch avatar lukehutch commented on June 2, 2024
[Bug]: Tapping outside Android location permission dialog results in `LocationPermission.deniedForever`

from flutter-geolocator.

Comments (4)

TimHoogstrate avatar TimHoogstrate commented on June 2, 2024 1

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.

sachinkhatripro avatar sachinkhatripro commented on June 2, 2024

I am also facing this problem.

from flutter-geolocator.

sachinkhatripro avatar sachinkhatripro commented on June 2, 2024

Permission.location.status may instead be used.

from flutter-geolocator.

lukehutch avatar lukehutch commented on June 2, 2024

@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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.