2013-03-09 15 views
5

Ich baue eine GPS-Android-Anwendung, die die nächstgelegenen Orte basierend auf dem aktuellen Standort des Benutzers ermittelt. DieseWie kann ich den Benutzer, der lange auf eine Standortkorrektur wartet, anhalten?

ist, was meine Anwendung funktioniert:

  • Überprüfen Sie, ob GPS oder Netzwerk verfügbar ist
  • Wenn weder steht dann nichts tun. Sonst suchen wir zuerst nach GPS, wenn es dort ist, andernfalls suchen wir nach Netzwerk.
  • Nachdem Sie einen von ihnen verwendet haben, erhalten wir den aktuellen Standort und senden ihn an den Server.
  • Sobald wir Daten vom Server abrufen und die Benutzeroberfläche aktualisieren, hören wir auf weitere Standortaktualisierungen zu hören. Einmal ist genug, bis sie den Refresh-Button drücken, der diesen erneut startet.

Was ich hoffe, zu tun:

  • Wenn GPS oder Netzwerk einen Standort abzurufen ausfällt, beispielsweise 2 Minuten, dann schalten wir Anbieter. Wir möchten nicht, dass der Benutzer zu lange wartet.

  • Es wäre auch schön, in der Lage zu sein, beide Anbieter zu verwenden und dann die genaueste davon zu bekommen. Ich habe mir http://developer.android.com/guide/topics/location/strategies.html angesehen und ich habe die isBetterLocation Methode gesehen. Wie würde ich diese Methode in meine Anwendung integrieren? Ich habe Probleme zu verstehen, wie, wo und wann es aufgerufen werden sollte. Ich nehme an, dass die isBetterLocation() erfordert, dass ich gleichzeitig Network und GPS anrufe. Es wäre schön für meine Anwendung, beide auf Genauigkeit zu hören. Wie mache ich das? Was ist, wenn einer von ihnen nicht verfügbar ist?

Hier Teile meines Code:

if(!GPSEnabled && !networkEnabled) 
{ 
    Toast.makeText(this, "Error: This application requires a GPS or network connection", 
      Toast.LENGTH_SHORT).show(); 
} 
else 
{ 
    if(GPSEnabled) 
    { 
     locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
    } 
    else if(networkEnabled) 
    { 
     System.out.println("Getting updates from network provider"); 
     locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
    } 
} 

Mit dieser Methode onLocationChanged ist. Ich bekomme die lat/lng-Werte und sende sie dann an meinen Server und mache dann entsprechende Sachen damit.

public void onLocationChanged(Location location) 
{ 
    //Get coordinates 
    double lat = (location.getLatitude()); 
    double lng = (location.getLongitude()); 
    Log.d("MainActivity", "got location: " + lat + ": " + lng); 
    //get nearest locations 
    new GetLocations().execute(SharedVariables.root + SharedVariables.locationsController + SharedVariables.getNearestMethod + lat + "/" + lng); 

    // Zoom in, animating the camera after the markers have been placed 
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10)); 
    System.out.println("lat = " + lat + ", lng = " + lng); 

    //Stop listening for updates. We only want to do this once. 
    locManager.removeUpdates(this); 
} 
+0

Sie haben dies gesehen ?: http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html. Und die App props App ?: https://code.google.com/p/android-protips-location/ –

+0

Der Netzwerkanbieter ist ungenau, aber es gibt die Position in weniger als einer Sekunde – Reno

+0

Hallo Reno, Danke. Ich verstehe, dass GPS und Netzwerk sich in Genauigkeit und Geschwindigkeit unterscheiden und das bringt mich zu meiner Frage, wie ich ein Feature implementiere, bei dem, wenn einer der Provider verfügbar ist, der Standort auf einem der Provider basiert, vorzugsweise GPS ist am genauesten, wenn nach x Zeit kein Fix gefunden wird, versuche ich, auf den Netzanbieter umzuschalten, wenn er eingeschaltet ist. –

Antwort

0

Entweder mit GPS oder dem Netzwerk können Sie die Wartezeit auf Ihren Standort nicht drastisch reduzieren.

Beide Lage Methoden haben ihre Nachteile und Vorteile:

  • GPS dauert in der Regel eine längere Zeit, um Ihre Position zu kennen, weil die Suche und GPS-Satelliten Kalibrierung eine gewaltige Aufgabe ist (die Suche nach mindestens 3 korrekt ausgerichtete Satelliten sind erforderlich). Fügen Sie außerdem die Hindernisse hinzu, die die Signale blockieren. Sofern Sie GPS nicht aktivieren, bevor/wann Ihre App gestartet wird, müssen Sie warten. Auf der anderen Seite, erhalten Sie eine feinkörnige Lage.

  • Wenn Sie nur einen ungefähren Standort benötigen, ist die Verwendung des Netzwerks eine Lösung: Es gibt Daten in wenigen Sekunden zurück. Jedoch die Genauigkeit der Position variiert je nach verfügbaren/verwendeten Netzwerken; Ich habe keine praktischen Beispiele, aber ich denke, die Genauigkeit kann stark variieren. GPS wird IMMER haben einen besseren Standort als Netzwerk.

Verstehen gibt es keine vordefinierte Auswahl. Alles hängt davon ab, was Ihre App mit diesen Daten macht.

Verwenden Sie GPS, wenn verfügbar, während Sie die Standortanforderung an das Netzwerk stellen, und greifen Sie auf das Netzwerk zurück, wenn kein GPS-Gerät vorhanden ist. Dann nehmen Sie entweder:

  • die erste aufstrebendes Ergebnis, wenn man nur einen Standort
  • das bevorzugte Ergebnis benötigen, wenn Sie die genauesten Daten

Wenn GPS oder Netzwerk eines abzurufen ausfällt Standort, zum Beispiel 2 Minuten, dann wechseln wir Anbieter. Wir möchten nicht, dass der Benutzer zu lange wartet.

In beiden Fällen sollten Sie keinen Fallback-Timer verwenden: Sie verlängern lediglich die Wartezeit, wenn der erste Anbieter ausfällt; also fordern beide gleichzeitig an, es sei denn, die Android-API erlaubt keine asynchronen Standortanfragen.

+0

Danke. Wie ich bereits in meiner Antwort auf Renos Kommentar erwähnt habe, verstehe ich die Unterschiede zwischen GPS und den Netzwerkanbietern. Wie wir beide in meiner Frage und Ihrer Antwort über die gleichzeitige Verwendung beider Anfragen angedeutet haben, wollte ich wissen, wie dies umgesetzt werden würde. Wie wählen wir den genauesten Standort aus, wenn wir zwei Anbieter verwenden? Und was tun wir im letzten Teil meiner Frage, wenn einer der Provider nicht aktiviert ist? –

+0

Wie ich schon sagte, GPS wird immer die beste Präzision haben. Aber wenn Sie nicht wissen, wie genau ein Netzwerk ist (indem Sie seine Genauigkeit anfordern oder die Genauigkeit dieses spezifischen Netzwerks zwischenspeichern, wenn GPS verfügbar ist (unterscheiden Sie zwischen den beiden Anbietern), ist es nicht möglich, den Anbieter zu bestimmen gewählt werden. Durchschnittlich die Werte der verschiedenen Standortanbieter mitteln? – ElementW