{"id":1481,"date":"2026-11-07T18:00:00","date_gmt":"2026-11-07T18:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1481"},"modified":"2026-11-07T18:00:00","modified_gmt":"2026-11-07T18:00:00","slug":"ask-for-android-permissions-when-the-feature-actually-needs-them","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/","title":{"rendered":"Ask for Android Permissions When the Feature Actually Needs Them"},"content":{"rendered":"<p>A permission request makes more sense when the user has just chosen the feature that needs it. Asking for camera access while someone is trying to take a picture has an obvious explanation. Presenting several access requests before the app has done anything useful makes that explanation much harder to follow.<\/p>\n<p>Android&#8217;s <a href=\"https:\/\/developer.android.com\/training\/permissions\/requesting\">runtime-permission guidance<\/a> recommends asking in context and handling denial gracefully. Before adding a request, also check the <a href=\"https:\/\/developer.android.com\/privacy-and-security\/minimize-permission-requests\">permission-minimising alternatives<\/a>. A system picker or a more limited capability may be enough for the actual task.<\/p>\n<p>I would design the refused-permission state alongside the accepted one. The app should explain which feature is unavailable without making unrelated parts unusable. Recheck access before the operation rather than assuming a previous grant lasts forever, and avoid trapping someone in repeated prompts after they have already made a choice.<\/p>\n<p>A good permission flow is a small, understandable exchange: this action needs this access, here is why, and here is what happens if you decline. It is easier to trust because the request belongs to something the person chose to do. That usually makes a better application as well as a more considerate one.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A permission request makes more sense when the user has just chosen the feature that needs it.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13],"tags":[164,316,93],"class_list":["post-1481","post","type-post","status-publish","format-standard","hentry","category-programming","tag-android","tag-mobile-ux","tag-permissions"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ask for Android Permissions When the Feature Actually Needs Them - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ask for Android Permissions When the Feature Actually Needs Them - wade.one\" \/>\n<meta property=\"og:description\" content=\"A permission request makes more sense when the user has just chosen the feature that needs it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-07T18:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Ask for Android Permissions When the Feature Actually Needs Them\",\"datePublished\":\"2026-11-07T18:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/\"},\"wordCount\":201,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"android\",\"mobile-ux\",\"permissions\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/\",\"name\":\"Ask for Android Permissions When the Feature Actually Needs Them - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-11-07T18:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/07\\\/ask-for-android-permissions-when-the-feature-actually-needs-them\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ask for Android Permissions When the Feature Actually Needs Them\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ask for Android Permissions When the Feature Actually Needs Them - wade.one","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/","og_locale":"en_GB","og_type":"article","og_title":"Ask for Android Permissions When the Feature Actually Needs Them - wade.one","og_description":"A permission request makes more sense when the user has just chosen the feature that needs it.","og_url":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/","og_site_name":"wade.one","article_published_time":"2026-11-07T18:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/"},"author":{"name":"","@id":""},"headline":"Ask for Android Permissions When the Feature Actually Needs Them","datePublished":"2026-11-07T18:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/"},"wordCount":201,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["android","mobile-ux","permissions"],"articleSection":["Programming"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/","url":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/","name":"Ask for Android Permissions When the Feature Actually Needs Them - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-11-07T18:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/11\/07\/ask-for-android-permissions-when-the-feature-actually-needs-them\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Ask for Android Permissions When the Feature Actually Needs Them"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1173,"url":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","url_meta":{"origin":1481,"position":0},"title":"Most Mobile App Complexity Is Not in the UI","author":"","date":"April 6, 2026","format":false,"excerpt":"The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1329,"url":"https:\/\/wade.one\/blog\/2026\/06\/02\/github-copilot-coding-agent-needs-workflow-rules-not-just-access\/","url_meta":{"origin":1481,"position":1},"title":"GitHub Copilot Coding Agent Needs Workflow Rules, Not Just Access","author":"Wade","date":"June 2, 2026","format":false,"excerpt":"GitHub Copilot's coding agent is useful, but I would want explicit workflow rules around permissions, networking, and review before giving it real access.","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/wade.one\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1303,"url":"https:\/\/wade.one\/blog\/2026\/05\/15\/github-agent-hq-makes-ai-coding-a-platform-choice\/","url_meta":{"origin":1481,"position":2},"title":"GitHub Agent HQ Makes AI Coding a Platform Choice","author":"Wade","date":"May 15, 2026","format":false,"excerpt":"GitHub adding Claude and Codex agent choices is a sign that AI coding is becoming a platform layer, not just a model picker.","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/wade.one\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1181,"url":"https:\/\/wade.one\/blog\/2026\/04\/13\/what-i-check-before-i-trust-a-mobile-release\/","url_meta":{"origin":1481,"position":3},"title":"What I Check Before I Trust a Mobile Release","author":"","date":"April 13, 2026","format":false,"excerpt":"A mobile release can look fine in the app store and still be a bad idea. I usually trust it only after I have checked crash risk, permissions, API compatibility, startup behavior, rollout safety, and what happens after the update lands.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1172,"url":"https:\/\/wade.one\/blog\/2026\/04\/05\/what-makes-an-api-feel-nice-to-work-with\/","url_meta":{"origin":1481,"position":4},"title":"What Makes an API Feel Nice to Work With","author":"","date":"April 5, 2026","format":false,"excerpt":"A good API is not just functional. It is predictable, consistent, and easy to use without a lot of guesswork.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1235,"url":"https:\/\/wade.one\/blog\/2026\/04\/25\/codex-moving-beyond-code-is-the-interesting-part\/","url_meta":{"origin":1481,"position":5},"title":"Codex Moving Beyond Code Is the Interesting Part","author":"","date":"April 25, 2026","format":false,"excerpt":"Codex moving beyond code is more interesting than another model benchmark. The harder problem is where the agent sits in the actual workflow.","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/wade.one\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1481"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1481\/revisions"}],"predecessor-version":[{"id":1495,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1481\/revisions\/1495"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}