Native Android field utility for capturing GPS coordinates from WhatsApp shared locations and calculating distance/bearing between two points.
- WhatsApp Integration — Register as a
geo:URI handler. Tap a shared location in WhatsApp, pick GeoLinkPinPoint, and coordinates auto-fill as Point A or B - Distance & Bearing — Haversine distance (m/km) and forward bearing (degrees + cardinal direction) between two points
- Manual Coordinate Input — Enter lat/lng manually or use "Use Current Location" with GPS
- Live GPS Display — Current position with latitude, longitude, altitude, and accuracy
- Compass — Accelerometer + magnetometer sensor fusion with smooth animation. Shows bearing-to-target when two points are captured
- Measurement History — Save measurements to a Room database. Tap to reload, swipe to delete
- CSV Export — Share measurement history as a CSV file via Android's share sheet
| Measure | GPS & Compass | History |
|---|---|---|
![]() |
![]() |
![]() |
- Android 8.0+ (API 26)
- JDK 17
- Android SDK 36
# Debug build
./gradlew assembleDebug
# Release build (R8 minified)
./gradlew assembleRelease
# Install on connected device
adb install app/build/outputs/apk/debug/app-debug.apk
# Run unit tests
./gradlew test
# Run instrumented tests (requires device/emulator)
./gradlew connectedAndroidTestGeoLinkPinPoint registers as an Android intent handler for the geo: URI scheme. This means any app that shares a location as a geo: link (including WhatsApp) will offer GeoLinkPinPoint as a target.
Typical workflow:
- Open WhatsApp and find a shared location message
- Tap the location — Android shows an app chooser
- Select GeoLinkPinPoint
- The coordinates fill in as Point A
- Repeat with a second location — it fills in as Point B
- Distance and bearing are calculated automatically
- Optionally save the measurement to history
Supported geo: URI formats:
| Format | Example |
|---|---|
| Raw coordinates | geo:32.0853,34.7818 |
| Labeled place (0,0 sentinel) | geo:0,0?q=32.7940,34.9896(Haifa) |
| With parameters | geo:32.0853,34.7818;u=35 |
Testing with adb:
adb shell am start -a android.intent.action.VIEW -d "geo:32.0853,34.7818"
adb shell am start -a android.intent.action.VIEW -d "'geo:0,0?q=32.7940,34.9896(Haifa)'"| Component | Version |
|---|---|
| Kotlin | 2.3.10 (built-in via AGP 9) |
| Android Gradle Plugin | 9.3.0 |
| Gradle | 9.6.1 |
| Jetpack Compose BOM | 2026.06.01 |
| Room (KSP) | 2.8.4 |
| Navigation Compose | 2.9.8 |
| Play Services Location | 21.3.0 |
| Min SDK | 26 (Android 8.0) |
| Target SDK | 36 |
| JVM Target | 17 |
This project is licensed under the MIT License. See LICENSE for details.


