La géolocalisation et les alertes de proximité sous Android
La géolocalisation et les alertes de proximité sous Android
Le GPS est la solution la plus efficace pour localiser un appareil, cependant il s'agit aussi de la plus coûteuse en batterie. Une autre solution courante est de se localiser à l'aide des points d'accès WiFi à proximité et de la distance mesurée avec les antennes relais du réseau mobile les plus proches. Nous pouvons créer des applications permettant de géo-localiser le téléphone intelligent et d’afficher à l’utilisateur sa position actuelle. Un autre aspect de ce type d'applications est la création d'alertes de proximité. Comme leur nom l'indique, ce sont des alertes qui se générés lorsque l'utilisateur est physiquement situé à proximité d'un point d'intérêt particulier. Dans ce tutoriel, je vais vous montrer comment faire une alerte de proximité.
Dans cet exemple que nous allons voir, le fait d'être informés quand on s'approche d'un endroit ou qu'on s'en éloigne. Cet endroit peut être symbolisé par un cercle dont on va préciser le centre et le rayon. Ainsi, si on entre dans ce cercle ou qu'on sort de ce cercle, l'alerte est lancée.
Le prototype de la méthode qui peut créer une alerte de proximité est :
void addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent) avec :
• La latitude et la longitude du centre du cercle.
• Le rayon d'effet est précisé dans radius en mètres.
• expiration permet de déclarer combien de temps cette alerte est valable.
Tout nombre en dessous de 0 signifie qu'il n'y a pas d'expiration possible.
• Enfin, on donne aussi le PendingIntent qui sera lancé quand cette alerte est déclenchée, avec intent.
Cette fois, l'intent contiendra un booléen en extra, dont la clé est KEY_PROXIMITY_ENTERING et la valeur sera true si on entre dans la zone et false si on en sort.
Intent intent = new Intent(this, AlertReceiver.class);
PendingIntent pending=PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
// On ajoute une alerte de proximité si on s'approche ou s'éloigne du bâtiment de l’ENIS
locationManager.addProximityAlert(34.726590, 10.717195, 150, -1, pending);
On le recevra ensuite dans :
public class AlertReceiver extends BroadcastReceiver{
@Override public void onReceive(Context context, Intent intent)
{
// Vaudra true par défaut si on ne trouve pas l'extra booléen dont la clé est LocationManager.KEY_PROXIMITY_ENTERING bool entrer = booleanValue(intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, true));
}
}
Finalement avec void removeProximityAlert(PendingIntent intent) nous pouvons désactiver une alerte de proximité.
Ce que nous allons construire est une application simple qui stocke les coordonnées entré par l'utilisateur pour un point qui l'intéresse, puis fournir une notification lorsque l'utilisateur est à proximité de ce point. Les coordonnées sont récupérées à la demande lorsque l'utilisateur se trouve à ce point.
Il agit donc souvent comme un déclencheur.Son implémentation nécessite d’étendre la classe android.content.BroadcastReceiver et de déclarer les filtres d’intentions dans le manifeste.
Mais, si vous n’êtes intéressé qu’à la réception d'un BrodcastReceiver pendant l’exécution, il est préférable d'utiliser registerReceiver ().Ici, nous n’avons pas besoin de déclarer notre Receiver dans le manifest.
Nous commençons par créer un nouveau projet Eclipse, nommé "Proximity" .
Par la suite,à coté de notre activité principale nous devons créer une classe qui hérite de BrodcastReceiver. Le code de cette classe sera comme suit :
Qu’est-ce qu’un BroadcastReceiver ?
Bien que l’activité soit le premier composant permettant la gestion du cycle de vie d’une application Android et assure l’interaction avec l’utilisateur ; nous allons besoins parfois d’exécuter un traitement qui démarre automatiquement en tâche de fond et qui doit réagir à des événements externes comme un appel téléphonique. Android propose pour cela des composants de type service et receiver qui utilisent des intentions (Intent) pour collaborer. Le receiver est un composant susceptible de recevoir des intentions exprimées par le système Android ou d’autres applications.L’intérêt de ce composant réside en son exécution automatique dès qu’un événement correspondant survient.Il agit donc souvent comme un déclencheur.Son implémentation nécessite d’étendre la classe android.content.BroadcastReceiver et de déclarer les filtres d’intentions dans le manifeste.
public class ProximityReceiver extends BroadcastReceiver { @SuppressWarnings("deprecation") @Override public void onReceive(Context context, Intent intent) { //Variable Key pour déterminer si l'utilisateur quitte ou entre String key = LocationManager.KEY_PROXIMITY_ENTERING; //Variable booléenne pour savoir si l'utilisateur entre ou sort boolean state = intent.getBooleanExtra(key, false); if(state){ Log.i("TAG", "Bienvenue"); Toast.makeText(context, "Bienvenue", Toast.LENGTH_SHORT).show(); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); //Faire une sonnerie de message ou vibreur (suivant le mode par défaut) //lors de l'entré de l'utilisateur AudioManager audiomanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); switch (audiomanager.getRingerMode()) { case AudioManager.RINGER_MODE_SILENT: Log.i("Mode","mode silencieux"); break; case AudioManager.RINGER_MODE_VIBRATE: Log.i("Mode"," mode vibreur"); break; case AudioManager.RINGER_MODE_NORMAL: Log.i("Mode"," mode normale"); break; } PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0); Notification notification = createNotification(); notification.setLatestEventInfo(context, "Alerte de bienvenue","Bienvenue dans notre zone!", pendingIntent); notificationManager.notify(1000, notification); }else{ Log.i("MyTag", "Thank you for visiting my Area,come back again !!"); Toast.makeText(context, "Merci d'avoir nous visiter! Au revoir!", Toast.LENGTH_SHORT).show(); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0); Notification notification = createNotification(); notification.setLatestEventInfo(context, "Alerte de quitter","Merci d'avoir nous visiter! Au revoir!", pendingIntent); notificationManager.notify(1000, notification); //Faire une sonnerie de message ou vibreur (suivant le mode par défaut) //lors de la sortie de l'utilisateur AudioManager audiomanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); switch (audiomanager.getRingerMode()) { case AudioManager.RINGER_MODE_SILENT: Log.i("Mode","Silent mode"); break; case AudioManager.RINGER_MODE_VIBRATE: Log.i("Mode","Vibrate mode"); break; case AudioManager.RINGER_MODE_NORMAL: Log.i("Mode","Normal mode"); break; } } } //créer une notification private Notification createNotification() { Notification notification = new Notification(); notification.icon = R.drawable.ic_launcher; notification.when = System.currentTimeMillis(); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.flags |= Notification.FLAG_SHOW_LIGHTS; notification.defaults|= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; notification.defaults |= Notification.DEFAULT_LIGHTS; notification.ledARGB = Color.WHITE; notification.ledOnMS = 1500; notification.ledOffMS = 1500; return notification; } }Pour notre activité principale son code sera comme suit :
public class MainActivity extends Activity implements LocationListener { LocationManager locationManager; //définir deux variables pour la latitude et la longitude double lat=34.727518 ,longitude=10.717547; //le Rayon en Radius float radius=100; //Intent Action String ACTION_FILTER = "com.example.proximity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //l'enregistrement de notre BrodcastReceiver registerReceiver(new ProximityReceiver(), new IntentFilter(ACTION_FILTER)); //s'abonner au service de géolocalisation locationManager=(LocationManager) getSystemService(LOCATION_SERVICE); //s'abonner au mise à jour de la géolocalisation locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this); //Configurer l'Intent de Broadcast Intent i= new Intent(ACTION_FILTER); PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), -1, i, 0); //Configurer notre addProximityAlert locationManager.addProximityAlert(lat, longitude, radius, -1, pi); } @Override //Pour le débogage juste pour voir la distance entre ma position actuelle et le point de proximité public void onLocationChanged(Location newLocation) { Location old = new Location("OLD"); old.setLatitude(lat); old.setLongitude(longitude); double distance = newLocation.distanceTo(old); Log.i("la distance", "Distance: " + distance); } @Override public void onProviderDisabled(String arg0) {} @Override public void onProviderEnabled(String arg0) {} @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} }
Et il ne faut pas oublier d’ajouter ces déclarations à notre manifest :<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.VIBRATE"/>
Bonjour, je me demande à quoi sert la ligne : "String ACTION_FILTER = "com.example.proximity"; " ?
RépondreSupprimerSerait-il possible d'avoir des informations la dessus? Pour mon appli , dois-je prendre cette ligne telle quelle?
Bonjour
RépondreSupprimer"com.example.proximity" est le nom du package qui contient les activités du projet ,on utilise la variable String "ACTION_FILTER" qui contient le nom du package au niveau des IntentFilter pour l'enregistrement du BroadCast et pour la configuration de l'intent de BroadCast.
Bonjour,je me demande à quoi sert la ligne :" notification.setLatestEventInfo(context,"Alerte de bienvenue","Bienvenue dans notre zone!", pendingIntent);" ?
RépondreSupprimeret Il reçoit un erreur on :"setLatestEventInfo".
setLatestEventInfo() method is removed from the Android 6.0.
SupprimerTo do notifications for api 4 onwards you can use the NotificationCompat.Builder which was added in the Android Support Library. The Android Documentation has a decent example:
SupprimerNotification noti = new Notification.Builder(mContext)
.setContentTitle("New mail from " + sender.toString())
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail)
.setLargeIcon(aBitmap)
.build();
You can replace "Notification.Builder" for "NotificationCompat" if need to support older api versions.