Android Mock Location auf dem Gerät?

147

Wie kann ich meinen Standort auf einem physischen Gerät (Nexus One) verspotten? Ich weiß, dass Sie dies mit dem Emulator in der Emulator-Systemsteuerung tun können, aber dies funktioniert nicht für ein physisches Gerät.

Isaac Waller
quelle
Für Desktop-Computer können Sie Treiber erstellen / installieren, die ein GPS-Gerät / eine serielle Schnittstelle emulieren, um diese Art von Tests durchzuführen. Vielleicht könnten Sie etwas Ähnliches für Android erstellen oder finden.
AaronLS
6
Es gibt verschiedene Anwendungen auf dem Markt, die den GPS-Standort emulieren können. Zum Beispiel "Location Spoofer".
Vlad
Es gibt viele Apps im Store, die dies tun. Sie können dies versuchen - play.google.com/store/apps/… oder this - play.google.com/store/apps/…
Yehuda
1
Es gibt auch eine App im Store, die die Befehle "geo fix" und "geo nmea" genau wie der Emulator unterstützt! play.google.com/store/apps/...
luv
@Iuv mehr darüber ist Open Source github.com/luv/mockgeofix
Vlad

Antworten:

166

Es scheint die einzige Möglichkeit zu sein, einen Scheinstandortanbieter zu verwenden.

Sie müssen in Ihren Einstellungen Scheinpositionen im Entwicklungsfenster aktivieren und hinzufügen

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

zu deinem Manifest.

Jetzt können Sie in Ihren Code Ihren eigenen Scheinstandortanbieter erstellen und den Standort dieses Anbieters festlegen.

Janusz
quelle
83
Es gibt eine Anwendung auf dem Markt namens "Fake GPS". Wenn Sie Mock Locations auf Ihrem Gerät aktivieren, bietet es eine schöne Benutzeroberfläche zum Festlegen Ihres Standorts. Mir ist klar, dass dies keine Do-it-yourself-Lösung ist, aber sicherlich eine würdige Lösung für schnelle Tests.
Tim Green
2
Dies kann der Link sein - das gleiche Datum und der relevante Inhalt.
DefenestrationDay
4
@ TimGreen Ihre sollte die akzeptierte Antwort sein (nicht nur ein Kommentar)! Bei weitem der einfachste Weg zu testen
Bostone
Tatsächlich ist die "Fake GPS" -Anwendung nicht die beste, da sie nur Standorte festlegen und sich zufällig bewegen kann. Ihre neue Version kann routen, aber sie iteriert nur über Wegpunkte, so große Sprünge in der Position. Janusz Antwort ist in der Tat richtig, dass Sie Ihren eigenen Mock-Provider erstellen müssen. Wir haben das kürzlich gemacht und wenn jemand es braucht oder wenn diese Frage noch Hilfe braucht, werde ich den Code posten.
Vkinra
5
Die Aussage "Geben Sie Ihren Code ein und erstellen Sie Ihren eigenen Anbieter für Scheinstandorte" sollte ausführlicher erläutert werden.
Dims
102

Wenn Sie dieses Telefon nur im Entwicklungslabor verwenden, besteht die Möglichkeit, dass Sie den GPS-Chip ablöten und die serielle Schnittstelle direkt mit NMEA-Sequenzen von anderen Geräten versorgen können.

Tomash
quelle
68
Warum die Hasser? Diese Antwort ist unglaublich hart.
Ben Zotto
61
Super Hardcore, obwohl auch unglaublich nutzlos / irrelevant.
Olivervbk
13
Aber lustig genug.
Etienne
23
Ich denke, jeder, für den diese Antwort relevant wäre, weiß bereits, dass er dies tun kann. Ich bezweifle, dass diese drei Leute den Stackoverflow nach einer Lösung durchsuchen.
ToolmakerSteve
10
Wenn Sie Probleme haben, realistische NMEA-Sequenzen in Ihr nicht gelötetes Gerät zu generieren, gibt es eine großartige Option: Löten Sie dort ein tatsächliches externes GPS-Gerät und bewegen Sie das gesamte Entwicklungslabor auf einer tatsächlichen Strecke über einem Team von Läufern / Bikern / Autos / Flugzeuge / was auch immer, abhängig von der Geschwindigkeit, die Sie simulieren möchten. Vergessen Sie nicht, ein Loch im Dach des Entwicklungslabors zu öffnen, damit das Gerät Funksignale von Satelliten empfangen kann. Bitte. ;-)
Stéphane Gourichon
32

Ich wünschte, ich hätte mein Kabel zur Hand. Ich weiß, dass Sie mit dem Emulator telneten können, um seinen Speicherort zu ändern

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

Ich kann mich nicht erinnern, ob Sie mit Ihrem Gerät telneten können, aber ich denke, Sie können. Ich hoffe das hilft.

Dazu benötigen Sie adb (Android Debugging Bridge) (CLI).

Tim Green
quelle
Sie erhalten eine Berechtigung für alles, was Sie als Befehl an die Konsole Ihres Geräts senden. Vielleicht ist es mit einer Terminal-Anwendung möglich, aber ich denke, das erfordert Root-Zugriff
Janusz
Nur damit wir auf der gleichen Seite sind: Sie sprechen nicht von "adb shell", oder? Was ich spreche, ist anders. Dies ist ein Setup, mit dem Sie androidspezifische Parameter einstellen können. Ich weiß zum Beispiel, dass Sie die Portweiterleitung (dh localhost: 1234 geht an Telefon: 1234) ohne Root-Zugriff einrichten können, sodass Sie einen SOCKS-Proxy und -Tunnel über ein Kabel ohne Root einrichten können.
Tim Green
Sie können adb forward tcp: 6000 tcp: 23 verwenden, um Port 6000 auf Ihrem Computer an Port 23 auf dem Gerät weiterzuleiten, aber ich konnte keine Verbindung herstellen, selbst wenn der Port als offen angezeigt wird. Die Verwendung eines Telnet-Clients auf dem Gerät und die Verbindung zu localhost schlägt ebenfalls fehl
Janusz
15
Dies funktioniert gut für den Emulator, aber nicht für ein tatsächliches Gerät. Es beantwortet also überhaupt nicht die Frage von OP :(
Matthew Gilliard
4
@ TimGreen Ihre Lösung ist nur für Emulator. Die Frage betraf das reale Gerät.
IgorGanapolsky
29

Sie können die Location Services-Berechtigung verwenden, um den Standort zu verspotten ...

"android.permission.ACCESS_MOCK_LOCATION"

und dann in Ihrem Java-Code,

// 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
quelle
9
Was ist der Wert von mocLocationProvider?
Victor
zB LocationManager.GPS_PROVIDER
enigma969
25

Ich habe Erfolg mit dem folgenden Code gehabt. Obwohl ich aus irgendeinem Grund ein einziges Schloss bekam (auch wenn ich verschiedene LatLng-Paare ausprobiert habe), hat es bei mir funktioniert. mLocationManagerist ein, LocationManagerdas an ein angeschlossen ist 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
quelle
1
Netter Beitrag, siehe meine Antwort unten für Ergänzungen.
icyerasor
Soweit ich mich erinnere, setTestProviderStatuswird hier verwendet, um ein Ereignis mit dem LocationManager zu benachrichtigen / zu veröffentlichen / zu planen, dass der GPS-Anbieter "jetzt" einen Fix gefunden hat, damit die Verarbeitung dieses Ereignisses erfolgen kann.
Dr1Ku
Was bedeutet " mLocationManagerist ein LocationManagerGerät, das an einen LocationListener angeschlossen ist"? Wie kann ich das machen? Vielen Dank ..
Yehuda
Hier ist ein Artikel, in dem erklärt wird, wie Sie mithilfe des LocationManagerDienstes nach einem Standortwechsel suchen könnenLocationListener : blog.doityourselfandroid.com/2010/12/25/…
Dr1Ku
2
plus 1 für die Art und Weise, wie Sie die Wahren und Falschen in der Methode addTestProvider
A.Alqadomi
16

Was Dr1Ku gepostet hat, funktioniert. Habe den Code heute verwendet, musste aber weitere Locs hinzufügen. Hier sind einige Verbesserungen:

Optional: Anstatt die Zeichenfolge LocationManager.GPS_PROVIDER zu verwenden, möchten Sie möglicherweise Ihre eigene Konstante PROVIDER_NAME definieren und verwenden. Wählen Sie bei der Registrierung für Standortaktualisierungen einen Anbieter über Kriterien aus, anstatt ihn direkt als Zeichenfolge anzugeben.

Erstens: Anstatt removeTestProvider aufzurufen, prüfen Sie zunächst, ob ein Anbieter entfernt werden muss (um IllegalArgumentException zu vermeiden):

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

Zweitens: Um mehr als einen Standort zu veröffentlichen, müssen Sie die Zeit für den Standort festlegen:

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

Es scheint auch einen Google-Test zu geben, der MockLocationProviders verwendet: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Ein weiteres gutes Arbeitsbeispiel finden Sie unter: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

Ein weiterer guter Artikel ist: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Sie finden auch Code, der tatsächlich funktioniert mich auf dem Emulator.

icyerasor
quelle
Cooler Vorschlag zur Definition Ihres eigenen Providers. Bei der Verwendung von GPS_PROVIDER können Sie den Scheinanbieter (anscheinend) erst nach einem Neustart loswerden (genauer gesagt, Sie können nicht zu normalem GPS wechseln). Super Beitrag auch, ich werde die Referenzen überprüfen!
Dr1Ku
@ Dr1KU Ist es immer noch so, dass Sie nicht zum normalen GPS zurückkehren können? Ist das irgendwo angegeben?
Kaz Dragon
@ KazDragon Das war damals der Fall. Soweit ich mich erinnern kann, Mock Providerfunktionierte das normale GPS nach dem Einschalten nicht, ich konnte keine Lösung finden (ich habe direkt auf einem Gerät getestet). Dies ist möglicherweise nicht der Fall, da seitdem in Android viel passiert ist.
Dr1Ku
@ Dr1Ku Ah, nun, ich mache jetzt etwas sehr Ähnliches und erhalte ähnliche Ergebnisse wie die von Ihnen beschriebenen. Ich hatte gehofft zu wissen, ob dies eine in die Plattform eingebaute Einschränkung war oder ob mir nur irgendwo ein Funktionsaufruf fehlte. Ich sollte wahrscheinlich eine Frage daraus machen.
Kaz Dragon
9

Im Android Market sind Apps verfügbar, mit denen Sie einen "Mock GPS Location" für Ihr Gerät angeben können.

Ich habe https://market.android.com gesucht und eine App namens "My Fake Location" gefunden, die für mich funktioniert.

Der von Paul oben erwähnte Mock-GPS-Anbieter (unter http://www.cowlumbus.nl/forum/MockGpsProvider.zip) ) ist ein weiteres Beispiel, das Quellcode enthält - obwohl ich die bereitgestellte APK nicht installieren konnte (dort steht Fehler) [INSTALL_FAILED_OLDER_SDK] und muss möglicherweise nur neu kompiliert werden.

Um GPS-Scheinstandorte verwenden zu können, müssen Sie diese in Ihren Geräteeinstellungen aktivieren. Gehen Sie zu Einstellungen -> Anwendungen -> Entwicklung und aktivieren Sie "Scheinspeicherorte zulassen".

Sie können dann eine App wie die oben beschriebenen verwenden, um GPS-Koordinaten festzulegen. Google Maps und andere Apps verwenden den von Ihnen angegebenen falschen GPS-Standort.

Fidschiaaron
quelle
Gefälschtes GPS ist einfacher. Ich frage mich nur, warum sie in der App-Erlaubnis nach der Anrufer-ID fragen: S
Guillaume Massé
8

Das hat bei mir funktioniert (Android Studio):

Deaktivieren Sie die GPS- und WiFi-Verfolgung auf dem Telefon. Wählen Sie unter Android 5.1.1 und niedriger in den Entwickleroptionen "Scheinspeicherorte aktivieren" aus.

Erstellen Sie eine Kopie Ihres Manifests im Verzeichnis src / debug. Fügen Sie Folgendes hinzu (außerhalb des Tags "application"):

Verwendungsberechtigung android: name = "android.permission.ACCESS_MOCK_LOCATION"

Richten Sie ein Kartenfragment mit dem Namen "map" ein. Fügen Sie den folgenden Code in onCreate () ein:

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);
    }
};

Beachten Sie, dass Sie möglicherweise "minSdkVersion" in Ihrer Modul-Gradle-Datei vorübergehend auf 17 erhöhen müssen, um die Methode "setElapsedRealtimeNanos" verwenden zu können.

Fügen Sie den folgenden Code in die Hauptaktivitätsklasse ein:

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

Führen Sie Ihre App mit AS aus. Unter Android 6.0 und höher erhalten Sie eine Sicherheitsausnahme. Gehen Sie nun zu Entwickleroptionen in den Einstellungen und wählen Sie "Mock Location App auswählen". Wählen Sie Ihre App aus der Liste aus.

Wenn Sie jetzt auf die Karte tippen, wird onLocationChanged () mit den Koordinaten Ihres Tippens ausgelöst.

Ich habe das gerade herausgefunden, damit ich jetzt nicht mehr mit Telefonen in der Hand durch die Nachbarschaft stapfen muss.

Chris B.
quelle
Ich denke, es funktioniert auf Android 6, wenn Sie diesen Code in Dienst stellen
Hamza
7

Ich habe einen einfachen Handler erstellt, der eine sich bewegende Position von einer Anfangsposition aus simuliert.

Starten Sie es in Ihrem Verbindungsrückruf:

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) {

    }
};

Die Handler-Klasse:

   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;
        }
    }
}

Hoffe es kann helfen ..

smora
quelle
6

Die von icyerasor erwähnte und von Pedro bei http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ bei mir sehr gut funktioniert. Es bietet jedoch keine Unterstützung für das ordnungsgemäße Starten, Stoppen und Neustarten des Schein-GPS-Anbieters.

Ich habe seinen Code ein wenig geändert und die Klasse so umgeschrieben, dass sie eine AsyncTask anstelle eines Threads ist. Auf diese Weise können wir mit dem UI-Thread kommunizieren, sodass wir den Anbieter an dem Punkt neu starten können, an dem wir ihn gestoppt haben. Dies ist praktisch, wenn sich die Bildschirmausrichtung ändert.

Der Code sowie ein Beispielprojekt für Eclipse finden Sie auf GitHub: https://github.com/paulhoux/Android-MockProviderGPS

Alle Ehre gebührt Pedro für die meiste harte Arbeit.

Paul Houx
quelle
6

Fügen Sie Ihrem Manifest hinzu

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

Mock Location Funktion

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);
}

Sie müssen auch Scheinpositionen in den Entwicklereinstellungen Ihres Geräts aktivieren. Wenn dies nicht verfügbar ist, setzen Sie die "Mock Location Application" auf Ihre Anwendung, sobald die oben genannten implementiert wurden.

Ian M.
quelle
3

Gefälschte GPS-App von Google Play hat den Trick für mich getan. Stellen Sie einfach sicher, dass Sie alle Anweisungen in der App-Beschreibung gelesen haben. Sie müssen andere Ortungsdienste deaktivieren und Ihre App starten, nachdem Sie "Fake GPS" aktiviert haben. Arbeitete großartig für das, was ich brauchte.

Hier ist der Link zur App auf GooglePlay: Fake GPS

Igor
quelle
2

Installieren Sie die gefälschte GPS-App https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=de

Entwickleroptionen -> Mock Location App auswählen (Mittelwert, Fake Location App ausgewählt).

Gefälschte GPS-App :

Doppelte Registerkarte auf der Karte zum Hinzufügen -> Klicken Sie auf die Wiedergabetaste -> Zeigen Sie den Toast "Gefälschter Ort gestoppt" an.

Überprüfen Sie schließlich mit Google Map Apps.

Manikandan K.
quelle
2

Ich habe eine App geschrieben, die einen WebServer (REST-like) auf Ihrem Android-Telefon ausführt, damit Sie die GPS-Position aus der Ferne einstellen können . Die Website bietet eine Karte, auf die Sie klicken können, um eine neue Position festzulegen, oder die "Wasd" -Tasten verwenden können, um sich in eine beliebige Richtung zu bewegen. Die App war eine schnelle Lösung, daher gibt es fast keine Benutzeroberfläche oder Dokumentation, aber die Implementierung ist unkompliziert und Sie können alles in den (nur vier) Klassen nachschlagen.

Projekt-Repository: https://github.com/juliusmh/RemoteGeoFix

juliusmh
quelle
1

Wenn Ihr Gerät an Ihren Computer angeschlossen ist und Sie versuchen, GPS-Kabel über die Emulator-Steuerung zu ändern, funktioniert dies nicht.
Dies ist aus einem bestimmten Grund eine EMULATOR-Steuerung.
Richten Sie es einfach so ein, dass Sie über GPS-Änderungen informiert werden.

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);
        }
      };

Wenn das GPS aktualisiert wird, schreiben Sie die folgende Methode neu, um das zu tun, was Sie möchten.

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();  
        }
    }
}

Vergessen Sie nicht, diese in das Manifest
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION einzufügen

Shadoath
quelle
0

Ich frage mich, ob Sie das aufwändige Mock Location-Setup benötigen. In meinem Fall habe ich, sobald ich einen festen Speicherort erhalten habe, eine Funktion aufgerufen, um etwas mit diesem neuen Speicherort zu tun. Erstellen Sie in einem Timer einen Scheinort. Rufen Sie stattdessen die Funktion mit diesem Speicherort auf. Wenn Sie das alles in kurzer Zeit wissen, würde GPS einen realen aktuellen Standort ermitteln. Welches ist in Ordnung. Wenn Sie die Aktualisierungszeit ausreichend lang eingestellt haben.

Yalcin
quelle
0

Vielleicht ist es kein "Programmierer" -Ansatz, aber wenn Sie Zeit sparen und sofort eine funktionierende Lösung erhalten möchten, probieren Sie eine der Apps aus, die für den in Google Play verfügbaren Scheinstandort vorgesehen sind:

Gefälschter GPS-Standort-Spoofer

Scheinorte

Gefälschter GPS-Standort

klimat
quelle
1
Hast du sie probiert? Haben sie wie in der Frage gefordert gearbeitet?
Arekolek
Irgendeine Präferenz? Oder braucht man alle? : P
Arekolek
Fake GPS Location Spoofer ist gut genug, aber Mock Locations ermöglicht das Festlegen einer Route, was eine nette Funktion ist.
klimat
0

Verwenden Sie diese Berechtigung in der Manifestdatei

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

android studio empfiehlt, dass "Mock Location nur in einer Test- oder Debug-spezifischen Manifestdatei (normalerweise src / debug / AndroidManifest.xml) angefordert werden sollte". Deaktivieren Sie einfach die Überprüfung

Stellen Sie nun sicher, dass Sie in der Entwicklereinstellung Ihres Telefons die Option " Scheinspeicherorte zulassen " aktiviert haben

Verwenden Sie LocationManager

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

Stellen Sie nun den Ort ein, wo immer Sie möchten

Location mockLocation = new Location(mocLocationProvider); 
mockLocation.setLatitude(lat); 
mockLocation.setLongitude(lng); 
mockLocation.setAltitude(alt); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 
Nirmal Prajapat
quelle
0

Die oben genannten Lösungen haben bei mir nicht funktioniert, da ich auf einem Android-Gerät mit der neuesten Google Play Services-Version getestet habe, die den FusedLocationProviderClient verwendet . Nachdem ich die Mock Location-Berechtigung im App-Manifest und die App als angegebene Mock Location-App in den Entwicklereinstellungen festgelegt hatte (wie in den vorherigen Antworten erwähnt), fügte ich den folgenden Kotlin-Code hinzu, der den Standort erfolgreich verspottete.

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
quelle