Pozorowana lokalizacja Androida na urządzeniu?

147

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

Isaac Waller
źródło
W przypadku komputerów stacjonarnych można utworzyć / zainstalować sterowniki, które emulują urządzenie GPS / urządzenie portu szeregowego w celu przeprowadzenia tego rodzaju testów. Być może mógłbyś stworzyć lub znaleźć coś podobnego dla Androida.
AaronLS
6
W Market jest kilka aplikacji, które mogą emulować lokalizację GPS. Na przykład „Location spoofer”.
Vlad,
W sklepie jest wiele aplikacji, które to robią. Możesz spróbować tego - play.google.com/store/apps/ ... lub tego - play.google.com/store/apps/ ...
Yehuda
1
W sklepie jest również aplikacja, która obsługuje polecenia „geo fix” i „geo nmea”, podobnie jak emulator! play.google.com/store/apps/…
luv
@Iuv more over it is open source github.com/luv/mockgeofix
Vlad

Odpowiedzi:

166

Wydaje się, że jedynym sposobem jest skorzystanie z pozorowanego dostawcy lokalizacji.

Musisz włączyć pozorowane lokalizacje w panelu deweloperskim w swoich ustawieniach i dodać

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

do manifestu.

Teraz możesz przejść do kodu i utworzyć własnego dostawcę pozorowanej lokalizacji i ustawić lokalizację tego dostawcy.

Janusz
źródło
83
Na rynku istnieje aplikacja o nazwie „Fake GPS”. Jeśli włączysz Mock Locations na swoim urządzeniu, oferuje ładny graficzny interfejs użytkownika do ustawiania Twojej lokalizacji. Zdaję sobie sprawę, że to nie jest rozwiązanie do samodzielnego wykonania, ale z pewnością godne rozwiązanie do szybkiego testowania.
Tim Green,
2
może to być link - ta sama data i odpowiednia treść.
DefenestrationDay
4
@TimGreen twoja powinna być akceptowaną odpowiedzią (nie tylko komentarzem)! Zdecydowanie najłatwiejszy sposób na przetestowanie
Bostone
W rzeczywistości aplikacja „fałszywy GPS” nie jest najlepsza, ponieważ może tylko ustawiać lokalizacje i losowo się poruszać. Ich nowa wersja może wyznaczać trasy, ale tylko iteruje po punktach trasy, tak więc ogromne skoki w lokacji. Odpowiedź Janusza jest rzeczywiście prawidłowa, że ​​musisz stworzyć własnego próbnego dostawcę. Niedawno to zrobiliśmy i jeśli ktoś tego potrzebuje lub jeśli to pytanie nadal potrzebuje pomocy, wyślę kod.
vkinra
5
Stwierdzenie „wprowadź swój kod i utwórz własny pozorowany dostawca lokalizacji” powinno zostać wyjaśnione bardziej szczegółowo.
Przyciemnia
102

Jeśli używasz tego telefonu tylko w laboratorium programistycznym, istnieje szansa, że ​​możesz odlutować chip GPS i zasilić port szeregowy bezpośrednio sekwencjami NMEA z innego urządzenia.

tłuc
źródło
68
Dlaczego hejterzy? Ta odpowiedź jest niesamowicie twarda.
Ben Zotto
61
Niesamowicie hardcore, chociaż niesamowicie bezużyteczny / nieistotny.
olivervbk
13
Ale wystarczająco zabawne.
etienne
23
hm, myślę, że każdy, dla kogo ta odpowiedź byłaby istotna, już wie, że może to zrobić. Wątpię, by te trzy osoby szukały rozwiązania w przepełnieniu stosu.
ToolmakerSteve
10
Jeśli masz problem ze zrozumieniem, jak wygenerować realistyczne sekwencje NMEA w swoim nielutowanym urządzeniu, jest świetna opcja: przylutuj tam rzeczywiste zewnętrzne urządzenie GPS i przenieś całe laboratorium programistyczne na rzeczywisty tor, na szczycie zespołu biegaczy / motocyklistów / samochody / samoloty / cokolwiek w zależności od prędkości, którą chcesz symulować. Nie zapomnij otworzyć dziury w dachu laboratorium projektowego, aby urządzenie mogło odbierać sygnały radiowe z satelitów. Nie ma za co. ;-)
Stéphane Gourichon
32

Żałuję, że nie mam pod ręką kabla. Wiem, że możesz telnetować się 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żesz telnetować się na swoje urządzenie, ale myślę, że możesz. Mam nadzieję, że to pomoże.

Będziesz potrzebował adb (mostek do debugowania Androida) do tego (CLI).

Tim Green
źródło
otrzymujesz odmowę pozwolenia na wszystko, co wysyłasz jako polecenie do konsoli urządzenia. Może jest to możliwe z aplikacją terminalową, ale myślę, że wymaga to dostępu roota
Janusz
Więc jesteśmy na tej samej stronie: nie mówisz o „powłoce adb”, prawda? To, o czym mówię, jest inne, jest to konfiguracja, która pozwala ustawić parametry specyficzne dla Androida. Wiem, na przykład, możesz ustawić przekierowanie portów (np. Localhost: 1234 idzie na telefon: 1234) bez dostępu do roota, więc możesz skonfigurować serwer proxy SOCKS i tunel przez kabel bez rootowania.
Tim Green
Możesz użyć adb forward tcp: 6000 tcp: 23, aby przekazać port 6000 na twoim komputerze do portu 23 w urządzeniu, ale nie mogłem się połączyć, nawet jeśli port jest pokazany jako otwarty. Użycie klienta telnet na urządzeniu i połączenie z localhost również się nie udaje
Janusz
15
Działa to dobrze w przypadku emulatora, ale nie działa na rzeczywistym urządzeniu. Więc w ogóle nie odpowiada na pytanie OP :(
Matthew Gilliard
4
@TimGreen Twoje rozwiązanie jest tylko dla emulatora. Pytanie dotyczyło prawdziwego urządzenia.
Igor Ganapolsky
29

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

"android.permission.ACCESS_MOCK_LOCATION"

a następnie w 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);
Vishwanath
źródło
9
jaka jest wartość funkcji mocLocationProvider?
Victor
np. LocationManager.GPS_PROVIDER
enigma969
25

Odniosłem sukces z następującym kodem. Chociaż z jakiegoś powodu dostałem pojedynczy zamek (nawet jeśli wypróbowałem różne pary LatLng), zadziałał dla mnie. mLocationManagerjest połączeniem LocationManagerz 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
    );      
}
Dr1Ku
źródło
1
Fajny post, zobacz moją odpowiedź poniżej na dodatki.
icyerasor
O ile pamiętam, setTestProviderStatussłuży tutaj do powiadamiania / wysyłania / planowania zdarzenia za pomocą LocationManagera, że ​​dostawca GPS znalazł poprawkę „teraz”, aby przetwarzanie wspomnianego zdarzenia mogło nastąpić.
Dr1Ku
Jakie jest znaczenie sformułowania „ mLocationManagerjest to, LocationManagerktóre jest podłączone do LocationListener”? w jaki sposób mogę to zrobić? Dziękuję ..
Yehuda
Oto jeden artykuł wyjaśniający, jak sprawdzić zmianę lokalizacji za pomocą LocationManagerusługi i LocationListener: blog.doityourselfandroid.com/2010/12/25/...
Dr1Ku
2
plus 1 za sposób, w jaki przedstawiłeś prawdę (a) i fałsz (y) w metodzie addTestProvider
A.Alqadomi
16

To, co opublikował Dr1Ku, działa. Użyłem kodu dzisiaj, ale musiałem dodać więcej lokalizacji. Oto kilka ulepszeń:

Opcjonalnie: zamiast używać ciągu LocationManager.GPS_PROVIDER, możesz zdefiniować własną stałą PROVIDER_NAME i używać jej. Podczas rejestrowania się w celu uzyskania aktualizacji lokalizacji wybierz dostawcę za pomocą kryteriów zamiast bezpośrednio określać go jako ciąg.

Po pierwsze: 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ę również, że istnieje test Google, który korzysta z MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Inny dobry działający przykład można znaleźć pod adresem : 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 także kod, który faktycznie działa ja na emulatorze.

lodowaty
źródło
Fajna sugestia dotycząca zdefiniowania własnego dostawcy, rzecz z użyciem GPS_PROVIDER polega na tym, że (najwyraźniej) nie możesz pozbyć się fałszywego dostawcy (a dokładniej, nie możesz przełączyć się na normalny GPS) przed ponownym uruchomieniem. Świetny post, sprawdzę referencje!
Dr1Ku
@ Dr1KU Czy nadal nie można przełączyć się z powrotem na normalny GPS? Czy jest to gdzieś określone?
Kaz Dragon
@KazDragon Tak było wtedy. Z tego co pamiętam, po włączeniu Mock Providernormalny GPS nie działał, nie mogłem znaleźć poprawki (testowałem bezpośrednio na urządzeniu). Może tak nie być, ponieważ od tego czasu wiele wydarzyło się w Androidzie.
Dr1Ku
@ Dr1Ku Ach, cóż, robię teraz coś bardzo podobnego i otrzymuję wyniki podobne do tych, które opisałeś. Miałem nadzieję, że dowiem się, czy jest to ograniczenie wbudowane w platformę, czy po prostu gdzieś brakuje mi wywołania funkcji. Powinienem chyba zadać pytanie.
Kaz Dragon
9

W Android Market dostępne są aplikacje, które umożliwiają określenie „pozorowanej lokalizacji GPS” dla urządzenia.

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

Mock GPS Provider wspomniany powyżej przez Paula (pod adresem http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) to kolejny przykład zawierający kod źródłowy - chociaż nie byłem w stanie zainstalować dostarczonego APK (mówi [INSTALL_FAILED_OLDER_SDK] i może wymagać ponownej kompilacji)

Aby korzystać z pozorowanych lokalizacji GPS, musisz włączyć je w ustawieniach urządzenia. Przejdź do Ustawienia -> Aplikacje -> Programowanie i zaznacz „Zezwalaj na pozorowane lokalizacje”

Następnie możesz 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ć określonej przez Ciebie pozorowanej lokalizacji GPS.

fijiaaron
źródło
Fałszywy GPS jest prostszy. Zastanawiam się tylko, dlaczego proszą o podanie identyfikatora dzwoniącego w pozwoleniu aplikacji: S
Guillaume Massé
8

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

Wyłącz śledzenie GPS i WiFi w telefonie. W Androidzie 5.1.1 i starszych wybierz „Włącz pozorowane lokalizacje” w Opcjach programisty.

Utwórz kopię swojego manifestu w katalogu src / debug. Dodaj do niego następujące elementy (poza tagiem „aplikacja”):

używa uprawnień android: name = "android.permission.ACCESS_MOCK_LOCATION"

Skonfiguruj fragment mapy o nazwie „mapa”. Uwzględnij następujący 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”.

Uwzględnij następujący kod w głównej klasie aktywności:

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

Uruchom swoją aplikację z AS. W systemie Android 6.0 i nowszych otrzymasz wyjątek bezpieczeństwa. Teraz przejdź do opcji programisty w Ustawieniach i wybierz „Wybierz pozorowaną aplikację lokalizacyjną”. Wybierz swoją aplikację z listy.

Teraz, kiedy dotkniesz mapy, onLocationChanged () uruchomi się ze współrzędnymi twojego kranu.

Właśnie to rozgryzłem, więc teraz nie muszę włóczyć się po okolicy z telefonami w dłoni.

Chris B.
źródło
Myślę, że to działa na Androidzie 6, jeśli uruchomisz ten kod
Hamza
7

Stworzyłem prostego Handler'a symulującego ruchome położenie z pozycji początkowej.

Uruchom go w wywołaniu zwrotnym połączenia:

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 Handler:

   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 ...

smora
źródło
6

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

Zmieniłem nieco jego kod i przepisałem klasę na AsyncTask zamiast Thread. To pozwala nam komunikować się z wątkiem interfejsu użytkownika, dzięki czemu możemy ponownie uruchomić dostawcę w punkcie, w którym byliśmy, gdy go zatrzymaliśmy. Jest to przydatne, gdy zmienia się orientacja ekranu.

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

Wszelkie uznanie należy się Pedro za wykonanie większości ciężkiej pracy.

Paul Houx
źródło
6

Dodaj do swojego manifestu

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />

Funkcja pozorowania lokalizacji

void setMockLocation() {
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
            false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
    mockLocation.setLatitude(-33.852);  // Sydney
    mockLocation.setLongitude(151.211);
    mockLocation.setAltitude(10);
    mockLocation.setAccuracy(5);
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setElapsedRealtimeNanos(System.nanoTime());
    locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}

Musisz także włączyć pozorowane lokalizacje w ustawieniach programisty urządzeń. Jeśli to nie jest dostępne, ustaw „pozorowaną aplikację lokalizacji” na swoją aplikację po wdrożeniu powyższego.

Ian M.
źródło
3

Fałszywa aplikacja GPS z Google Play załatwiła mi sprawę. Po prostu przeczytaj wszystkie wskazówki w opisie aplikacji. Musisz wyłączyć inne usługi lokalizacyjne, a także uruchomić aplikację po włączeniu „Fałszywy GPS”. Działał świetnie na to, czego potrzebowałem.

Oto link do aplikacji w Google Play: Fałszywy GPS

Igor
źródło
2

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

Opcje programisty -> Wybierz pozorowaną aplikację lokalizacyjną (to znaczy, wybrana aplikacja Fałszywa lokalizacja).

Fałszywa aplikacja GPS :

Podwójna zakładka na mapie, aby dodać -> kliknij przycisk odtwarzania -> Pokaż toast „Fałszywa lokalizacja zatrzymana”

wreszcie sprawdź w aplikacjach map Google.

Manikandan K
źródło
2

Napisałem aplikację, która uruchamia serwer sieciowy (podobny do REST) ​​na telefonie z Androidem, dzięki czemu możesz zdalnie ustawić pozycję GPS . Witryna udostępnia 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 prawie nie ma interfejsu użytkownika ani dokumentacji, ale implementacja jest prosta i możesz sprawdzić wszystko w (tylko czterech) klasach.

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

juliusmh
źródło
1

Jeśli urządzenie jest podłączone do komputera i próbujesz zmienić wysyłanie przewodów GPS za pomocą kontrolki emulatora, nie zadziała.
To jest kontrola EMULATORA nie bez powodu.
Po prostu skonfiguruj go, aby informować Cię o zmianie 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);
        }
      };

Po zaktualizowaniu GPS 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.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

Shadoath
źródło
0

Zastanawiam się, czy potrzebujesz skomplikowanej konfiguracji pozorowanej lokalizacji. W moim przypadku, gdy uzyskałem ustaloną lokalizację, wywoływałem funkcję, aby zrobić coś z tą nową lokalizacją. W zegarze utwórz pozorowaną lokalizację. Zamiast tego wywołaj funkcję z tą lokalizacją. Wiedząc przez cały czas, że za chwilę GPS wskaże prawdziwą aktualną lokalizację. Co jest w porządku. Jeśli masz ustawiony wystarczająco długi czas aktualizacji.

yalcin
źródło
0

Może nie jest to podejście `` programisty '', ale jeśli chcesz zaoszczędzić czas i uzyskać działające rozwiązanie, wypróbuj jedną z aplikacji, które są dedykowane do pozorowanej lokalizacji dostępnej w Google Play:

Fałszywy lokalizator GPS

Mock Locations

Fałszywa lokalizacja GPS

klimat
źródło
1
Próbowałeś ich? Czy działały zgodnie z pytaniem?
arekolek
Jakieś preferencje? A może trzeba ich wszystkich? : P
arekolek
Fake GPS Location Spoofer jest wystarczająco dobry, ale Mock Locations pozwala wyznaczyć trasę, co jest fajną funkcją.
klimat
0

Użyj tego uprawnienia w pliku manifestu

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

Android Studio zaleci, aby „Żądanie pozorowanej lokalizacji było wymagane tylko w pliku manifestu specyficznym dla testu lub debugowania (zazwyczaj src / debug / AndroidManifest.xml)” po prostu wyłącz kontrolę

Teraz upewnij się, że zaznaczyłeś „ Zezwalaj na pozorowanie lokalizacji ” w ustawieniach programisty na telefonie

Użyj LocationManager

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

Teraz ustaw lokalizację, gdzie chcesz

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 
Nirmal prajapat
źródło
0

Powyższe rozwiązania nie zadziałały, ponieważ testowałem na urządzeniu z Androidem z najnowszą wersją Usług Google Play, która wykorzystuje FusedLocationProviderClient . Po ustawieniu uprawnień do pozorowanej lokalizacji w manifeście aplikacji i aplikacji jako określonej aplikacji pozorowanej lokalizacji w ustawieniach programisty (jak wspomniano w poprzednich odpowiedziach), dodałem kod Kotlin poniżej, który pomyślnie wyszydził lokalizację.

locationProvider = FusedLocationProviderClient(context)
locationProvider.setMockMode(true)

val loc = Location(providerName)
val mockLocation = Location(providerName) // a string
mockLocation.latitude = latitude  // double
mockLocation.longitude = longitude
mockLocation.altitude = loc.altitude
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    mockLocation.bearingAccuracyDegrees = 0.1f
    mockLocation.verticalAccuracyMeters = 0.1f
    mockLocation.speedAccuracyMetersPerSecond = 0.01f
}
//        locationManager.setTestProviderLocation(providerName, mockLocation)
locationProvider.setMockLocation(mockLocation)
John A Qualls
źródło