Android 17 will require explicit permission before an app can see your local network

Google is closing a long-standing gap: apps can currently scan a phone's local Wi-Fi network for other devices without asking. Android 16 introduces an opt-in NEARBY_WIFI_DEVICES-adjacent local network permission, and Android 17 will enforce it, forcing every smart-home and casting app to update before the deadline.

Younes Bekrar8 min read
ShareXLinkedInFacebook
Android 17 will require explicit permission before an app can see your local network

For years, an Android app could scan the phone's local Wi-Fi network, list other devices on it, and talk to printers, smart TVs, and IoT hubs without a permission prompt. Camera, microphone, and location got gated. Local network topology mostly did not. Google is closing that gap. Android 16 introduces a dedicated local-network-access permission as an opt-in for apps that declare it. Android 17 enforces it for apps targeting that release. According to developer.android.com, the stated goal is stopping silent use of local network layout for fingerprinting and cross-app tracking. Casting and smart-home apps are about to inherit a prompt their users have never seen before. I've been waiting for this shoe to drop since Apple made Local Network a first-class ask on iOS. Android's silence on the same surface always felt like unfinished privacy homework.

Local discovery, not your INTERNET permission

The new permission sits on the APIs that find devices on the same subnet: mDNS and Bonjour-style service discovery, multicast and broadcast traffic those protocols need, Network Service Discovery, and the broader local-subnet connection paths developers use for casting, printing, and hub pairing. Ordinary outbound requests through the existing INTERNET permission are untouched. An app that only talks to its own cloud backend over the public internet can ignore this entire story.

That split confused people early, so Google's docs hammer it. Apps that never do on-LAN discovery change nothing. Apps that find a Chromecast, a Hue bridge, a network printer, or a Plex server without asking the user to type an IP are exactly in scope.

Hard-coded connections to one known local IP, with no broadcast or multicast discovery, sit in a gray zone. The docs tie the gate to discovery and broad local-subnet APIs, which suggests a single pinned address might slip through, or might not, once enforcement hardens. I wouldn't ship on a guess. Run it on an Android 17 build.

From a user-trust angle, the old model was weird. An app could map your living room's device names after a single install and never explain why. Location prompts at least taught people that something sensitive was happening. Local topology was invisible infrastructure until a privacy researcher or a competitor pointed at it.

Opt-in in 16, enforced in 17

On Android 16, apps that target the new API level can declare the permission and start showing the system prompt, while apps that don't declare it keep unrestricted local network access. Enforcement is off. Developers get a full release cycle to wire the manifest entry and the runtime request before anything breaks in the field. Android 17 flips that for apps targeting its API level, listed as API level 37 on developer.android.com. Discovery calls without a grant fail or come back empty instead of quietly succeeding.

Google has used this warning-then-enforce pattern before with scoped storage and the nearby-Wi-Fi-devices permission. The ecosystem gets a year to complain on issue trackers. Then the behavior changes for anyone still pretending the preview notes were optional reading.

Play's API-level targeting rules eventually force the issue anyway. Once Android 17 targeting becomes mandatory for store updates, "we'll migrate later" stops being a schedule and starts being a blocked release. Sideloaded and enterprise apps can linger longer on old target SDKs. Store-distributed casting and smart-home clients mostly can't.

If you're maintaining an app that discovers LAN devices, the Android 16 window is the dress rehearsal. Ship the declaration, ship the prompt, ship the empty-state UI, and watch support tickets while enforcement is still optional. Waiting until API 37 is mandatory is how you learn about denial rates from one-star reviews.

Who hits the prompt first

Casting apps looking for a TV, smart-home apps finding a hub over mDNS, printer scanners, Jellyfin and Plex clients that auto-discover a LAN server, those features are built on exactly the protocols now gated. On Android 17, users will see a new permission dialog the first time discovery runs, unless the developer already declared and requested it during the Android 16 window.

Denial will be normal. People refuse unfamiliar permissions on reflex, especially when a bare system dialog shows up with no explanation. Smart-home and casting apps that spring the prompt cold will lose a chunk of users who assume the worst. A short in-app explanation right before the system dialog is unglamorous work. It also prevents a support queue full of "your app can't find my TV" tickets that are actually permission refusals.

There's a second-order UX problem for apps that discover devices in the background to keep a speaker list fresh. Those quiet scans become noisy the first time the system wants a grant. Expect product managers to argue about whether discovery should wait for an explicit "find devices" tap. Waiting is less magical. It also matches how people have learned to think about microphone and camera access.

Cross-ecosystem households will notice the asymmetry less once Android catches up, iPhone users already answered a Local Network prompt for the same Chromecast app. Android-only users are the ones who will feel the new friction cold.

Enterprise MDM policies may pre-grant or pre-deny the permission depending on how vendors classify it. That will create a second support path: consumer users who refuse the dialog, and managed devices where IT already chose for them. Build both into your QA matrix before Android 17 targeting becomes mandatory.

Ship against a real 17 image, including revoke

If you maintain one of those apps, the work is less mysterious than the blog posts make it sound. Hunt down NsdManager, multicast sockets, mDNS libraries, and connections into private ranges like 192.168.x.x and 10.x.x.x. Declare the permission on Android 16-targeted builds. Request it at the moment discovery happens, not at first launch when the user has no context. Then break your own happy path: permission denied, and permission revoked mid-session from system settings after it was granted. Android users can yank grants anytime. An app that assumes "granted once" means "granted forever" will hang or crash when discovery starts returning nothing.

Enforcement details around which exact calls trip the gate shifted a bit between Android 16's opt-in preview and the finalized Android 17 notes. Reading the docs is not a substitute for an emulator or device image on API 37. The apps that will look careless in a year are the ones that treated local network access like ambient Wi-Fi magic and never taught the UI what empty discovery looks like.

I care less about whether your manifest string is perfect on day one than about whether a denied grant leaves the user somewhere sane, manual IP entry, a clear error, a retry that re-requests the permission. Silent empty lists are how privacy improvements get blamed for being "bugs."

Library authors wrapping mDNS should assume their callers will forget the new permission until a support thread forces the issue. Document the Android 16/17 behavior next to the discover() method, not in a migration appendix nobody opens. The platform change is straightforward. The ecosystem lag is where the ugly releases will cluster.

  • Privacy

Keep reading