it-swarm.com.de

Android-Mock-Standort auf dem Gerät?

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

139
Isaac Waller

Die einzige Möglichkeit, dies zu tun, scheint die Verwendung eines falschen Standortanbieters zu sein.

Sie müssen Scheinpfade im Entwicklungsbereich in Ihren Einstellungen aktivieren und hinzufügen 

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

zu deinem Manifest.

Jetzt können Sie in Ihren Code gehen, einen eigenen Anbieter für Scheinstandorte erstellen und den Standort dieses Anbieters festlegen.

158
Janusz

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

99
tomash

Ich wünschte, ich hätte mein Kabel griffbereit. Ich weiß, Sie können mit dem Emulator telnet, um seinen Standort 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 telnet, aber ich denke, Sie können. Ich hoffe das hilft.

Sie benötigen adb (Android-Debugging-Bridge) für diese (CLI).

32
Tim Green

Sie können die Standortdienste-Berechtigung verwenden, um den Standort zu simulieren ... 

"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);
28
Vishwanath

Ich habe mit dem folgenden Code Erfolg gehabt. Obwohl es mir aus irgendeinem Grund eine einzige Sperre gab (selbst wenn ich verschiedene LatLng-Paare ausprobiert habe), hat es für mich funktioniert. mLocationManager ist eine LocationManager, die mit einer LocationListener verbunden ist:

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
Dr1Ku

Was Dr1Ku veröffentlicht hat. Der Code wurde heute verwendet, musste aber weitere Locs hinzufügen .. Hier sind einige Verbesserungen:

Optional: Anstelle der LocationManager.GPS_PROVIDER-Zeichenfolge möchten Sie möglicherweise Ihre eigene constat 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: Statt removeTestProvider aufzurufen, prüfen Sie zunächst, ob ein Provider entfernt werden muss (um IllegalArgumentException zu vermeiden):

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

Zweitens: Um mehr als einen Ort zu veröffentlichen, müssen Sie die Uhrzeit für den Ort einstellen: 

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 werden auch finde einen Code, der auf dem Emulator tatsächlich für mich funktioniert.

14
icyerasor

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

Ich habe nach 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 anderes Beispiel, das Quellcode enthält - obwohl ich die bereitgestellte APK nicht installieren konnte (es sagt Failure [INSTALL_FAILED_OLDER_SDK] und benötigt möglicherweise nur eine Neukompilierung)

Um GPS-Mock-Standorte verwenden zu können, müssen Sie sie in den Geräteeinstellungen aktivieren. Gehen Sie zu Einstellungen -> Anwendungen -> Entwicklung und aktivieren Sie "Mock-Standorte zulassen".

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

8
fijiaaron

Das hat für mich funktioniert (Android Studio):

Deaktivieren Sie die GPS- und WLAN-Ortung am Telefon. Wählen Sie unter Android 5.1.1 und darunter "Entwicklerorte aktivieren".

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

benutzungsberechtigung Android: name = "Android.permission.ACCESS_MOCK_LOCATION"

Richten Sie ein Kartenfragment namens "Karte" 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" zu verwenden.

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. Bei Android 6.0 und höher erhalten Sie eine Sicherheitsausnahme. Gehen Sie nun zu den Entwickleroptionen in den Einstellungen und wählen Sie "App-Standort auswählen". Wählen Sie Ihre App aus der Liste aus.

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

Ich habe das gerade herausgefunden, also muss ich jetzt nicht mit Handys in der Nachbarschaft herumtrampeln.

8
Chris B

Ich habe einen einfachen Handler erstellt, der eine Bewegungsposition aus einer Ausgangsposition 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 ..

7
smora

Die von icyerasor erwähnte Lösung, die Pedro unter http://pedroassuncao.com/blog/2009/11/12/Android-location-provider-mock/ zur Verfügung gestellt hat, hat für mich sehr gut funktioniert. Es bietet jedoch keine Unterstützung für das ordnungsgemäße Starten, Stoppen und Neustarten des Mock-GPS-Providers.

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

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

Alle Anerkennung sollte Pedro für die meiste harte Arbeit geleistet werden.

6
Paul Houx

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

Hier ist der Link zur App auf GooglePlay: Gefälschtes GPS

3
Igor

Das Google-Tutorial dazu finden Sie hier, es enthält Codebeispiele und erläutert den Vorgang.

http://developer.Android.com/training/location/location-testing.html#SendMockLocations

2
Nik Pardoe

Wenn Ihr Gerät an Ihren Computer angeschlossen ist und Sie versuchen, GPS-Kabel zu senden, können Sie dies über die Emulatorsteuerung nicht tun.
Dies ist ein EMULATOR-Steuerelement aus einem bestimmten Grund.
Richten Sie es einfach ein, um Sie über GPS-Änderungen zu aktualisieren. 

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 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 aufzunehmen
Android.permission.ACCESS_FINE_LOCATION
Android.permission.ACCESS_MOCK_LOCATION

1
Shadoath

Vielleicht handelt es sich nicht um einen "Programmierer" -Ansatz. Wenn Sie jedoch Zeit sparen und sofort eine funktionierende Lösung erhalten möchten, probieren Sie eine der Apps aus, die sich auf die falsche Position in Google Play konzentrieren:

Gefälschter GPS-Ortungsspoofer

Scheinstandorte

Gefälschte GPS-Position

1
klimat

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

Entwickleroptionen ->Wählen Sie die Standort-App für einen falschen Standort aus (Dies ist gemeinhin: Fake-Standort-App ist ausgewählt).

Gefälschte GPS-App:

Doppelter Tab auf der Karte zum Hinzufügen -> Klicken Sie auf die Wiedergabeschaltfläche -> Zeigen Sie den Toast an "Gefälschte Position angehalten".

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

1
Manikandan K

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

Verwenden Sie diese Berechtigung in der Manifestdatei

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

Android Studio empfiehlt, "Mock-Speicherort sollte nur in einer test- oder debugspezifischen Manifestdatei angefordert werden (normalerweise src/debug/AndroidManifest.xml)" Nur die Inspektion deaktivieren

Vergewissern Sie sich nun, dass Sie in den Entwicklereinstellungen Ihres Telefons "Allow Mock Locations" aktiviert haben

Verwenden Sie LocationManager 

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

Stellen Sie jetzt den Ort ein, wo 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); 
0
Nirmal prajapat

Ich habe eine App geschrieben, die einen WebServer (REST-Like) auf Ihrem Android Phone ausführt, sodass Sie die GPS-Position remote einstellen können. Die Website bietet eine Karte, auf die Sie klicken können, um eine neue Position festzulegen, oder die Tasten "wasd" verwenden, um sich in eine beliebige Richtung zu bewegen. Die App war eine schnelle Lösung, so dass es fast keine Benutzeroberfläche oder Dokumentation gibt, aber die Implementierung ist einfach und Sie können alles in den (nur vier) Klassen nachschlagen.

Projektarchiv: https://github.com/juliusmh/RemoteGeoFix

0
juliusmh

Nutzen Sie den sehr bequemen und kostenlosen interaktiven Ortssimulator für Android-Telefone und -Tablets (CATLES). Es verspottet den GPS-Standort auf systemweiter Ebene (auch innerhalb der Google Maps- oder Facebook-Apps) und funktioniert sowohl auf physischen als auch auf virtuellen Geräten:

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

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

0
Sandro

Ich frage mich, ob Sie das aufwendige Mock Location-Setup benötigen. In meinem Fall rief ich eine Funktion an, um etwas mit dem neuen Standort zu tun. Erstellen Sie in einem Timer einen Scheinstandort. Und rufen Sie stattdessen die Funktion mit dieser Position auf. Zu wissen, dass GPS in kurzer Zeit einen tatsächlichen aktuellen Standort ergeben würde. Welches ist OK Wenn Sie die Aktualisierungszeit ausreichend lang eingestellt haben.

0
yalcin