UAPIA is a small Android app that answers one question: which Wi-Fi access point is this device actually talking to right now? It reads the BSSID, the access point's hardware MAC address, from the active connection and shows it on screen, refreshed once a second for as long as the app stays open.
A device's SSID tells you the network's name, which is often shared across dozens of routers in an office or campus deployment. The BSSID does not lie that way. Two access points can broadcast the same "CompanyWiFi" name while carrying two different BSSIDs, and that distinction is exactly what this app surfaces — useful for diagnosing roaming behavior, confirming which physical AP a client has attached to, or auditing a multi-AP deployment where "connected to Wi-Fi" isn't a precise enough answer.
On launch, MainActivity starts a repeating check, once every 1000 milliseconds, that pulls the current connection info from WifiManager and writes the BSSID to a TextView. There's no configuration screen, no history, no background service. open the app, look at the screen, close it. The single-purpose design is deliberate; it's a diagnostic tool, not a network manager.
If the device isn't connected to Wi-Fi, or if location permission hasn't been granted, the screen reflects that state ("Not connected" or "Permission not granted") rather than silently showing stale data.
reading a BSSID counts as a location-adjacent operation under Android's privacy model, because knowing which specific access point a phone is near can approximate its physical position. Since Android 8, ACCESS_FINE_LOCATION (or ACCESS_COARSE_LOCATION) is required to retrieve WifiInfo.getBSSID(), and the OS additionally requires location services to be turned on, not just the permission granted. UAPIA checks both. If permission is missing, it prompts for it; if location services are disabled, it opens the system location settings screen directly rather than leaving the user to hunt for it.
The app does not transmit this data anywhere. Everything happens on-device, and nothing is written to disk or sent over a network.
- Android 9.0 (API 28) or later; set by
minSdkin app/build.gradle.kts - A Wi-Fi radio and an active connection (the BSSID field is empty without one)
- Location services enabled on the device, and location permission granted to the app
The project uses the standard Gradle wrapper, so no separate Gradle install is needed.
# Debug build, installed to a connected device or emulator
./gradlew installDebug
# Release build (unsigned unless you've configured signing)
./gradlew assembleReleaseOn Windows, use gradlew.bat in place of ./gradlew. Compile SDK and target SDK are both 34; check gradle.properties and the version catalog under gradle/ if you need to adjust toolchain versions.
app/src/main/java/com/idgban/uapia_user/MainActivity.java - the entire app logic
app/src/main/res/layout/activity_main.xml - the two-TextView UI
app/src/main/AndroidManifest.xml - permissions and launcher activity
The application ID is com.idgban.uapia_user; the display name shown on the home screen is "UAPIA".
There's no unit coverage for the BSSID-reading path itself — the bundled tests are the default Android Studio scaffolding (ExampleUnitTest, ExampleInstrumentedTest) and don't exercise MainActivity. The polling loop also keeps running as long as the activity is alive, including while backgrounded behind other apps, so battery impact on longer sessions hasn't been characterized. Neither is disqualifying for a diagnostic tool used in short bursts, but both are worth knowing before relying on this for anything long-running.
Released under the GNU AGPLv3 license.