Security

    Android runtime permissions and least privilege

    A 2026 view of an Android app requesting only the runtime permissions its features use, in context, with a high-risk permission flagged as needing Google Play justification

    Every permission your Android app requests is something a user can see, question, and deny, and something Google Play expects you to justify. The principle that keeps you out of trouble is least privilege: ask for only the permissions your features actually use, request them in context, and handle a denial gracefully. Over-requesting erodes user trust, invites scrutiny, and with high-risk permissions can get your app removed. AI-built apps and copied templates often request more than they need. Here is how runtime permissions work and how to keep your requests minimal.

    Short answer

    Android runtime permissions require your app to request dangerous permissions, like camera, location, microphone, and contacts, at runtime, where the user can grant, deny, or later revoke them. Per Android's permissions guidance, you should follow least privilege: request only the permissions your features genuinely need, ask in context with a clear reason, and handle denial without breaking the app. Over-requesting harms privacy and user trust, and high-risk permissions such as background location or SMS access require justification to Google Play or your app is removed. Request the minimum, prefer narrower options where they exist, and do not inherit permissions from SDKs you do not need.

    What you should know

    • Dangerous permissions are requested at runtime: the user grants or denies them.
    • Least privilege is the rule: request only what your features use.
    • Ask in context with a reason: not all at once on launch.
    • Handle denial gracefully: the app must work, or degrade, without it.
    • High-risk permissions need justification: or Google Play removes the app.

    How do Android runtime permissions work?

    Sensitive permissions are granted by the user at runtime, not silently at install. Android classifies permissions, and the dangerous ones, those touching private data or sensors like the camera, microphone, location, and contacts, must be requested at runtime, prompting the user to allow or deny. The user can also revoke a granted permission later in settings, and the system can auto-reset permissions for apps left unused, so you cannot assume a permission stays granted. Newer versions add finer control: one-time permissions, approximate rather than precise location, and granular media access instead of a single broad storage permission. The practical consequence is that permissions are a negotiation with the user, not a given, so your app has to request them deliberately and cope with whatever the user decides.

    Least privilege: requesting only what you need

    Ask for the narrowest set that supports your features. The table shows the mindset.

    PracticeWhy it matters
    Request only permissions your features useFewer requests, more trust, less scrutiny
    Ask in context, when the feature is usedUsers understand and grant more readily
    Prefer narrower optionsApproximate location or granular media over broad access
    Avoid SDK-driven permissions you do not needA dependency can pull in permissions you never use
    Drop unused permissionsRemove anything no current feature requires

    The discipline is to map each permission to a feature a user can see, and to drop any permission that does not map to one. Requesting a permission your app does not visibly use looks like overreach to users and to Google Play, and it expands what a compromise could touch. Narrower options, like approximate location when you do not need precise, reduce both the privacy impact and the friction of getting a yes.

    How do you handle denial and high-risk permissions?

    Design for denial, and justify or avoid high-risk permissions. Assume any permission can be denied or revoked, and make your app degrade gracefully rather than crash or block, offering the feature when permission is granted and a reasonable fallback when it is not. For high-risk permissions, background location, SMS or Call Log access, and similar, Google Play requires that your app's core functionality genuinely needs them and that you justify them, often through a declaration, or the app is removed, so do not request these unless they are central to what your app does. Watch SDK-driven permissions too, since an ad, analytics, or maps library can add permissions to your manifest that you did not intend, which both surprises users and can trip Play policy. The goal is that every permission is necessary, justified, and survivable when denied.

    What to watch out for

    The first trap is requesting permissions on launch or in bulk rather than in context, which lowers grant rates and looks like overreach. The second is a high-risk permission without the core-function justification Google Play requires, which can get the app removed. The third is a dependency adding permissions you do not need; audit your manifest for permissions no feature uses. A pre-submission scan such as PTKD.com (https://ptkd.com) reads the compiled APK or AAB against OWASP MASVS and surfaces the permissions your app declares, so you can spot over-requested or SDK-driven permissions that do not match your features before you ship. Trimming the manifest to least privilege is the fix.

    What to take away

    • Android requires dangerous permissions to be requested at runtime, where users can grant, deny, or revoke them, so permissions are not guaranteed.
    • Follow least privilege: request only the permissions your features use, ask in context, and prefer narrower options like approximate location.
    • Handle denial gracefully, and only request high-risk permissions like background location or SMS if your core function needs them and you can justify them to Google Play.
    • Audit for SDK-driven and unused permissions, and use a pre-submission scan such as PTKD.com to confirm your declared permissions match your features.
    • #android
    • #runtime-permissions
    • #least-privilege
    • #permissions
    • #privacy
    • #owasp-masvs
    • #app-security

    Frequently asked questions

    How do Android runtime permissions work?
    Dangerous permissions, those touching private data or sensors like the camera, microphone, location, and contacts, are requested at runtime, prompting the user to allow or deny. The user can revoke a granted permission later in settings, and the system can auto-reset permissions for unused apps, so a permission is never guaranteed to stay granted. Newer Android versions add one-time permissions, approximate location, and granular media access, giving users finer control over what they grant.
    What is least privilege for app permissions?
    Requesting only the permissions your features actually use, and dropping any that do not map to a visible feature. Ask in context when the feature is used rather than all at once on launch, prefer narrower options like approximate location or granular media over broad access, and avoid permissions a dependency pulls in that you do not need. Mapping each permission to a feature keeps requests minimal, which builds trust and reduces both scrutiny and attack surface.
    Which permissions require Google Play justification?
    High-risk permissions such as background location, SMS, and Call Log access. Google Play requires that your app's core functionality genuinely needs them and that you justify them, often through a declaration form, or the app is removed. So do not request these unless they are central to what your app does. If a feature only occasionally needs sensitive access, look for a narrower alternative rather than a high-risk permission you would have to justify.
    How should I handle a denied permission?
    Design for it. Assume any permission can be denied or revoked, and make your app degrade gracefully rather than crash or block: offer the feature when permission is granted and provide a reasonable fallback when it is not. Explain why you need a permission at the point you request it, so users understand and are more likely to grant it. An app that breaks on denial both frustrates users and signals poor permission handling.
    Why does my app request permissions I did not add?
    Usually a third-party SDK. An ad, analytics, or maps library can add permissions to your merged manifest that you did not intend, which surprises users and can trip Google Play policy if they are sensitive. Audit your final manifest for permissions no feature uses, and remove or replace SDKs that pull in unnecessary ones. A pre-submission scan such as PTKD.com surfaces the permissions your app declares so you can confirm they match your features.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free