Merci CommsWare. En raison de la limitation d'espace dans le champ de commentaire, j'utilise cette façon de répondre.
Les utilisateurs sont supposés prendre une photo d'un objet qu'ils sont sur le point de ramasser et de l'envoyer au serveur. Une fois cela fait, le serveur renvoie une période de cycle d'interrogation pour que le téléphone envoie son emplacement périodiquement. J'ai mis en place le textViews
pour montrer le lat/long acquis (voir ci-dessous), mais cette partie ne fonctionnait pas jusqu'à il y a deux nuits. Cela a finalement fonctionné après que j'étais un peu plus patient et ai laissé le téléphone prendre son temps pour acquérir une position. Je pense que le problème était que je ne permettais pas au téléphone d'obtenir une position fixe, donc ça ne fonctionnait pas. Le problème reste maintenant que les mises à jour périodiques peuvent ne pas fonctionner, basé sur ce que vous avez dit, et basé sur le fait que je suis resté dehors sous un ciel complètement dégagé pendant environ 2 minutes avant d'obtenir un correctif de position.
Voici un aperçu de quelques-uns du code (cette partie est l'activité principale override onCreate de pour obtenir le premier emplacement fixe):
`LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, new LocationListener() {
public void onStatusChanged(String provider, int status,
Bundle extras) {
// called when the provider status changes. Possible
// status: OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE or
// AVAILABLE.
}
public void onProviderEnabled(String provider) {
// called when the provider is enabled by the user
}
public void onProviderDisabled(String provider) {
// called when the provider is disabled by the user, if
// it's already disabled, it's called immediately after
// requestLocationUpdates
}
public void onLocationChanged(Location location) {
double latitute = location.getLatitude();
double longitude = location.getLongitude();
tv5.setText(""+latitute);
tv6.setText(""+longitude);
}
});
`
Ci-dessous est une partie de la requête SOAP et mécanisme de gestion de réponse.
`// Récupère la période d'interrogation en secondes. Chaîne [] getPollNumber; getPollNumber = resultParams [2] .split (";");
//Set up the intent to be passed to the tracking service.
Intent updateLocation = new Intent (this,TrackUser.class);
PendingIntent pendingIntent = PendingIntent.getService(PickUp.this, 0, updateLocation, 0);
//Set up the alarm manager to be used to periodically send updates.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//If instruction = 1, start tracking the user.
if(instruction == 1)
{
//Start tracking service on phone.
pollPeriod = Integer.parseInt(getPollNumber[0]);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (pollPeriod*1000), pollPeriod*1000, pendingIntent);
}
else
{
if(instruction == 0)
{
//Stop tracking service.
stopService(new Intent(this,TrackUser.class));
alarmManager.cancel(pendingIntent);
}
}
'
Dans la classe de service de suivi, j'utilise une méthode appelée de son remplacement onStart() qui emballe tout simplement les coordonnées actuelles dans un objet SOAP et met à jour le serveur. Je crains que le GPS n'ait pas assez de temps pour se verrouiller pendant ces mises à jour si le téléphone se met en veille comme vous l'avez dit. Je me demande si lorsque le service est démarré, je devrais avoir une minuterie de quelque sorte (peut-être le paramètre minTime de requestLocationUpdates?) Tenir le téléphone éveillé pendant environ 3 minutes afin qu'une solution puisse entrer? S'il vous plaît laissez-moi savoir si ces extraits de code aident, et si l'idée de mettre à jour la position est possible, merci.