How to emulate GPS location in the Android Emulator?

AndroidTestingGeolocationAndroid EmulatorGps

Android Problem Overview


I want to get longitude and latitude in Android emulator for testing.

Can any one guide me how to achieve this?

How do I set the location of the emulator to a test position?

Android Solutions


Solution 1 - Android

You can connect to the Emulator via Telnet. You then have a Emulator console that lets you enter certain data like geo fixes, network etc.

How to use the console is extensively explained here. To connect to the console open a command line and type

telnet localhost 5554

You then can use the geo command to set a latitude, longitude and if needed altitude on the device that is passed to all programs using the gps location provider. See the link above for further instructions.

The specific command to run in the console is

geo fix <longitude value> <latitude value>

I found this site useful for finding a realistic lat/lng: http://itouchmap.com/latlong.html

If you need more then one coordinate you can use a kml file with a route as well it is a little bit described in this article. I can't find a better source at the moment.

Solution 2 - Android

No one here mentioned the built in solution of the emulator itself, so for future visitors, I'd like to share it with visuals.

First, run your Android Emulator and click on the menu button (3 dots) shown below:

emulator with menu button

Then from the left pane, select Location and change the coordinates according to your needs. After pressing Send button, changes will immediately take effect (I recommend you to open up Google Maps for better understanding).

enter image description here

Android Studio Version: 2.3.3

In addition, to make your different locations coming to your application in real time, you can use GPX file. It's very easy to create this file from Google Map direction link:

  1. Go to google map, choose a location, then press "Directions" and enter the second location.
  2. After route is created, copy a link from the browser
  3. Go to this website: https://mapstogpx.com and paste the link to "Let's Go" box
  4. Press the "Let's Go" button and GPX file will be downloaded

Use "Load GPS/KML" button to load the created file to your emulator, choose speed, and press green play button on the bottom. Locations will be sent in real time as shown on the picture below.

enter image description here

Solution 3 - Android

I was looking for a better way to set the emulator's GPS coordinates than using geo fix and manually determining the specific latitude and longitude coordinates.

Unable to find anything, I put together a little program that uses GWT and the Google Maps API to launch a browser-based map tool to set the GPS location in the emulator:

[android-gps-emulator][1]

Hopefully it can be of use to help others who will undoubtedly stumble across this difficulty/question as well.

[https://dpdearing.github.io/android-gps-emulator/img/android-gps-emulator-cropped.png" />][1]

[1]: https://github.com/dpdearing/android-gps-emulator "android-gps-emulator"

Solution 4 - Android

If you're using Eclipse, go to Window->Open Perspective->DDMS, then type one in Location Controls and hit Send.

Solution 5 - Android

For Android Studio users:

run the emulator,

Then, go to Tools -> Android ->Android device monitor

open the Emulator Control Tab, and use the location controls group.

Solution 6 - Android

Assuming you've got a mapview set up and running:

MapView mapView = (MapView) findViewById(R.id.mapview);
final MyLocationOverlay myLocation = new MyLocationOverlay(this, mapView);

mapView.getOverlays().add(myLocation);
myLocation.enableMyLocation();
		
myLocation.runOnFirstFix(new Runnable() {
    public void run() {
        GeoPoint pt = myLocation.getMyLocation();
    }
});

You'll need the following permission in your manifest:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

And to send mock coordinates to the emulator from Eclipse, Go to the "Window" menu, select "Show View" > "Other" > "Emulator control", and you can send coordinates from the emulator control pane that appears.

Solution 7 - Android

1. Android Studio users.

After running the emulator goto Tools->Android->Android device monitor

Click the Emulator Control Tab change from the location controls group.

2. Eclipse users.

First In Eclipse In Menu Select "Window" then Select "Open Perspective" then Select "DDMS". i.e Window->Open Prespective->DDMS.

You will see on Left Side Devices Panel and on Right Side you will see different tabs. Select "Emulator Control" Tab.

At bottom you will see Location Controls Panel. Select "Manual" Tab.

Enter Longitude and Latitude in Textboxs then Click Send Button. It will send the position to you emulator and the application.

3. Using telnet.

In the run command type this.

telnet localhost 5554

If you are not using windows you can use any telnet client.

After connecting with telnet use the following command to send your position to emulator.

geo fix long lat    
geo fix -121.45356 46.51119 4392

4. Use the browser based Google maps tool

There is a program that uses GWT and the Google Maps API to launch a browser-based map tool to set the GPS location in the emulator:

android-gps-emulator

Solution 8 - Android

For the new emulator:

http://developer.android.com/tools/devices/emulator.html#extended

Basically, click on the three dots button in the emulator controls (to the right of the emulator) and it will open up a menu which will allow you to control the emulator including location

Solution 9 - Android

Finally with the latest release of Android Studio 4 and his new Emulator update 10/23/2019 it become easier. Start your emulator and go to emulator parameters ... > in "Routes" tab you can choose two points on the map from/to and start a new route with an adjustable playback speed that can go to more than 1000km/h!

enter image description here

Solution 10 - Android

The following solution worked for me - open command line and write:

adb emu geo fix [longtitude] [latitude]

Solution 11 - Android

Using the "geo" command in the emulator console

To send mock location data from the command line:

  1. Launch your application in the Android emulator and open a terminal/console in your SDK's /tools directory.

  2. Connect to the emulator console:

    telnet localhost 5555 (Replace 5555 with whatever port your emulator is running on)

  3. Send the location data: * geo fix to send a fixed geo-location.

    This command accepts a longitude and latitude in decimal degrees, and an optional altitude in meters. For example:

     geo fix -121.45356 46.51119 4392
    

Solution 12 - Android

I wrote a python script to push gps locations to the emulator via telnet. It defines a source and a destination location. There is also a time offset which lets you control how long coordinates will be pushed to the device. One location is beeing pushed once a second.

In the example below the script moves from Berlin to Hamburg in 120 seconds. One step/gps location per second with random distances.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random

HOST = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120

LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2

DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1

lat = LAT_SRC
lng = LNG_SRC

tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)

tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")

for i in range(SECONDS):
    lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
    lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG
    
    #tn.read_until("OK", 5)
    tn.write("geo fix {0} {1}\n".format(lng, lat))
    #tn.write("exit\n")
    sleep(1)

tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")

print tn.read_all()

Solution 13 - Android

In Mac, Linux or Cygwin:

echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554

That will put you in Mexico City. Change your longitude/latitude/altitude accordingly. That should be enough if you are not interested in nmea.

Solution 14 - Android

Sorry for the NecroPost, but after following some of the suggestions on this question, I set my location to Alaska. However, my device was still showing to be in Mountain View, California (Google's HQ?). So here's how I did a fix:

1) Go to the location settings:

enter image description here

2) Set your test location. I chose Alaska.

enter image description here

3) Google "My current location" and click on the map circled in the picture. Note that even though I set location as Alaska, my Virtual Device still thinks it's in Mountain View, California.

enter image description here

4) Click on this location Icon Your location should now be updated on your device. You can verify by Googling "My current location" again.

enter image description here

If anyone experienced this same issue, I hope my solution helped you.

Solution 15 - Android

I use eclipse plug DDMS function to send GPS. enter image description here

Solution 16 - Android

In Linux where communication ports are blocked. navigate the terminal to platform-tools folder inside android sdk and fire this command:

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}

Solution 17 - Android

See Obtaining User Location

Look under Providing Mock Location Data. You will find the solution for it.

Solution 18 - Android

First go in DDMS section in your eclipse Than open emulator Control .... Go To Manual Section set lat and long and then press Send Button

Solution 19 - Android

I was trying to set the geo fix through adb for many points and could not get my app to see any GPS data. But when I tried opening DDMS, selecting my app's process and sending coordinates through the emulator control tab it worked right away.

Solution 20 - Android

Dalvik Debug Monitor > Select Emulator > Emulator Control Tab > Location Controls.

DDMS -- android_sdk/tools/ddms OR android_sdk/tools/monitor

Solution 21 - Android

If you are using eclipse then using Emulator controller you can manually set latitude and longitude and run your map based app in emulator

Solution 22 - Android

If you're using Android Studio (1.3):

  • Click on Menu "Tools"
  • "Android"
  • "Android device monitor"
  • click on your current Emulator
  • Tab "Emulator Control"
  • go to "Location Controls" and enter Lat and Lon

Solution 23 - Android

Just make Alberto Gaona's answer into one line

token=$(cat ~/.emulator_console_auth_token); cat <(echo -e "auth $token \n  geo fix 96.0290791 16.9041016  \n exit") - | nc localhost 5554

5554 is the emulator port number shown in adb devices.

It would have been better if adb emu work.

Solution 24 - Android

If the above solutions don't work. Try this:

Inside your android Manifest.xml, add the following two links OUTSIDE of the application tag, but inside your manifest tag of course

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>

Solution 25 - Android

I was unable to get a GPS fix on the emulator when emulator was running Android image without Google APIs. As soon as I changed the image to contain Google APIs all of the here mentioned ways to get a GPS fix worked.

Make sure you select an image with Google APIs when creating AVD.

Solution 26 - Android

The already mentioned multiple times answer to use the shell command "geo fix..." is the correct answer. But in case you use LocationClient.getLastLocation() to retrieve your data it is worth to mention that it will not work at first. The LocationClient class uses the Google Play Service to retrieve the coordinates. For me this started working after running the emulators maps app once. During the first start you are asked to allow google apps access to your location, which I guess does the trick.

Solution 27 - Android

For a project of my own, I developed an online service which can provide simulated location to the Android emulator.

It uses geo nmea rather than geo fix which allows it to set speed, course, precise time etc. in addition to just lat/lon.

The service requires the nc (netcat) command line utility and nothing else.

http://www.kisstech.ch/nmea/

Solution 28 - Android

You can use an emulator like genymotion which gives you the flexibility to emulate your present GPS location, etc.

Solution 29 - Android

There is a plugin for Android Studio called “Mock Location Plugin”. You can emulate multiple points with this plugin. You can find a detailed manual of use in this link: Android Studio. Simulate multiple GPS points with Mock Location Plugin

Solution 30 - Android

Can't comment yet, so updating @ectomorphs answer here, which when telneting now requires to have an auth token. In linux that's under /home/username/.emulator_console_auth_token

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random

FILE = open('/home/username/.emulator_console_auth_token', 'r')
AUTH_TOKEN = FILE.read()
FILE.close()

HOST = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120

LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2

DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1

lat = LAT_SRC
lng = LNG_SRC

tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)

tn.write("auth {0}\n".format(AUTH_TOKEN))
tn.read_until("OK", 5)

tn.read_until("OK", 5)

tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")

for i in range(SECONDS):
    lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
    lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG

    #tn.read_until("OK", 5)
    tn.write("geo fix {0} {1}\n".format(lng, lat))
    #tn.write("exit\n")
    sleep(1)

tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")

print tn.read_all()

From a shell script one can set the coorinate like so

#!/usr/bin/env bash
export ATOKEN=`cat ~/.emulator_console_auth_token`
echo -ne "auth $ATOKEN\ngeo fix -99.133333 19.43333 2202\n"  | nc localhost 5554

Solution 31 - Android

Open Android studio->Tools menu->Android-> Android Device Monitor->Emulator Tab->Location control-> Set your required latitude and longitude and check your project as per your need

Solution 32 - Android

Go to Extended controls in emulate. After You can then set the location for the emulate by searching or dragging the map to the location you want to set.

location

Finally Click on SET LOCATION button to save.

Solution 33 - Android

In eclipse:

You may have to drag the DDMS window down. 'Location Controls' is located under 'Telephony Actions' and may be hidden by a normally sized console view ( the bar with console, LogCat etc may be covering it!)

~

Solution 34 - Android

I have made a little script similar to one of the previous answers, but using expect instead of python - because it is a bit simpler (expect was invented for this).

#!/usr/bin/expect

set port [lindex $argv 0]
set lon [lindex $argv 1]
set lat [lindex $argv 2]

set timeout 1
spawn telnet localhost $port
expect_after eof { exit 0 }

## interact
expect OK

set fp [open "~/.emulator_console_auth_token" r]
if {[gets $fp line] != -1} {
  send "auth $line\r"
}

send "geo fix $lon $lat\r"
expect OK
send "exit\r"

Exemple usage: sendloc 5554 2.35607 48.8263

Solution 35 - Android

I had the same problem on Android studio 3.5.1 When I clicked on three dots to the right of android emulator and selected location tab, I dont see a send option. I tried to set a location point but that did not change my default cupertino location. Open google maps and it will autolocate you and your cupertino location will change.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionUMAR-MOBITSOLUTIONSView Question on Stackoverflow
Solution 1 - AndroidJanuszView Answer on Stackoverflow
Solution 2 - AndroidedenView Answer on Stackoverflow
Solution 3 - AndroiddpdearingView Answer on Stackoverflow
Solution 4 - AndroidSteveCavView Answer on Stackoverflow
Solution 5 - AndroidoferView Answer on Stackoverflow
Solution 6 - AndroidDavid HedlundView Answer on Stackoverflow
Solution 7 - AndroidMuhammad Yousaf SulahriaView Answer on Stackoverflow
Solution 8 - Androidf.khantsisView Answer on Stackoverflow
Solution 9 - AndroidSmile2LifeView Answer on Stackoverflow
Solution 10 - AndroidAsaf PinhassiView Answer on Stackoverflow
Solution 11 - AndroidDan ZhaoView Answer on Stackoverflow
Solution 12 - Androiduser937284View Answer on Stackoverflow
Solution 13 - AndroidAlberto GaonaView Answer on Stackoverflow
Solution 14 - AndroidTimView Answer on Stackoverflow
Solution 15 - AndroidboiledwaterView Answer on Stackoverflow
Solution 16 - Androidabhishek singhView Answer on Stackoverflow
Solution 17 - Androiddaemon54View Answer on Stackoverflow
Solution 18 - Androidsachin pareekView Answer on Stackoverflow
Solution 19 - AndroidJamesView Answer on Stackoverflow
Solution 20 - AndroidDanView Answer on Stackoverflow
Solution 21 - AndroidSwapnilView Answer on Stackoverflow
Solution 22 - AndroidelectrobabeView Answer on Stackoverflow
Solution 23 - AndroidKyaw TunView Answer on Stackoverflow
Solution 24 - AndroidssgaoView Answer on Stackoverflow
Solution 25 - AndroiddvimView Answer on Stackoverflow
Solution 26 - AndroidMaikView Answer on Stackoverflow
Solution 27 - AndroidGerhard WespView Answer on Stackoverflow
Solution 28 - AndroidNeil BView Answer on Stackoverflow
Solution 29 - AndroidJesús AmieiroView Answer on Stackoverflow
Solution 30 - AndroiddraekkoView Answer on Stackoverflow
Solution 31 - AndroidPremkumar ManipillaiView Answer on Stackoverflow
Solution 32 - AndroidVieclam24hNetVnView Answer on Stackoverflow
Solution 33 - AndroidDroid TeahouseView Answer on Stackoverflow
Solution 34 - AndroidBoDView Answer on Stackoverflow
Solution 35 - AndroidAseemView Answer on Stackoverflow