Je développe une démo pour mon application, dans laquelle il y a deux boutons nommés "START" et "STOP". Lorsque l'utilisateur tape sur "START", il commence à marcher. Ce que je veux faire est de faire en sorte que lorsque les utilisateurs tapent sur "STOP", la démo calcule sa distance entre "START" et "STOP". Si l'utilisateur a appuyé sur "START" et appuyé sur "STOP" sans faire un seul pas, alors il doit afficher 0 km ou 0 m. Je n'ai aucune idée de la façon dont je devrais commencer ceci; veuillez faire une suggestion.
Une façon de procéder consiste à utiliser les données de l'accéléromètre. Votre application doit enregistrer en continu les données de l'accéléromètre après que l'utilisateur a appuyé sur le bouton Démarrer. Vous observerez un pic dans vos données chaque fois que l'utilisateur fait un pas. Appliquez un filtre sur ces données et vous pourrez détecter le nombre de pas effectués avec une précision raisonnable. Multipliez-le par la longueur du pas et vous devriez obtenir une approximation de la distance parcourue. Prenez la hauteur de l'utilisateur comme argument d'entrée. La longueur du pas est d'environ 0,45 * Hauteur d'une personne. Puisque cette approche est indépendante du GPS, elle fonctionnera également à l'intérieur. EDIT: Vous devrez utiliser les valeurs de l'accéléromètre pour les trois axes pour le rendre assez indépendant de l'orientation de l'appareil.Vous pouvez aller avec x ^ 2 + y ^ 2 + z ^ 2
Il y a d'autres façons de le faire:
Vous pouvez également vérifier Estimation des piétons morts
Demandez des autorisations GPS dans votre application. Lorsque le début est tapoté, enregistrez les coordonnées GPS. Faites de même pour l'arrêt. Vous avez maintenant deux coordonnées. Vous pouvez ensuite appliquer la formule de distance pour obtenir la distance totale parcourue.
Modifier:
En ce qui concerne le cas clarifié dans les commentaires, je pense que vous devez vous pencher sur les capteurs de mouvement d'Android. Vous devrez peut-être faire beaucoup d'hypothèses ou demander à vos utilisateurs de calibrer votre application avant de l'utiliser réellement.
Supposons que vous connaissez le facteur de rythme de votre utilisateur. En utilisant le capteur de mouvement, chronométrez combien de temps l'utilisateur "marche" (évidemment, il n'y a pas de moyen facile de déterminer si votre utilisateur marche réellement ou secoue simplement le téléphone). Multipliez cela par le facteur de rythme de votre utilisateur et vous aurez une idée assez approximative de la quantité de marche que votre utilisateur a faite.
Comment to "Il y a un problème avec cette solution. Si vous voyagez à vitesse constante, l'accélération est de 0, donc l'accéléromètre ne reprendra aucune mesure. - jnovacho il y a 16 secondes" (désolé, n'a pas assez de réputation pour commenter directement)
lorsque vous effectuez une accélération, enregistrez l'accélération et calculez la vitesse à laquelle vous marchez. Arrêtez le calcul de la vitesse chaque fois que l'accélération change et recommencez. Si vous vous arrêtez, vous devriez recevoir une accélération négative, vous devrez alors calculer si vous venez de ralentir ou de vous arrêter complètement. Mais c'est tout simplement mathématique :)
J'étais allé avec la méthode Gps. Avec les étapes suivantes: Au clic du bouton de démarrage, la latitude et la longitude du point de départ ont été récupérées et stockées dans mon dto avec un TripId approprié.
sur le clic du bouton d'arrêt:
TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);
La distance renvoyée par la méthode location.distanceTo () est en mètres.
public double getDistance(double lat1, double lon1, double lat2, double lon2)
{
double latA = Math.toRadians(lat1);
double lonA = Math.toRadians(lon1);
double latB = Math.toRadians(lat2);
double lonB = Math.toRadians(lon2);
double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
(Math.sin(latA) * Math.sin(latB));
double ang = Math.acos(cosAng);
double dist = ang *6371;
return dist;
}
Essayez d'utiliser des capteurs pour cela, je pense que vous ne devriez pas utiliser le GPS car il peut ne pas être aussi précis. Reportez-vous au projet de podomètre open source suivant pour ce dont vous parlez.
Met à jour cette réponse avec un code plus spécifié si vous souhaitez utiliser le capteur.