Les notifications La géolocalisation 1
Notification Une notification est une indication placée dans la barre des notifications : Pour voir le détail de la notification, déplacer cette barre vers le bas : Evidemment ces IHM dépendent de la version Android utilisée Voir démo projet Ch3NotificationProjet bibliographie : http://nbenbourahla.developpez.com/tutoriels/java/android_not 2 ification/
Création d'une notification private final void createnotification(){ O//Création de la notification avec spécification de l'icône de la notification et //le texte qui apparait à la création de la notification //Récupération du titre et description de la notification String notificationtitle = getresources().getstring(r.string.notification_title); String notificationdesc = getresources().getstring(r.string.notification_desc); NotificationCompat.Builder mbuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.notification).setContentTitle(notificationTitle).setContentText(notificationDesc); // Définition de la redirection au moment de la sélection de la notification. // Dans notre cas la notification redirige vers notre application PendingIntent pendingintent = PendingIntent.getActivity(this, 0, new Intent(this, TutoNotificationHomeActivity.class), 0); // Construction de la notification et de ses caractéristiques (vibration,...) mbuilder.setcontentintent(pendingintent); Notification notification = mbuilder.build(); notification.vibrate = new long[] {0,200,100,200,100,200}; } //Récupération du notification Manager NotificationManager notificationmanager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notificationmanager.notify(notification_id, notification); 3
Construction d'une notification On construit une notification à l'aide d'un NotificationCompat.Builder Euh au début on utilisait le constructeur Notification(...) puis on a utilisé Notification.Builder(...)! Lorsque l'utilisateur sélectionne la notification, il sera redirigé vers une activité décrite par un PendingIntent qui est construit par la méthode public static PendingIntent getactivity (Context context, int requestcode, Intent intent, int flags) requestcode n'est, en fait, pas utilisé intent est créé par new Intent(...) dont le second argument est l'activité qui sera lancée flags indique comment doit être utilisé l'intent envoyé à l'activité. 0 convient très bien! Le NotificationCompat.Builder permet de construire la notification (avec build()) et de l'assembler avec le PendingIntent (avec setcontentintent()) 4
Faire vibrer le smartphone et avertir le NotificationManager Par la suite, on indique que la notification devra faire vibrer le smartphone par : notification.vibrate = new long[] {0,200,100,200,100,200}; Pour cela, on utilise la donnée membre publique (beurk) vibrate de la notification. On l'initialise par un tableau de long, indiquant les durées de vibration et non-vibration en millisecondes Il faut aussi ajouter <uses-permission android:name="android.permission.vibrate" /> dans le fichier AndroidManifest.xml Enfin on indique au NotificationManager (qu'on a récupéré par getsystemservice(context.notification_service)) qu'il gère la notication d'id NOTIFICATION_ID 5
Détruire une notification private void deletenotification(){ NotificationManager notificationmanager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); //la suppression de la notification se fait grâce à son ID notificationmanager.cancel(notification_id); } Il suffit de lancer la méthode cancel() en passant l'id de la notification au NotificationManager Compléments sur les notifications : Voir à http://developer.android.com/training/notify-user/index.html, ainsi que http://developer.android.com/guide/topics/ui/notifiers/notifi cations.html 6
Notification : bibliographie Bibliographie sur les notifications : http://nbenbourahla.developpez.com/tutoriels/java/android_not ification/, et aussi : http://developer.android.com/training/notifyuser/index.html, http://developer.android.com/guide/topics/ui/notifiers/notifi cations.html Ce sont des composants utilisables à partir d'android 3.0 (API 11) 7
La géolocalisation 8
Les APIs de (géo)localisation Il existe 2 bibliothèques pour traiter le positionnement terrestre = la localisation = la géolocalisation L'ancienne est appelée l' "Android framework location APIs" La plus récente est la "Google Location Services API" qui est une partie des Google Play Services Evidemment l'utilisateur doit autoriser la géolocalisation sur son smarphone pour l'utiliser Voir à http://developer.android.com/guide/topics/location/index.html 9
L'API de (géo)localisation On utilise le package android.location La principale classe utilisée est android.location.locationmanager : elle donne accès au(x) service(s) de (géo)localisation On ne construit pas d'objet de cette classe : on récupère le (ce!) service de localisation par l'appel : Context.getSystemService(Context.LOCATION_SERVICE) Ayant obtenu ce service de localisation, l'application peut : interroger des LocationProvider pour connaître sa localisation s'enregistrer auprès de LocationProvider pour être averti régulièrement de sa localisation enregistré un Intent qui sera envoyé lorsque l'utilisateur est proche d'un localisation donnée 10
Géolocalisation : le code avec Android Framework Location // Récupérer le gestionnaire de localisation LocationManager locmanager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); // Définir un auditeur de localisation LocationListener loclistener = new LocationListener() { public void onlocationchanged(location location) { // Appelé lorsque une nouvelle localisation a été trouvée par le service // de localisation (le network location provider) utiliserlanouvellelocalisation(location); } public void onstatuschanged(string provider, int status, Bundle extras) {} public void onproviderenabled(string provider) {} public void onproviderdisabled(string provider) {} }; // Associer l'auditeur de localisation au gestionnaire de localisation locmanager.requestlocationupdates(locationmanager.gps_provider, 0, 0, loclistener); Remarque : en fait onlocationchanged() est appelée toutes les secondes dans genymotion. Donc il vaut mieux appeler utiliserlanouvellelocalisation() que si l'utilisateur a bougé de 1 mètre au moins 11
Distance entre deux points (1/2) On peut utiliser la méthode statique public static void distancebetween (double startlatitude, double startlongitude, double endlatitude, double endlongitude, float[] results) de la classe Location Elle calcule la distance en mètres entre les points (startlatitude, startlongitude) et (endlatitude, endlongitude) et éventuellement l'azimut du point initial et du point final par rapport à la direction donnée par la droite joignant les deux points Ces résultats sont dans le tableau results avec : results[0] = la distance entre les 2 points et éventuellement results[1] = l'azimut du point initial par rapport à cette droite results[2] = l'azimut du point final par rapport à cette droite Voir à http://www.movable-type.co.uk/scripts/latlong.html 12
Distance entre deux points (2/2) On peut aussi utiliser la méthode public float distanceto (Location dest) de la classe Location Par exemple : Location lo = new Location(""); Station tmpstation =... lo.setlatitude(tmpstation.getlat()); lo.setlongitude(tmpstation.getlng()); if (location.distanceto(lo) <= 400) { arrlist.add(tmpstation); } 13
L'interface android.location.locationlistener Cette interface demande à définir 4 méthodes : onlocationchanged(location location) qui est appelée quand une nouvelle localisation est récupérée onproviderdisabled(string provider) qui est appelée quand le fournisseur de localisation est désactivé par l'utilisateur onproviderenabled(string provider) qui est appelée quand le fournisseur de localisation est disponible pour l'utilisateur onstatuschanged(string provider, int status, Bundle extras) lors d'un changement de status du fournisseur de localisation (le fournisseur devient définitivement ou temporairement hors service, ou disponible) 14
Enregistrement de l'auditeur auprès du service de localisation L'auditeur (objet d'une classe implémentant cette interface LocationListener) est enregistré auprès du fournisseur de localisation par : public void requestlocationupdates ( String provider, long mintime, float mindistance, LocationListener listener) lancé sur ce fournisseur. Ainsi, le fournisseur de localisation sera appelé régulièrement Les arguments sont : provider le nom du fournisseur de localisation auprès duquel on s'enregistre mintime est la durée minimale (en millisecondes) entre deux notifications de positionnement. En fait cette valeur est donnée à titre indicatif mindistance est la distance (en mètres) minimale entre deux demandes de localisation pour obtenir de nouvelles notifications Pour obtenir des notifications de position aussi fréquente que possible, mettre les deux paramêtres mintime et mindistance à 0 listener le listener utilisé qui lancera sa méthode onlocationchanged(location) à chaque mise à jour de localisation 15
Valeurs possibles pour le fournisseur de localisation Le premier paramêtre de requestlocationupdates() (le provider) peut prendre pour valeur : LocationManager.NETWORK_PROVIDER pour utiliser le service des cellules réseaux téléphoniques cellulaires et le Wi-Fi LocationManager.GPS_PROVIDER pour utiliser le service GPS Ces deux constantes sont de type String Si on veut avoir les deux services, il faut lancer deux fois la méthode requestlocationupdates() 16
Remarque sur la localisation Recevoir une localisation n'est pas forcément immédiat. Si on veut une localisation rapidement il faut utiliser la méthode getlastknownlocation(string) Et donc après un premier appel // Récupérer le gestionnaire de localisation LocationManager locmanager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); écrire ensuite LocationProvider locationprovider = locmanager.getprovider(locationmanager.network_provider); // Ou bien LocationManager.GPS_PROVIDER Location dernierelocalisationconnue = locmanager.getlastknownlocation(locationmanager.gps_provider); Ayant une Location, on récupère la latitude et la longitude en degré par public double getlatitude() et public double getlongitude() 17
Pour utiliser un fournisseur de localisation Il faut indiquer explicitement dans l'androidmanifest.xml, que l'application a besoin d'un service de localisation par <manifest... > <uses-permission android:name="android.permission.access_fine_location" />... </manifest> Sans cela, l'application ne peut pas utiliser les services de localisation La permission ACCESS_FINE_LOCATION permet d'utiliser les deux services de localisation (le GPS et le réseau téléphonique et Wi-Fi) Si on ne veut que le service GPS, écrire GPS_PROVIDER. Si on ne veut que les services cellulaires et le Wi-Fi, indiquer ACCESS_COARSE_LOCATION 18
Retour sur les marqueurs Rappel : on ajoute des marqueurs sur une GoogleMap V2 par addmarker() Après ils restent! Eh oui, on les a ajouter (add)! Pour tous les enlever, une GoogleMap possède la méthode clear() Pour en enlever certains les méthodes addmarker() retourne une référence sur le marqueur ajouté. La classe Marker possède la méthode remove() GoogleMap map =... Marker lemarqueur = map.addmarker(...);... lemarqueur.remove(); 19
Bibliographie pour ce chapitre Pour ce chapitre http://developer.android.com/guide/topics/location/index.html pour la localisation 20
Fin 21