2010-01-02 3 views
5

Ich verwende die Methode requestLocationUpdates() des Standortmanagers, um regelmäßig eine Absicht an meinen Broadcastempfänger zu empfangen. Das System sendet die Absicht korrekt an meinen Empfänger und ich konnte es korrekt verwenden. Das einzige Problem ist, dass der GPS-Standortanbieter nach der ersten Standortakquisition nur für einige Sekunden aktiv bleibt und ich brauche ihn etwas länger, damit die Standortschätzungen genauer sind.Android: Wie kann GPS aktiviert werden, bis ein genauerer Standort zur Verfügung steht?

Meine Frage ist, wie Sie den GPS-Standort-Provider für jede periodische Anfrage, die von LocationManager requestLocationUpdates kommt, aktiv bleiben. Weiß jemand, wie man das macht?

Antwort

7

Versuchen Sie etwas wie das. Ich denke, es ist der richtige Ansatz

private void createGpsListner() 
{ 
    gpsListener = new LocationListener(){ 
     public void onLocationChanged(Location location) 
     { 
      curLocation = location; 

      // check if locations has accuracy data 
      if(curLocation.hasAccuracy()) 
      { 
       // Accuracy is in rage of 20 meters, stop listening we have a fix 
       if(curLocation.getAccuracy() < 20) 
       { 
        stopGpsListner(); 
       } 
      } 
     } 
     public void onProviderDisabled(String provider){} 
     public void onProviderEnabled(String provider){} 
     public void onStatusChanged(String provider, int status, Bundle extras){} 
    }; 
} 

private void startGpsListener() 
{ 

    if(myLocationManager != null) 
     // hit location update in intervals of 5sec and after 10meters offset 
     myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, gpsListener); 
} 

private void stopGpsListner() 
{ 
    if(myLocationManager != null) 
     myLocationManager.removeUpdates(gpsListener); 
} 
+1

danke für den Code. hasAccuracy und getAccuracy haben mir geholfen. Aber ein Zweifel, wenn GPS hat keine Genauigkeit innerhalb von 20 (an einigen Orten könnte), dann wird es weiter suchen Ryt? Was ist zu tun? – SSS

0

Wenn Sie Ihren LocationListener aktiv lassen, sollte er weiterhin Aktualisierungen von onLocationChanged() erhalten, wenn die Genauigkeit der Fehlerbehebungen sich verringert. und in der Tat location.getAccuracy() wird Ihnen die aktuelle Genauigkeit

vielleicht minTime und minDistance beide auf 0 geben, um Updates mit größerer Häufigkeit zu erhalten? wird mehr Batterie verwenden, aber ist mehr prise.

+1

ich bin Verwenden eines Broadcast-Empfängers mit der PendingIntent-Version der Methode. Außerdem wird die Fixierungsgenauigkeit besser, aber es hört auf, das Update vor seinem Genauigkeitspotenzial zu aktualisieren, daher kann ich getAccuracy() nicht einfach verwenden. Ich brauche es weiter zu aktualisieren, bis die Genauigkeit viel besser wird und es nicht lange genug wartet. – Doughy

+0

Ich verwende keinen Annäherungsalarm. Ich beantrage, dass der LocationManager mir regelmäßige Korrekturen gibt, die über einen Broadcast-Empfänger zu meiner Anwendung zurückkehren, was jedes Mal geschieht, wenn sich der Standort ändert. Der LocationManager oder der GPS-Standortanbieter bleiben nicht lange genug aktiv, damit die Standorte sehr genau sind. Selbst wenn ich einen Listener verwende, ändert das nicht die Tatsache, dass das GPS nicht sehr lange aktiv bleibt. – Doughy

+0

Haben Sie den Vorschlag von jspcal versucht, die minTime auf 0 oder ähnlich zu setzen? Wenn Sie dadurch häufige Aktualisierungen erhalten, die bald genau genug werden (oder nach einer Zeitüberschreitung), können Sie Ihre LocationManager-Aktualisierungsanforderung wieder auf den gewünschten minTime-Wert aktualisieren. –

0

Um GPS-Position in regelmäßigen Abständen erhalten Sie die Lage von OnLocationChanged Methode von Location und in onResume Methode geben Sie den Zeitpunkt in milliseconds für das Erhalten regelmäßige Updates

onResume 
location_manager.requestLocationUpdates(provider, 1000, 1, MainActivity.this);