Guides » Device Hardening » Location Tracking

Location Tracking Mitigation: Disabling Device Tracking

Phone location tracking does not depend on GPS. GPS is the most precise channel, but it is also the easiest to disable and the one apps fall back from. The channels that keep working when GPS is off are Wi-Fi scanning, Bluetooth scanning, cell-tower triangulation, and IP geolocation — and of those, the Wi-Fi SSID list is the most accurate, because a database of network names maps directly to physical addresses.

This matters because the standard advice — turn off GPS, disable location services — addresses only the visible channel. An app with location permission revoked still receives your approximate position through the networks you are near, and a device with Wi-Fi scanning enabled in the background reports the SSID list continuously.

This guide covers measuring what your device is actually reporting, revoking precision rather than access wholesale, disabling the passive scanning channels people miss, and handling the desktop case where the browser is the source.

Android location diagnostics showing 47 apps with fine location permission, a precise GPS fix being requested in background, and permission downgraded to coarse-only
Figure 1 — Permission audit: the number of apps able to request precise location, a background GPS fix at ~12 m accuracy, and the result after revoking fine and background access.

1. How the Protocol Protects You

Start by observing rather than changing. Capture the outbound requests containing coordinates — the evidence is clearer than any settings screen.

# Which apps hold location permission?
$ adb shell dumpsys package | grep -B1 'ACCESS_FINE_LOCATION' | grep package: | wc -l

# What is the device reporting right now?
$ adb shell dumpsys location | grep -A3 'last location'

# Watch what actually leaves the device - pick an observed endpoint
$ sudo tcpdump -i any -n 'host ' -A -c 10 | grep -iE 'lat|lon|ssid|bssid'

# Check the passive scanning channels
$ adb shell settings get global wifi_scan_always_enabled
$ adb shell settings get global ble_scan_always_enabled

The SSID field in that capture is the finding that surprises people. Even with GPS off and location permission revoked, an app with network access can read the list of nearby networks, and that list is a fingerprint accurate to a building. This is why registry-based approaches treat a network list as a location.

Channel Accuracy Active When GPS Is Off?
GPS / GNSS 3–15 m No — this is the one you can switch off
Wi-Fi SSID list 10–50 m Yes, unless scan-throttling is enabled
Bluetooth beacons 1–30 m Yes, if BLE scanning is on
Cell tower triangulation 100 m – 2 km Yes — carrier-side, not controllable on the device
IP address City-level Yes, always
Channel Remove or Reduce Where to Change It
GPS Revoke per app or system-wide App permission: set to coarse-only, not fine
Wi-Fi scanning Disable background scanning Developer options / scanning settings, or wifi_scan_always_enabled=0
BLE scanning Disable background scanning Same location of setting; also revoke nearby-devices permission
Wi-Fi SSID exposure Disable the app's network permission Per-app: revoke "Nearby devices" and network access
Cell tower Not removable Airplane mode is the only control
IP address VPN or Tor Network layer, outside the app's control
Packet capture showing location coordinates and Wi-Fi SSID being uploaded by a single app, followed by background Wi-Fi and Bluetooth scanning disabled
Figure 2 — The hidden channel: coordinates, accuracy, and the nearby network SSID list all uploaded in the same request — with background scanning then disabled.

2. Setup Walkthrough

The binary allow/deny model is the wrong frame. Most apps that will not work without location do not actually need precision — a weather app needs your city, not your building.

# Downgrade an app from precise to coarse, and cut background access
$ adb shell cmd appops set  android:coarse_location allow
$ adb shell cmd appops set  android:fine_location deny
$ adb shell cmd appops set  android:background_location deny

# Verify the effective mode for one app
$ adb shell cmd appops get  | grep -i location

# Android 12+: also set the "approximate" mode in the UI
#   Settings -> Apps ->  -> Permissions -> Location -> Approximate

Background location is the setting that carries most of the risk. An app with background access logs your position continuously whether or not you opened it. Foreground-only access still gives the app what it needs when you use it, and removes the passive log.

3. Configuration That Actually Matters

These are the settings almost nobody changes, and they are what keeps location working when everything else is disabled.

# Android - disable background Wi-Fi and BLE scanning
$ adb shell settings put global wifi_scan_always_enabled 0
$ adb shell settings put global ble_scan_always_enabled 0

# Also in the UI: Settings -> Location -> Wi-Fi scanning / Bluetooth scanning -> OFF
# Both are separate toggles, often left on after setup.

# Revoke the "Nearby devices" permission from apps that do not need it:
$ adb shell cmd appops set  android:neighboring_cells allow  # or deny

# Verify both are off
$ adb shell settings get global wifi_scan_always_enabled
$ adb shell settings get global ble_scan_always_enabled
# Expect: 0 and 0

Note that disabling Wi-Fi scanning does not disable Wi-Fi. The normal Wi-Fi connection you use still works; what stops is the background scan that periodically enumerates nearby networks and reports them as location data.

4. Limitations & Known Leak Paths

Browsers expose a location API, and pages can request it. The default in most browsers is to prompt, but a site you previously allowed keeps that grant indefinitely.

# Firefox / LibreWolf - block the geolocation API outright
# about:config
geo.enabled                        = false
permissions.default.geo            = 2      # 2 = block, never prompt

# Chrome / Brave - block by default
# Settings -> Privacy -> Site settings -> Location -> Don't allow

# Audit existing grants and revoke everything
# Firefox: about:preferences#privacy -> Permissions -> Location -> Settings
# Chrome:  chrome://settings/content/location

# Check whether your IP leaks an accurate location
$ curl -s https://ipinfo.io/json | jq '{city, region, loc}'
"loc": "1.2897,103.8512"    # IP-based position - no browser grant needed

The IP-based position at the end is the reminder that location on the desktop is not purely a permission question. Your address is geolocated by the network you connect from, and the only way to change that is a VPN or Tor exit with a different apparent origin.

Frequently Asked Questions

Does turning off GPS stop location tracking completely?

No. Wi-Fi scanning, Bluetooth beacons, cell tower triangulation, and IP geolocation all continue independently. GPS is the most precise channel but the least resilient — apps were designed to fall back when it is unavailable, which means the other channels are active by default.

Why do so many apps need location at all?

Usually for analytics rather than function. A note-taking app reporting location is collecting a behavioural dataset, not serving the user. Downgrading to coarse or revoking outright rarely breaks anything outside navigation, weather, and ride-hailing.

Can I prevent apps knowing which Wi-Fi network I am on?

Revoke the nearby-devices and network permissions for that app. On Android 12 and later, apps that need to enumerate nearby devices must request an explicit permission; denying it removes the SSID channel entirely, which is the most accurate fallback after GPS.

Sources & References


Commands shown were run and re-checked in our location telemetry test setup; re-verify them against your own firmware and package versions before trusting them on a live machine.