In this guide
Every permission your app asks for has more states than "allowed" and "denied". The user can allow once, allow only while using the app, deny, deny twice, revoke later in settings, or let the system reset it after a long time of not using the app. Each state needs a sensible screen. Most permission bugs are dead ends: a button that does nothing, a blank screen, a prompt that never reappears.
First list every permission your app uses (camera, location, notifications, contacts, microphone, storage or media, and so on). Run the sequences below for each.
The sequences
A. First ask. 1. Use the feature for the first time. Expect: the system prompt appears at the moment the feature needs it, preceded by a short reason if the purpose isn't obvious. 2. Allow. Expect: the feature works at once, without restarting.
B. Deny. 3. Fresh install, deny. Expect: the app explains what is missing and offers a way forward, not a blank screen or crash. 4. Trigger the feature again after one denial. Expect: the app can ask again or explain why, without nagging. 5. Deny repeatedly until the system stops showing the prompt. Expect: the app sends the user to the app settings with a clear message and a button.
C. Partial grants. (Where the system offers them.) 6. Choose approximate instead of precise location, or "only while using". Expect: the feature works to the extent possible, or says what it needs. 7. Choose "allow once", leave the app, return later. Expect: the app asks again rather than failing silently.
D. Revoke while the app is running. 8. Revoke the permission in settings, return to the app. Expect: no crash; the app notices and handles it. Android may restart the app's process when a permission is revoked, so also check state restore. 9. Revoke while a feature is active, like a recording or live location. Expect: clean stop.
E. Other paths. 10. Grant in settings after denying, return. Expect: the feature now works. 11. Notifications: deny, then enable later. Expect: the app does not assume they are on. 12. Unused permission reset: if the device offers it, check that returning after a long pause does not break the app. 13. Remove permissions you never use, and make sure your declared permissions match what the app does. 14. Check a work or restricted profile if you support it.
Useful adb commands
Grant or revoke from a computer to speed up repeated runs:
adb shell pm revoke <your.package.name> android.permission.CAMERA
adb shell pm grant <your.package.name> android.permission.CAMERA
Replace the permission name as needed. Not all permissions can be changed this way.
What to report
Device, Android version, permission, sequence letter and step number, what the screen showed, and a screenshot.
Limits
Prompts and options differ by Android version and manufacturer. Store-side declarations and privacy forms are separate from this functional test; check the current store rules and, for legal questions, take proper advice (this is not legal advice).
Overview: Android app testing. Related: battery saver and Doze and process death.
Start free on AppReviewX and let testers run these sequences and report back privately.