IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Géofencing (Localisation d'un utilisateur)


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut Géofencing (Localisation d'un utilisateur)
    Bonjour à tous,

    Dans le cadre d'une application, j'ai besoin d'actualiser et de récupérer les informations de localisation d'un utilisateur régulièrement, même une fois l'application arrêtée.

    En effet mon objectif est d'envoyer à intervalles réguliers la position de l'utilisateur à un serveur pour faire du Géofencing. Ainsi en fonction de la position de l'utilisateur reçue par le serveur, ce dernier va décider de lui envoyer ou non une notification (via Google Cloud Messaging).

    J'ai actuellement un service se chargeant de réaliser en arrière-plan le traitement voulu, seulement celui-ci ne fonctionne que si l'application est au premier plan.

    J'ai également regardé du côté de la méthode addProximityAlert() disponible sur une instance du LocationManager mais ceci ne réponds pas totalement à mon besoin (en effet cette méthode me permet d'envoyer la position de l'utilisateur au serveur lorsqu'il entre ou sort d'une zone précise mais uniquement à ce moment précis et non régulièrement comme je le souhaite).

    Voici donc ma question :

    Est-il possible, à intervalles réguliers, de récupérer la position de l'utilisateur et d'effectuer un appel réseau pour l'envoyer à un serveur, et ce quel que soit l'état de l'application (au premier plan, en arrière plan ou arrêtée) ? Si oui, comment ?

    En vous remerciant par avance de vos réponses,

    Nylwen

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Salut.

    Oui via les Services . Maintenant méfie toi car ce principe est un gros consommateur de batterie, il va falloir réguler la fréquence s des points saisies ainsi que l'envoie au serveur sinon le téléphone ne vas tenir qu'une heure.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci pour ta réponse. J'ai donc approfondi l'approche concernant les services. Le problème que je rencontrais venait de la manière dont j'envoyais les coordonnées au serveur. J'utilise maintenant une URLConnection et mon service fonctionne correctement même en arrière plan.

    Concernant la consommation de batterie, quel est l'intervalle idéal pour avoir des données régulièrement sans consommer trop de batterie ? Actuellement j'effectue une actualisation toutes les 30 secondes, ce qui consomme 3 à 4 % de batterie par heure en ayant d'autres applications comme par exemple Facebook en arrière plan. Ceci est-il correct ou est-ce trop gourmand en ressources ?

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    ca me semble correct . Tout dépends du niveau de précision que tu souhaites .

    Après tu peux toujours proposer une fourchette a l'utilisateur dans les préférences. 30s- 5 min par exemple.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    D'accord merci, je marque le sujet comme résolu.

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    3 à 4% par heure me semble très très faible... (c'est ce que mon téléphone "mange" par heure sans aucune application active, sauf les synchronisations bien sur).

    J'imagine donc que tu conserve un WakeLock pour garder le téléphone éveillé... Donc le téléphone reste éveillé, et toutes les fonctionnalités réseau (et GPS) restent activées.

    Ce qui coûte cher c'est l'établissement de ces connexions (4G,3G+,3G,Edge,Fix GPS,WiFi scan,...).
    Par exemple, une appli qui "réveille" le téléphone toutes les 30s pour accéder au réseau va demandant 20x de batterie qu'une appli qui conserve le réseau ouvert et l'utilise toutes les 30s (cf Glympse qui n'est pas un gouffre en batterie et conserve GPS/Data activés).

    Par contre, si il y a un service d'arrière plan, il est obligatoire d'avoir une notification active pour pouvoir accéder à l'application d'un clic, et arrêter le service.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    J'ai laissé tourner le service pendant une heure sur un Google Nexus 4 et sur un Samsung Galaxy S3 et dans les deux cas j'obtiens environ 4 % de consommation de batterie.

    Non je n'utilise pas de WakeLock car jusqu'à ce que tu m'en parle je ne connaissait même pas ce composant. Si ceci peut permettre d'économiser encore plus la batterie peut-être devrais en ajouter un. Il faudrait donc que je lance dans le onCreate() de mon service et que je l'arrête dans le onDestroy() ?

    En cherchant un peu sur Google j'ai trouvé ceci :

    http://stackoverflow.com/questions/2...kelock-to-work

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private PowerManager.WakeLock wl;
     
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
    }//End of onCreate
     
    @Override
    protected void onPause() {
        super.onPause();
        wl.release();
    }//End of onPause
     
    @Override
    protected void onResume() {
        super.onResume();
        wl.acquire();
    }//End of onResume
    Ce code conviendrait-il ?

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Haaa mais si tu n'utilises pas de wakelock, le service n'est peut-être pas exécuté du tout ! (le téléphone entrant en mode veille), ceci explique peut-être la consommation si faible !

    Sur une heure, téléphone au repos, écran éteint... as tu bien des échantillons toutes les 30s ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    Sur une heure oui le serveur reçoit bien les échantillons de données, mais je viens de voir qu'au bout de quelques heures le serveur ne reçoit plus rien, j'imagine qu'Android doit arrêter mon service au bout d'un moment ?

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne sais pas... il faudrait voir le code du service... le seule code posté est celui d'une activité (donc sujet à destruction par Android pour n'importe quelle raison valable, comme la réception d'un appel par exemple).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    Voici donc le code de mon service de localisation, je ne détaille pas la méthode envoyerLocalisation() qui me sert à envoyer les coordonnées au serveur car cette portion de code est fonctionnelle et ne concerne pas directement le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
     
    public class ActualisationCoordonnees extends Service
    {
    	private String provider;
     
    	private Preferences preferences;
     
    	private LocationManager locationManager;
     
    	private LocationListener locationListener = new LocationListener()
    	{
    		@Override
    		public void onStatusChanged(String provider, int status, Bundle extras)
    		{
     
    		}
     
    		@Override
    		public void onProviderEnabled(String provider)
    		{
    			Criteria precision = new Criteria();
     
    			precision.setAccuracy(Criteria.ACCURACY_FINE);
     
    			provider = locationManager.getBestProvider(precision, true);
     
    			locationManager.requestLocationUpdates(provider, 30000, 0, locationListener);
    		}
     
    		@Override
    		public void onProviderDisabled(String provider)
    		{
    			Criteria precision = new Criteria();
     
    			precision.setAccuracy(Criteria.ACCURACY_FINE);
     
    			provider = locationManager.getBestProvider(precision, true);
     
    			locationManager.requestLocationUpdates(provider, 30000, 0, locationListener);
    		}
     
    		@Override
    		public void onLocationChanged(Location location)
    		{
    			String latitude = String.valueOf(location.getLatitude());
     
    			String longitude = String.valueOf(location.getLongitude());
     
    			preferences.setLatitudePreference(latitude);
     
    			preferences.setLongitudePreference(longitude);
     
    			envoyerLocalisation();
    		}
    	};
     
    	@Override
    	public IBinder onBind(Intent intent)
    	{
    		return null;
    	}
     
    	@Override
    	public void onCreate()
    	{
    		super.onCreate();
     
    		preferences = new Preferences(getApplicationContext());
     
    		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
     
    		Criteria precision = new Criteria();
     
    		precision.setAccuracy(Criteria.ACCURACY_FINE);
     
    		provider = locationManager.getBestProvider(precision, true);
     
    		locationManager.requestLocationUpdates(provider, 30000, 0, locationListener);
    	}
     
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId)
    	{
    		return super.onStartCommand(intent, flags, startId);
    	}
     
    	@Override
    	public void onDestroy()
    	{
    		super.onDestroy();
     
    		locationManager.removeUpdates(locationListener);
    	}
     
    	private void envoyerLocalisation()
    	{
    		new ImplementationBackgroundService(getBaseContext())
    		{
    			@Override
    			protected void doInBackground()
    			{
    				String latitude = preferences.getLatitudePreference();
     
    				String longitude = preferences.getLongitudePreference();
     
    				WebService webService = new WebService();
     
    				if (!(latitude.isEmpty() || longitude.isEmpty()))
    				{
    					String valeur = GenererRequete.requeteServiceActualisationCoordonnees(preferences, preferences.getIdentifiantPreference(), latitude, longitude);
     
    					Element resultat = webService.executer(valeur, getApplicationContext(), preferences);
     
    					webService.terminer(resultat);
    				}
    			}
    		}.execute();
    	}
    }

  12. #12
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    J'ai pas lu tout le thread en détail , mais je crois aps avoir vu ce lien circuler :
    http://developer.android.com/trainin...eofencing.html

    Peut être que ça pourrait t'aider...
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci pour le lien, cependant cette partie du traitement est, dans mon cas, réalisée côté serveur. Mon titre est sûrement mal choisi du coup puisque ce que je recherche à faire est l'envoi permanent de données de localisation au serveur.

    En tout cas merci de ta réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoyé la localisation de l'utilisateur par SMS
    Par noussa17 dans le forum Android
    Réponses: 5
    Dernier message: 21/06/2013, 18h56
  2. Localisation de l'utilisateur par adresse IP
    Par helpcomm dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 29/10/2009, 10h21
  3. localisation géographique de l'utilisateur
    Par sliderman dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/07/2007, 16h03
  4. comptes utilisateurs stable et localiser
    Par myinformatique dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 25/04/2007, 17h57
  5. Localisation des utilisateurs ou membres du forum
    Par nicorem dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 23/11/2006, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo