Android Périodique de la position GPS mises à jour avec AlarmManager à l'intérieur d'un Service
J'ai lu beaucoup de questions ici, mais ne pouvait pas comprendre ce qu'est le problème.
Je suis en train d'écrire un champ d'application de service pour Android. Dans l'une des Activités (MyActivity.java) j'ai deux boutons: Start et Stop.
Lorsque le travailleur sur le terrain appuie sur start j'ai besoin d'obtenir son emplacement actuel avec le GPS et l'envoyer au serveur en temps opportun des intervalles (disons qu'il sera de 5 minutes par défaut, ici je l'ai mis 20 secondes. pour les tests). Le client souhaite que cette de voir combien de temps les travailleurs passent de temps dans le trafic, le trafic dans ma ville (Istanbul) est un gâchis.
J'ai un AlarmManager dans mon activité, lorsque le bouton de démarrage est enfoncé, l'alarme est réglée par AlarmManager.setRepeating()
pour démarrer le service (ServiceClass.java).
Intent intent = new Intent (MyActivity.this, ServiceClass.class);
mPendingIntent = PendingIntent.getService(MyActivity.this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mAlarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 20*1000,
mPendingIntent);
- Je annuler l'Alarme avec la touche Stop.
Il fonctionne parfaitement jusqu'ici, le Service démarre. Son onCreate()
, onStart()
et onDestroy()
méthodes sont exécutées. Mais je ne peux pas obtenir l'emplacement. Je ne travaille pas sur un périphérique réel donc je suis en utilisant DDMS pour envoyer des emplacements. Mais l'application saute cette étape et d'estampes de la Longitude et de la Latitude de ma position que Lon:0 Lat:0.
Voici le code à l'intérieur du service:
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d("Testing", "Service got started, calling location updates:");
mLocationManager.requestSingleUpdate(mCriteria, mLocationListener,
getMainLooper());
Log.i("TESTING LOCATION UPDATE: LOCATION:", "\nLat:" + mLatitude +
" Lon:" + mLongitude);
stopSelf(startId);
Log.d("Testing", "Service Stopped!");
Et enfin, voici mon: LocationListener:
mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if(location != null){
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
Log.i("onLocationChanged(Location location)", "Lat:"+mLatitude + "
Lon:" + mLongitude);
}
Aussi quelque chose qui a attiré mon attention, quand je lance le code:
mLocationProvider = mLocationManager.getBestProvider(mCriteria, true);
Log.i("BEST PROVIDER IS:", mLocationProvider);
Il dit MEILLEUR FOURNISSEUR de: gps. Mais ce journal à l'intérieur de onProviderEnabled() n'est jamais montré dans le logcat.
@Override
public void onProviderEnabled(String s) {
Log.v("onProviderEnabled", "ENABLED");
}
Deux choses à ajouter, si j'utilise:
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
mLocationListener);
ça ne fonctionne pas non plus.
Toutefois, cela fonctionne et je peux obtenir le LastKnownLocation:
Location lastKnown = mLocationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);
Tout d'abord, est-ce une bonne approche pour ce faire? Si il est s'il vous plaît vérifier pour voir ce que je suis absent. Si elle n'est pas, pouvez-vous s'il vous plaît dites-moi comment puis-je mettre en œuvre ce pas mieux?
Merci. 🙂
Grâce tonys, je vais lire que la première chose.
Cela fonctionne parfaitement: entrez description du lien ici
OriginalL'auteur Lev | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous ne pouvez pas vous inscrire pour l'emplacement des mises à jour, puis arrêter le service. Au mieux, on aura une fuite de threads. Au pire, Android va mettre fin à votre processus (de la pensée il n'y a rien de course) et vous n'obtiendrez pas la mise à jour. Aussi, le GPS prend du temps à se réchauffer, de sorte que vous ne pourriez pas obtenir un correctif dans un délai de 20 secondes, en particulier en milieu urbain. Aussi, vous devez vous assurer que l'appareil reste allumé alors que vous essayez de collecter un correctif.
En conséquence, l'obtention de périodique emplacement fixe dans le fond, c'est plutôt un problème compliqué.
J'ai écrit un maintenant abandonnées
LocationPoller
pour tenter de répondre à cela, et un autre développeur a fourche et étendu. Vous pouvez essayer de la fourche ou tout simplement l'utiliser comme une source d'idées.Serait la
requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
avec un manifeste enregistré récepteur souffrent du même problème ? Ce qui est, est laAlarmManager
utilisé pour fournir le PendingIntent (dans ce cas, le récepteur sera réveillé) ?Désolé, mais je ne comprends pas vos questions.
Si au lieu d'utiliser
requestLocationUpdates (...LocationListener listener)
- je utiliserrequestLocationUpdates(... PendingIntent pi)
avec certainspi = PendinIntent.getBroadcast()
- inscrit le récepteur pour recevoir la diffusion - lapi
être livré par laAlarmManager
- de sorte qu'il va se réveiller le récepteur (et pas besoin pour l'éveil des verrous) ? Désolé si j'étais pas clairOui, même si la fourche est toujours autour de. J'ai mis à jour la réponse. Merci!
OriginalL'auteur CommonsWare
essayez ceci:
Je suis en train de faire pour obtenir une position avec le GPS, mais mon projet fonctionne toutes les 10 secondes. Je n'ai aucune idée maintenant. Et mon code :
OriginalL'auteur user2210048