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.
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.
Antworten:
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.
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.
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).
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);
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. mLocationManager
ist ein, LocationManager
das 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
);
}
setTestProviderStatus
wird 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.
mLocationManager
ist ein LocationManager
Gerät, das an einen LocationListener angeschlossen ist"? Wie kann ich das machen? Vielen Dank ..
LocationManager
Dienstes nach einem Standortwechsel suchen könnenLocationListener
: blog.doityourselfandroid.com/2010/12/25/…
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.
Mock Provider
funktionierte 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.
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.
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.
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 ..
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.
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.
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
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
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.
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
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
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.
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:
Nutzen Sie den sehr praktischen und kostenlosen interaktiven Standortsimulator 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:
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);
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)