Android mock lokalizacja na urządzeniu?

Jak mogę wyśmiewać swoją lokalizację na fizycznym urządzeniu (Nexus One)? Wiem, że możesz to zrobić za pomocą emulatora w Panelu sterowania emulatora, ale to nie działa na fizyczne urządzenie.

Author: Isaac Waller, 2010-03-28

19 answers

Wydaje się, że jedynym sposobem jest użycie dostawcy lokalizacji.

Musisz włączyć w ustawieniach w panelu deweloperskim opcję mock locations i dodać

   <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
Do manifestu.

Teraz możesz wprowadzić swój kod i utworzyć własnego dostawcę lokalizacji i ustawić lokalizację tego dostawcy.

 157
Author: Janusz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 14:55:22

Jeśli używasz tego telefonu tylko w development lab, istnieje szansa, że możesz lutować układ GPS i podawać port szeregowy bezpośrednio sekwencjami NMEA z innego urządzenia.

 97
Author: tomash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-05 20:11:00

Chciałbym mieć pod ręką Kabel. Wiem, że możesz telnet do emulatora, aby zmienić jego lokalizację

$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK

Nie pamiętam, czy można telnet do urządzenia, ale myślę, że można. Mam nadzieję, że to pomoże.

Będziesz potrzebował adb (android debugging bridge) do tego (CLI).

 32
Author: Tim Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-19 12:17:29

Możesz użyć uprawnienia Usługi lokalizacji, aby naśladować lokalizację...

"android.permission.ACCESS_MOCK_LOCATION"

A następnie w Twoim kodzie java,

// Set location by setting the latitude, longitude and may be the altitude...
String[] MockLoc = str.split(",");
Location location = new Location(mocLocationProvider);            
Double lat = Double.valueOf(MockLoc[0]);
location.setLatitude(lat);
Double longi = Double.valueOf(MockLoc[1]);
location.setLongitude(longi);
Double alti = Double.valueOf(MockLoc[2]);
location.setAltitude(alti);
 28
Author: Vishwanath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 13:31:45

Odniosłem sukces z poniższym kodem. Chociaż z jakiegoś powodu dostałem pojedynczy zamek (nawet jeśli próbowałem różnych par LatLng), zadziałało dla mnie. mLocationManager jest LocationManager, który jest połączony z LocationListener:

private void getMockLocation()
{
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    mLocationManager.addTestProvider
    (
      LocationManager.GPS_PROVIDER,
      "requiresNetwork" == "",
      "requiresSatellite" == "",
      "requiresCell" == "",
      "hasMonetaryCost" == "",
      "supportsAltitude" == "",
      "supportsSpeed" == "",
      "supportsBearing" == "",

      android.location.Criteria.POWER_LOW,
      android.location.Criteria.ACCURACY_FINE
    );      

    Location newLocation = new Location(LocationManager.GPS_PROVIDER);

    newLocation.setLatitude (/* TODO: Set Some Lat */);
    newLocation.setLongitude(/* TODO: Set Some Lng */);

    newLocation.setAccuracy(500);

    mLocationManager.setTestProviderEnabled
    (
      LocationManager.GPS_PROVIDER, 
      true
    );

    mLocationManager.setTestProviderStatus
    (
       LocationManager.GPS_PROVIDER,
       LocationProvider.AVAILABLE,
       null,
       System.currentTimeMillis()
    );      

    mLocationManager.setTestProviderLocation
    (
      LocationManager.GPS_PROVIDER, 
      newLocation
    );      
}
 24
Author: Dr1Ku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 13:37:57

To co Dr1Ku zamieścił działa. Używałem kodu dzisiaj, ale musiałem dodać więcej Loc. Oto kilka ulepszeń:

Opcjonalne: zamiast używać Menedżera lokalizacji.Gps_provider String, możesz zdefiniować własną nazwę dostawcy constat i użyć jej. Podczas rejestracji w celu aktualizacji lokalizacji wybierz dostawcę za pomocą kryteriów, zamiast bezpośrednio określać go jako ciąg znaków.

First: zamiast wywoływać removeTestProvider, najpierw sprawdź, czy istnieje dostawca do usunięcia (aby uniknąć "IllegalArgumentException"): {]}

if (mLocationManager.getProvider(PROVIDER_NAME) != null) {
  mLocationManager.removeTestProvider(PROVIDER_NAME);
}

Po drugie: aby opublikować więcej niż jedną lokalizację, musisz ustawić czas dla lokalizacji:

newLocation.setTime(System.currentTimeMillis());
...
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);

Wydaje się też, że istnieje google Test, który używa MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Kolejny dobry przykład pracy można znaleźć na: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

Kolejny dobry artykuł to: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Znajdziesz też jakiś kod, który faktycznie działa dla mnie na emulatorze.

 14
Author: icyerasor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 08:53:42

W Android Market dostępne są aplikacje, które pozwalają określić "pozorną lokalizację GPS" dla urządzenia.

Szukałem https://market.android.com i znalazłem aplikację o nazwie "Moja fałszywa lokalizacja", która działa dla mnie.

The Mock GPS Provider wspomniany przez Pawła powyżej (at http://www.cowlumbus.nl/forum/MockGpsProvider.zip) to kolejny przykład, który zawiera kod źródłowy - chociaż nie byłem w stanie zainstalować dostarczonego APK (mówi, że awaria [INSTALL_FAILED_OLDER_SDK] i może po prostu trzeba przekompilować)

Aby korzystać z makiet lokalizacji GPS należy włączyć je w ustawieniach urządzenia. Przejdź do Ustawienia -> Aplikacje - > Rozwój i zaznacz "Zezwól na przykładowe lokalizacje"

Możesz następnie użyć aplikacji, takiej jak te opisane powyżej, aby ustawić współrzędne GPS, a Mapy Google i inne aplikacje będą używać podanej przez Ciebie lokalizacji GPS.

 8
Author: fijiaaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 22:49:40

To działało dla mnie (Android Studio):

Wyłącz śledzenie GPS i WiFi w telefonie. W systemie Android 5.1.1 i poniżej wybierz opcję "Włącz lokalizacje makiety" w opcjach programisty.

Zrób kopię manifestu w katalogu src / debug. Dodaj do niego (poza znacznikiem "application"):

Używa-permission android: name= " android.pozwolenie.ACCESS_MOCK_LOCATION "

Ustaw Fragment mapy o nazwie "Mapa". Dołącz poniższy kod w onCreate (): {]}

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
if (lm.getProvider("Test") == null) {
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1);
}
lm.setTestProviderEnabled("Test", true);
lm.requestLocationUpdates("Test", 0, 0, ll);

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng l) {
        Location loc = new Location("Test");
        loc.setLatitude(l.latitude);
        loc.setLongitude(l.longitude);
        loc.setAltitude(0); 
        loc.setAccuracy(10f);
        loc.setElapsedRealtimeNanos(System.nanoTime());
        loc.setTime(System.currentTimeMillis()); 
        lm.setTestProviderLocation("Test", loc);
    }
};

Zauważ, że może być konieczne tymczasowe zwiększenie "minSdkVersion" w pliku gradle modułu do 17, aby użyć metody "setElapsedRealtimeNanos".

Dołącz następujący kod wewnątrz głównej klasy aktywności:

private class MyLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // do whatever you want, scroll the map, etc.
    }
}

Uruchom aplikację z AS. Na Androidzie 6.0 i nowszym otrzymasz wyjątek bezpieczeństwa. Teraz przejdź do opcji programisty w ustawieniach i wybierz "Select mock location app". Wybierz aplikację z listy.

Teraz, gdy stukniesz w Mapa, onLocationChanged() uruchomi się ze współrzędnymi twojego kranu.

Rozgryzłem to, więc teraz nie muszę włóczyć się po okolicy z telefonami w ręku.

 8
Author: Chris B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-01 03:42:40

Stworzyłem prosty Handler symulujący poruszającą się pozycję z pozycji początkowej.

Uruchom go w połączeniu callback:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
    @Override
    public void onConnected(Bundle bundle) {
        if (BuildConfig.USE_MOCK_LOCATION) {
            LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
            new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }
};

Klasa obsługi:

   private static class MockLocationMovingHandler extends Handler {

    private final static int SET_MOCK_LOCATION = 0x000001;
    private final static double STEP_LATITUDE =  -0.00005;
    private final static double STEP_LONGITUDE = 0.00002;
    private final static long FREQUENCY_MS = 1000;
    private GoogleApiClient mGoogleApiClient;
    private double mLatitude;
    private double mLongitude;

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) {
        super(Looper.getMainLooper());
        mGoogleApiClient = googleApiClient;
    }

    public void start(final double initLatitude, final double initLongitude) {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
        mLatitude = initLatitude;
        mLongitude = initLongitude;
        sendEmptyMessage(SET_MOCK_LOCATION);
    }

    public void stop() {
        if (hasMessages(SET_MOCK_LOCATION)) {
            removeMessages(SET_MOCK_LOCATION);
        }
    }

    @Override
    public void handleMessage(Message message) {
        switch (message.what) {
            case SET_MOCK_LOCATION:
                Location location = new Location("network");
                location.setLatitude(mLatitude);
                location.setLongitude(mLongitude);
                location.setTime(System.currentTimeMillis());
                location.setAccuracy(3.0f);
                location.setElapsedRealtimeNanos(System.nanoTime());
                LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);

                mLatitude += STEP_LATITUDE;
                mLongitude += STEP_LONGITUDE;
                sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS);
                break;
        }
    }
}
Mam nadzieję, że to pomoże..
 7
Author: smora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-11 14:06:17

Rozwiązanie wspomniane przez Icyerasora i dostarczone przez Pedro na http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock / zadziałało bardzo dobrze dla mnie. Jednak nie oferuje wsparcia dla prawidłowego uruchamiania, zatrzymywania i ponownego uruchamiania pozornego dostawcy GPS.

Zmieniłem trochę jego kod i przepisałem klasę jako AsyncTask zamiast wątku. Pozwala nam to komunikować się z wątkiem UI, dzięki czemu możemy ponownie uruchomić dostawcę w miejscu, w którym byliśmy kiedy to zatrzymaliśmy. Jest to przydatne, gdy zmienia się orientacja ekranu.

Kod, wraz z przykładowym projektem dla Eclipse, można znaleźć na Githubie: https://github.com/paulhoux/Android-MockProviderGPS

Wszystkie zasługi powinny iść do Pedro za większość ciężkiej pracy.

 6
Author: Paul Houx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-06 13:56:21

Fałszywy GPS aplikacja z Google play zrobił sztuczkę dla mnie. Po prostu upewnij się, że przeczytałeś wszystkie wskazówki w opisie aplikacji. Musisz wyłączyć inne usługi lokalizacyjne, a także uruchomić aplikację po włączeniu "fałszywego GPS". Zadziałało świetnie na to, czego potrzebowałem.

Oto link do aplikacji na GooglePlay: Fałszywy GPS

 3
Author: Igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 19:46:24

Samouczek Google do tego można znaleźć tutaj, zawiera przykłady kodu i wyjaśnia proces.

Http://developer.android.com/training/location/location-testing.html#SendMockLocations

 2
Author: Nik Pardoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 20:38:41

Jeśli Twoje urządzenie jest podłączone do komputera i próbujesz zmienić wyślij przewody GPS za pomocą sterowania emulatora, to nie będzie działać.
Jest to sterowanie emulatorem nie bez powodu.
Po prostu skonfiguruj go, aby zaktualizować zmiany GPS.

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);  

    ll = new LocationListener() {        
        public void onLocationChanged(Location location) {  
          // Called when a new location is found by the network location provider.  
            onGPSLocationChanged(location); 
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {       
            bigInfo.setText("Changed "+ status);  
        }

        public void onProviderEnabled(String provider) {
            bigInfo.setText("Enabled "+ provider);
        }

        public void onProviderDisabled(String provider) {
            bigInfo.setText("Disabled "+ provider);
        }
      };

Gdy GPS jest aktualizowany przepisz następującą metodę, aby zrobić to, co chcesz;

public void onGPSLocationChanged(Location location){  
if(location != null){  
    double pLong = location.getLongitude();  
    double pLat = location.getLatitude();  
    textLat.setText(Double.toString(pLat));  
    textLong.setText(Double.toString(pLong));  
    if(autoSave){  
        saveGPS();  
        }
    }
}
Nie zapomnij umieścić ich w manifeście.]} android.pozwolenie.ACCESS_FINE_LOCATION
android.pozwolenie.ACCESS_MOCK_LOCATION
 1
Author: Shadoath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 13:30:56

Może nie jest to podejście "programistyczne" , ale jeśli chcesz zaoszczędzić czas i uzyskać rozwiązanie pracy natychmiast wypróbuj jedną z aplikacji, które są dedykowane do mock lokalizacji dostępne w Google Play:

Fałszywy Spoofer lokalizacji GPS

Mock Locations

Fałszywa lokalizacja GPS

 1
Author: klimat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 08:26:27

Zainstaluj Sztuczna aplikacja GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en

Opcje dla programistów -> Wybierz aplikację lokalizacji pozorowanej (wybrano aplikację lokalizacji fałszywej).

Fałszywy GPS app :

Podwójna zakładka na mapie, aby dodać - > kliknij przycisk Odtwórz - > Pokaż toast "fałszywa lokalizacja zatrzymana"

Wreszcie sprawdzić z Google map apps.

 1
Author: Manikandan K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-25 13:20:03

Zastanawiam się, czy potrzebujesz rozbudowanej konfiguracji lokalizacji. W moim przypadku, gdy dostałem poprawną lokalizację, wołałem funkcję, aby zrobić coś z tą nową lokalizacją. W timerze Utwórz przykładową lokalizację. I zamiast tego wywołaj funkcję z tą lokalizacją. Wiedząc przez cały czas, że w krótkim czasie GPS wymyśli prawdziwą aktualną lokalizację. Co jest OK. Jeśli masz wystarczająco długi czas aktualizacji.

 0
Author: yalcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 07:18:20

Napisałem aplikację, która uruchamia serwer WWW (REST-Like) na telefonie z Androidem, dzięki czemu można ustawić pozycję GPS zdalnie . Strona zawiera mapę, na której można kliknąć, aby ustawić nową pozycję, lub użyć klawiszy "wasd", aby poruszać się w dowolnym kierunku. Aplikacja była szybkim rozwiązaniem, więc nie ma prawie żadnego interfejsu ani Dokumentacji, ale implementacja jest prosta i można sprawdzić wszystko w (tylko cztery) klasy.

Repozytorium projektów: https://github.com/juliusmh/RemoteGeoFix

 0
Author: juliusmh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-05 16:51:40

Skorzystaj z bardzo wygodnego i darmowego interaktywnego symulatora lokalizacji dla telefonów i tabletów z Androidem (o nazwie CATLES). Facebook) i działa zarówno na urządzeniach fizycznych, jak i wirtualnych:

Strona WWW: http://ubicom.snet.tu-berlin.de/catles/index.html

Video: https://www.youtube.com/watch?v=0WSwH5gK7yg

 0
Author: Sandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 10:57:06

Użyj tego uprawnienia w pliku manifestu

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

Android studio zaleca, aby "Lokalizacja makiety powinna być wymagana tylko w pliku manifestu testowego lub debugującego (zazwyczaj src/debug/AndroidManifest.xml)" po prostu wyłącz inspekcję

Teraz upewnij się, że zaznaczono "Zezwalaj na lokalizacje makiety" w ustawieniu deweloperskim telefonu

Użyj LocationManager

locationManager.addTestProvider(mocLocationProvider, false, false,
                false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

Teraz ustaw lokalizację gdziekolwiek chcesz

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 
 0
Author: Nirmal prajapat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 22:47:42