2010-05-08 13 views
1

J'ai construit une application pour le Motorola Droid qui devrait automatiquement mettre à jour un serveur avec l'emplacement du téléphone. Une fois que l'utilisateur a effectué une tâche particulière sur l'écran d'activité principal, une alarme est définie pour mettre à jour périodiquement l'emplacement de l'utilisateur à l'aide d'un service. L'alarme est explicitement arrêtée lorsque l'utilisateur termine une autre tâche. Cela dit, j'ai mis en place un gestionnaire de localisation dans la méthode onCreate() de l'activité principale qui est supposée placer le premier lat/long acquis dans deux champs de textview. Même si le manifeste est configuré pour l'acquisition de coords grossiers et fins et que j'utilise requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener), avec minTime et minDistance mis à zéro, je ne vois pas les coords apparaitre à l'écran. Avec cela, je ne suis pas en train d'enregistrer des emplacements sur le serveur.Définition de l'emplacement acquis dans une vue de texte: comment procéder?

Lorsque je graine les textviews avec des exemples de coordonnées, ils sont correctement enregistrés sur le serveur. Je ne suis pas à un ordinateur qui peut exécuter l'IDE, donc ne pas avoir le code actuellement, mais je suis désespéré pour de l'aide à ce sujet.

Une autre chose est que l'écran d'activité principal appelle une application de photographie avant que l'utilisateur clique manuellement sur "Envoyer des données". Je soupçonne que je devrais remplacer la méthode onResume() de l'activité principale pour effectuer cette acquisition d'emplacement. S'il vous plaît, aidez, merci.

Marque.

Répondre

0

Pour quelque chose de si complexe, sans code, il est très difficile de vous aider. Prendre un coup total dans le noir, en essayant d'utiliser requestLocationUpdates() en conjonction avec une alarme AlarmManager et un service est difficile à faire. Si le service est un IntentService, par exemple, et qu'il s'enregistre pour les mises à jour d'emplacement, dans le meilleur des cas, il échouera tout simplement, et dans le pire des cas, vous fuirez la mémoire comme un tamis. Il est également important de s'assurer que l'appareil est éveillé pendant que vous attendez que le correctif d'emplacement arrive, car l'appareil peut avoir tendance à vouloir se rendormir.

Je n'ai aucune idée d'où les TextViews entrent en jeu pour tout cela, ou ce qu'ils ont à faire avec un serveur, ou ce qu'ils ont à voir avec onResume(), ou ce qu'ils ont à faire avec "une application de photographie" .

0

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.