Bearbeiten: Ich umforme diese Frage, weil ich anscheinend nicht klar war.Android GPS-Timeout
Manchmal benötigt der GPS-Dienst auf Android-Telefonen eine lange Zeit, um eine Lösung zu finden. Manchmal ist es schnell, manchmal dauert es Stunden. Ich kenne und akzeptiere dies.
Ich habe eine Anwendung, die viele Dinge tut. Sie müssen dem Benutzer beispielsweise ermöglichen, auf eine Schaltfläche zu klicken, um seine aktuellen Koordinaten an einen Server zu senden. Was ich brauche, sind die Koordinaten des Telefons , wenn der Benutzer die Schaltfläche oder innerhalb einer angemessenen kurzen Zeit danach klickt.
Da ich weiß, dass GPS-Fix nicht sofort ist und ich weiß, dass es Minuten oder Stunden dauern kann (während der der Benutzer eine große Entfernung bewegt hat), muss ich eine Zeitüberschreitung für diese Funktion codieren. Für diese Funktion ist es einfach nicht akzeptabel, den GPS-Standort des Benutzers nach dem Klicken auf die Schaltfläche beispielsweise drei Minuten hochzuladen. Es ist in Ordnung, wenn es 45 Sekunden dauert, nicht in Ordnung, wenn es 75 Sekunden dauert. Es ist in Ordnung, dem Benutzer eine Fehlerbenachrichtigung zu geben, wenn die Funktion einen Standort nicht schnell genug abrufen konnte.
Ich brauche eine Funktion, um den GPS-Standort zu erhalten und es an den Server zu senden, , es sei denn, es dauert mehr als eine Minute '.
Mein ursprünglicher Code ist unten. Ich habe einige Dinge seit dem Posten geändert. Ich habe einen Timer in der onStartCommand() Methode hinzugefügt. Ich starte eine TimerTask, die nach 60 Sekunden meine stop() Methode aufruft. Zu Beginn der onLocationChanged() - Methode lehne ich die TimerTask ab.
Meine Frage ist: Ist das Timer-Schema eine gute Möglichkeit, dieses Timeout zu implementieren? Gibt es einen besseren Weg?
Original Frage:
Ich bin eine Android-Anwendung zu schreiben, die unter anderem benötigt, die aktuelle GPS senden an einen Server koordiniert, wenn der Benutzer sagt sie. Von einem Kontextmenü aus führe ich den folgenden Dienst aus. Der Dienst ist ein LocationListener und fordert Aktualisierungen vom LocationManager an. Wenn es einen Speicherort (onLocationChanged()) erhält, entfernt es sich selbst als Listener und sendet die Koordinaten an den Server. All das funktioniert.
Wenn jedoch die GPS-Koordinaten nicht schnell verfügbar sind, läuft mein Dienst nur so lange, bis er wieder verfügbar ist. Es hält die Benutzeroberfläche mit einem Fortschrittsdialog auf, was ärgerlich ist. Schlimmer noch, wenn der Benutzer seit dem Start des Dienstes umgezogen ist, sind die ersten GPS-Koordinaten möglicherweise falsch und die App sendet falsche Daten an den Server.
Ich brauche eine Zeitüberschreitung für den Dienst. Gibt es einen guten Weg, das zu tun? Ich bin nicht sehr erfahren mit Threads. Ich denke, ich kann eine Runnable in der onStartCommand() -Methode ausführen, die irgendwie 30 Sekunden herunterzählen und dann, wenn es noch kein GPS-Ergebnis gibt, die stop() -Methode meines Dienstes aufrufen. Klingt das wie der beste Weg dies zu tun?
Oder ist es möglich zu sagen, ob das GPS nicht repariert werden kann? Wie würde ich das machen?
Bearbeiten: Um weiter zu klären, bin ich auf der Suche nach dem besten Weg, "aufgeben" auf einen Standort nach einiger Zeit.
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}
Also was hast du getan, um dies zu lösen? Ich habe das gleiche Problem. – sexitrainer