Setting Up The Android Mapillary App With An External GPS

There are a number of very capable, cheap Bluetooth GPS devices out there like this Garmin GLO which gets much better accuracy than a normal smartphone. Most of them work out-of-the-box with iOS, but on Android some setup steps are required to get them working.

The GLO GPS with a fix

I have been struggling to get this device to work transparently via the Android Location Provider APIs, but not figured out how to do it. However, a Mapillary fellow user provided the missing hints in this enhancement request - you need to use a bridge and mock location settings on your Android device!

So, here comes a small guide on how to get this working:

Install a Bluetooth-GPS bridge app

In order to understand the GPS receivers protocol and make it into the Android APIs, we need an app that can talk to the GPS, since there is no standard for this communication. A good choice here is Bluetooth GPS.


Enable "Mock providers" in your Android Developer settings

By tapping 7 times on the Build Number, you enable the Android Developer Options, needed for application debugging and other interesting things. Here, enable "Allow mock locations" in order to open the location provider APIs to external sources.


Pair the GPS with the phone

Read the manual for your GPS and pair it with your device. For my phone, and the GLO, this looks something like this:


Start the bridge app

Now, choose the GPS in the bridge app and make sure you have the "Enable Mock GPS Provider" checkbox clicked. This makes the locations accessible to any app - not only Mapillary - transparently through the normal Location APIs.


And now we can see the number of used satellites and accuracy in the app.


Check that it works

Now, I can see both in my developer logs and in the app that the reported accuracy is at 6m, giving me a green GPS icon in the app 1.5m from the window of my room (accuracy better than 7m is green, better than 15m is yellow).


Right now, we are not updating the used_satellite/seen_satellite/accuracy settings in the status bar, but this should get you going.

So, now with my GPS and the phone, the setup looks something like this:


Resulting in this sequence: