APPLICATIONS JAVA Android Partie IV Ivan MADJAROV - 2014 Applications Java sous Android IvMad, 2011-2015 4. Géolocalisation, Géocodage, Wi-Fi, Bluetooth, Applications réseaux TCP L'objectif principal de ce cours est de découvrir la programmation sous Android, sa plate-forme de développement et les spécificités du développement embarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichi des supports disponibles sur Internet. 2 Applications Java sous Android IvMad, 2011-2015 3 Géolocalisation : Le principe • La géolocalisation se base sur Global Positioning System (GPS) • GPS compte 24 satellites répartis sur 6 orbites parcourues en 12h pour couvrir le globe terrestre. • Les satellites NAVSTAR (Navigation Satellite Timing And Ranging) sont situés à 20184 km d'altitude et diffusent leur position et l'heure sur des fréquences dans la bande des micro-ondes (~1500Mhz). • Le GPS se synchronise puis calcule la distance avec le satellite grâce à la différence de temps en émission et réception. • distance = deltaT * c (~vitesse de la lumière ~300000km/s) • Le GPS fonctionne par triangulation. 1 4 satellites sont nécessaires pour calculer la position et l'altitude. 3 2 Position détectée avec 3 satellites sur une surface 2D Source: Yann Caron, Programmation Android - CNAM 2014 Applications Java sous Android IvMad, 2011-2015 4 Java Android : Géolocalisation (1) • Les deux principaux éléments pour utiliser les services de géolocalisation sont: • Gestionnaire de localisation qui fournit l'accès aux services de localisation • Fournisseur de localisation en fonction de la technologie utilisée pour la localisation de l'appareil. • Pour accéder au gestionnaire de localisation il faut obtenir l'instance de LOCATION_SERVICE par la méthode getSystemService: String serviceName = Context.LOCATION_SERVICE; LocationManager locationManager = (LocationManager)getSystemService(svcName); • L'utilisation des services doit être déclarer dans le fichier AndroidManifest.xml avec la ligne: <uses‐permission android:name="android.permission.ACCESS_FINE_LOCATION"/> Applications Java sous Android IvMad, 2011-2015 5 Java Android : Géolocalisation (2) • Pour trouver le dernier emplacement connu par le GPS on s'adresse à un fournisseur de localisation avec la méthode getLastKnownLocation: String provider = LocationManager.GPS_PROVIDER; Location loc = locationManager.getLastKnownLocation(provider); • La méthode getLastKnownLocation ne demande pas au fournisseur de localisation de mettre à jour la position courante! • L'objet Location renvoyé inclut toutes les informations de position disponibles dans le fournisseur: • Latitude (méthode location.getLatitude();) • Longitude (méthode location.getLongitude();) • Altitude (méthode location.getAltitude();) • Vitesse et heure à laquelle la position a été déterminée (getSpeed()) Applications Java sous Android IvMad, 2011-2015 Java Android : Géolocalisation (3) 6 Applications Java sous Android IvMad, 2011-2015 7 Java Android : Géolocalisation (4) • L'exemple précédent s'appuie sur la dernière position connu (getLastKnownLocation(provider)) • L'exemple peut évoluer en équipant l'application d'un écouteur de changement de position pour qu'on puisse mettre à jour la position suivant son évolution. • Les mises à jour peuvent être programmées pour toutes les 2 secondes et lorsqu'un déplacement est détecté de plus de 5 mètres. • Plutôt que sélectionner un fournisseur (provider), on peut laisser Androïd choisir le provider disponible le mieux adapté à l'environnement ou aux critères déposés (objet Criteria) • Créer une instance de LocationListever qui déclenchera la méthode updateWithNewLocation chaque fois qu'un changement de position sera détecté. Applications Java sous Android IvMad, 2011-2015 Java Android : Géolocalisation (5) 8 Applications Java sous Android IvMad, 2011-2015 9 Java Android : Géolocalisation (6) • En général une unité mobile Androïd propose des moyens de déterminer sa géolocalisation: • Par triangulation des stations GPS (Global Positioning System), • Par recouvrement des cellules mobiles (3G/4G), • Par le réseau Wifi. • Pour une géolocalisation on implémente l'interface LocationListener. • On s'adresse ensuite à l’objet LocationManager pour gérer l'abonnement aux mises à jour des coordonnées GPS. • Dans l'Activité (View) on surcharge 4 méthodes : • onProviderEnabled est appelée quand une source de localisation est activée; • onProviderDisabled est appelée quand une source de localisation est désactivée; • onStatusChanged est appelée quand le statut d’une source change; • onLocationChanged est appelée quand les coordonnées GPS changent. Applications Java sous Android IvMad, 2011-2015 10 Java Android : Géolocalisation (7) • Pour s’abonner à la mise à jour des coordonnées GPS, il faut utiliser la méthode requestLocationUpdates(String, long, float, LocationListener) qui possède 4 arguments : • Le provider utiliser pour recevoir les mises à jour des coordonnées utilisateurs (GPS / NETWORK …) • L'intervalle minimum entre deux notifications (en millisecondes) • L'intervalle minimum entre deux notifications (en mètre) • L’instance du LocationListener • Il est conseillé de s’abonner aux mises à jour des coordonnées GPS dans la méthode onResume et de se désabonner dans la méthode onStop afin de stopper l’utilisateur des ressources de localisation alors que l’application n’en a plus l’utilité, sinon le processus de mise à jour continu est la consommation de la batterie est importante. Applications Java sous Android IvMad, 2011-2015 11 Java Android : Géolocalisation (8) • Pour trouver les fournisseurs de localisation disponibles: LocationManager.GPS_PROVIDER; LocationManager.NETWORK_PROVIDER; LocationManager.PASSIVE_PROVIDER; // localisation par GPS // localisation par Wi‐Fi // localisation par GSM (2G/3G/4G) • Le fichier AndroidManifest.xml doit être enrichi avec les permissions requises pour accéder aux services de localisation, Internet et au GPS: <uses‐permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses‐permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses‐permission android:name="android.permission.INTERNET" /> Applications Java sous Android IvMad, 2011-2015 Java Android : Géolocalisation (9) 12 Applications Java sous Android IvMad, 2011-2015 13 Java Android : Géocodage (1) • Le géocodage traduit des adresses en coordonnées géographiques et inversement avec la classe Geocoder dont l'utilisation demande deux permissions dans le manifest de l'activité: <uses‐library android:name="com.google.android.maps" /> <uses‐permission android:name="android.permission.INTERNET" /> • La classe Geocoder donne accès à deux fonctions de géocodage: • Géocodage avant qui donne la latitude et la longitude d'une adresse; • Géocodage inverse qui donne l'adresse en fonction de la latitude et la longitude. • Les fonctions renvoient une liste d'objets Address. La granularité de la liste dépend des limites indiquées à l'appel. Geodecoder geodecoder = new Geodecoder(getApplicationContext(),Local.getDefault()); List<Address> addresses = null; Applications Java sous Android IvMad, 2011-2015 Java Android : Géocodage (2) 14 Applications Java sous Android IvMad, 2011-2015 15 Android : Wi-Fi (1) • Le Wi-Fi est géré par un WifiManager. • Le WifiManager représente un Android Wi-Fi Connectivity Service. • configurer une connexion Wi-Fi, • gérer une connexion en cours, • scanner pour des points d'accès, • enregistrer tout changement dans une connexion Wi-Fi. • Le Wi-FiManager utilise la méthode getSystemService en précisant le type de service en constante: Context.WIFI_SERVICE String service = Context.WIFI_SERVICE; WifiManager wifi = (WifiManager)getSystemService(service); • L'autorisation pour l'utilisation du WiFiManager doit être inscrite dans le fichier manifest du projet: <uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses‐permission android:name="android.permission.CHANGE_WIFI_STATE"/> Applications Java sous Android IvMad, 2011-2015 16 Android : Wi-Fi (2) • Le Wi-FiManager peut: • activer ou désactiver la fonction Wi-Fi par la méthode setWifiEnabled, • obtenir le statut actuel du Wi-Fi par la méthode getWifiState, • vérifier si le Wi-Fi est activé avec la méthode isWifiEnabled. if (!wifi.isWifiEnabled()) if (wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING) wifi.setWifiEnabled(true); • La méthode getWifiState() retourne un entier entre 0 et 4 pour indiquer la situation en cours du WiFi de l'appareil : 0 1 2 3 4 ‐ ‐ ‐ ‐ ‐ WIFI_STATE_DISABLING WIFI_STATE_DISABLED WIFI_STATE_ENABLING WIFI_STATE_ENABLED WIFI_STATE_UNKNOWN Applications Java sous Android IvMad, 2011-2015 17 Android : Wi-Fi (3) • En mettant tout ensemble on vérifie l'état de l'appareil : public class WiFiStateActivity extends Activity { String[] wifiState = {"WIFI_STATE_DISABLING", "WIFI_STATE_DISABLED", "WIFI_STATE_ENABLING", "WIFI_STATE_ENABLED", "WIFI_STATE_UNKNOWN"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String service = Context.WIFI_SERVICE; WifiManager wifi = (WifiManager)getSystemService(service); Toast.makeText(this, "Wi‐Fi : " + wifiState[wifi.getWifiState()], Toast.LENGTH_LONG).show(); } } Applications Java sous Android IvMad, 2011-2015 18 Android : Wi-Fi (4) • Pour obtenir des informations détaillées sur une connexion, il faut se référer à la méthode getConnectionInfo de la classe WifiInfo. • La classe WifiInfo offre un certain nombre de méthodes pour manipuler les paramètres du réseau Wi-Fi: • getSSID : Retourne l'identificateur du réseau 802.11 en cours; • getBSSID() : Retourne l'identificateur de base de ce réseau; • getMacAddress() : Retourne l'adresse MAC de l'appareil; • getIpAddress() : Retourne l'adresse IP de l'appareil en format 'int'. Une conversion en format 'String' est alors nécessaire. • getLinkSpeed() : Retourne le débit en Mbps • getRssi() : Retourne le niveau de puissance reçu du réseau 802.11 connecté. Applications Java sous Android IvMad, 2011-2015 19 Android : Wi-Fi (5) • Afficher les éléments d'une connexion Wi-Fi en ajoutant les composants dans un StringBuilder par la méthode append() Conversion d'un numéro IP de décimal en string Applications Java sous Android IvMad, 2011-2015 20 Android : Wi-Fi (6) • • • • • Avec le Wi-FiManager on peut procéder à la recherche des bornes WiFi (hotspot) dans le voisinage par la méthode startScan. L'opération utilise un Broadcasr Receiver avec un Intent SCAN_RESULTS_AVAILABLE_ACTION qui est passé en paramètre pour assurer un traitement asynchrone et la prise du résultat quand le scan a terminé. On appelle la méthode getScanResults pour obtenir les résultats sous la forme d'une liste d'objets ScanResult. Chaque objet du type ScanResult comporte les détails de la connexion repérée. Le résultat du Scan est récupéré dans un objet de type List<E>. C'est une collection d'éléments indexés à partir de zéro. List<ScanResult> results = wifi.getScanResults(); Applications Java sous Android IvMad, 2011-2015 21 Android : Wi-Fi (7) • Retourne le nombre de hotspot détectés et le SSID avec le plus fort signale à proximité Applications Java sous Android IvMad, 2011-2015 22 Android : Bluetooth (1) • Bluetooth est un protocole d'interconnexion à de courtes distances, de type "peer-to-peer" avec une bande passante faible. La communication est cryptée entre les périphériques appariés. • L'API Bluetooth permet de scanner et de lier les appareils entre eux et de transférer des données. • Les connexions Bluetooth sont gérées par les classes suivantes : • BluetoothAdapter : est l'unité locale où l'application Bluetooth est lancée. • BluetoothDevice : est le périphérique distant avec lequel on cherche à communiquer. • BluetoothSocket : fait une demande de connexion au périphérique distant par l'appel de la méthode createRfcommSocketToServiceRecord. • BluetoothServerSocket : installe un Socket Bluetooth serveur pour écouter les demandes de connexion entrantes en utilisant la méthode listenUsingRfcommWithServiceRecord. Applications Java sous Android IvMad, 2011-2015 23 Android : Bluetooth (2) • Pour s'assurer que le périphérique possède le Bluetooth on procède à une vérification rapide en instanciant la classe BluetoothAdapter. Le retour de son objet va indiquer la présence ou non de cette option. BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) Toast.makeText(BluetoothActivity.this, "Pas de Bluetooth!", Toast.LENGTH_SHORT).show(); else Toast.makeText(BluetoothActivity.this, "Le Bluetooth est disponible", Toast.LENGTH_SHORT).show(); • Pour autoriser l'opération, il faut ajouter la permission d'accéder aux API Bluetooth en ajoutant la ligne suivante dans le fichier AndroidManifest.xml : <uses‐permission android:name="android.permission.BLUETOOTH"/> Applications Java sous Android IvMad, 2011-2015 24 Android : Bluetooth (3) • Le Bluetooth peut être disponible sur l'appareil mais non activé. On peut demander l'autorisation à l'utilisateur d'activer cette option. Pour cela, on appelle la méthode startActivityForResult avec un paramètre d'Intent BluetoothAdapter.ACTION_REQUEST_ENABLE. On vérifie que le Bluetooth n'est pas activé et on demande son activation : private final static int BLUETOOTH_ACTIVATION = 1; BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ........................................ if (!bluetoothAdapter.isEnabled() { startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), BLUETOOTH_ACTIVATION); } • Un dialog-box incitera l'utilisateur d'accepter ou non l'activation du Bluetooth sur son appareil. Le résultat de sa décision est récupérable par la méthode onActivityResult. Applications Java sous Android IvMad, 2011-2015 25 Android : Bluetooth (4) • On surcharge la méthode onActivityResult pour savoir si le Bluetooth est activé ou non. La méthode est appelée à la sortie de la boite de dialogue @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == BLUETOOTH_ACTIVATION) { if (resultCode == RESULT_OK) { Toast.makeText(BluetoothActivity.this, "Bluetooth est activé", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(BluetoothActivity.this, "Bluetooth non activé", Toast.LENGTH_SHORT).show(); } } } Applications Java sous Android IvMad, 2011-2015 Android : Bluetooth (5) 26 Applications Java sous Android IvMad, 2011-2015 27 Android : Bluetooth (6) • Si on rend l'appareil Bluetooth détectable cela permet à d'autres appareils de le découvrir et de se connecter par la suite. Pour cela, on utilise la méthode startActivityForResult avec le paramètre Intent approprié : startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE), BLUETOOTH_SCAN); • On obtient la liste des appareils déjà liés avec getBoundedDevices. Set<BluetoothDevice> knownDevices = bluetoothAdapter.getBoundedDevices(); for (BluetoothDevice device : knownDevices) { Log.v("BluetoothActivity", "appareil = " + devices.getName()); } • Set : interface de collection pour des objets qui n'autorisent pas des doublons dans l'ensemble, existe au moins un nul (un tableau d'objets). • for-each : boucle qui accède à chaque élément d'une collection d'objets comme dans un tableau (eg, ArrayList). Applications Java sous Android IvMad, 2011-2015 28 Android : Bluetooth (7) • Le code complet (étudiez les instructions 'Set' et 'for') : public class BluetoothDeviceListActivity extends Activity { private final static int BLUETOOTH_SCAN = 1; String s = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE),BLUETOOTH_SCAN); Set<BluetoothDevice> knownDevices = bluetoothAdapter.getBondedDevices(); for (BluetoothDevice device : knownDevices) { s += "appareil = " + device.getName(); } Toast.makeText(BluetoothDeviceListActivity.this,"Les Bluetooth liés: "+s,Toast.LENGTH_SHORT).show(); } } Applications Java sous Android IvMad, 2011-2015 29 Android : Bluetooth (8) • La recherche d'appareils inconnus est un traitement asynchrone et gourmant en énergie effectué par le Broadcast Receiver. • Android permet de créer une classe qui implémente BroadcastReceiver pour recevoir des Intents et appliquer des comportements spécifiques au code. • L’interface BroadcastReceiver possède une seule méthode onReceive() qu'on doit implémenter. BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Toast.makeText(BluetoothActivity.this, "New Device = " + device.getName(), Toast.LENGTH_SHORT).show(); } } }; Applications Java sous Android IvMad, 2011-2015 30 Android : BT (9) Mettre tout ensemble Ajouter les permissions dans le fichier manifest.xml Applications Java sous Android IvMad, 2011-2015 31 IvMad, 2011-2015 32 Android : Réseau • Routage et passerelle Applications Java sous Android Android : Réseau • Échange d'informations entre client et serveur Applications Java sous Android IvMad, 2011-2015 33 Android : La Socket • La Socket (connecteurs réseau) représente une interface de programmation pour les communications entre processus. • Il existe généralement quatre types de sockets : • Une socket datagram permet une communication bidirectionnelle qui n'est pas séquencée. Un processus utilisant ce type de Socket peut recevoir les données dans un ordre différent de l'ordre de départ. • C'est le protocole UDP. • Une socket stream permet une communication bidirectionnelle, sûre, séquencée et un flux de données sans duplication pouvant entraîner une fragmentation des paquets transmis. • Il s'agit du protocole TCP. • Une socket raw • Une socket sequenced packet. Applications Java sous Android IvMad, 2011-2015 Android : Le rôle des Sockets • Connexion à une machine distante • Envoie et/ou Réception de données • Fermeture d'une connexion • Attachement à un port • Acceptation d'une demande de connexion à un port local • A un port est attribué un numéro allant de 1 à 65535 • Les ports de 1 à 1023 sont réservés aux services: • FTP (21), HTTP (80), SMTP (25) • Attente de demandes de connexion 34 Applications Java sous Android IvMad, 2011-2015 35 Android : Le mode connecté (TCP) • Les étapes côté Serveur: • Instancier la classe ServerSocket et l’instruire à écouter sur un port supérieur à 1024. • Accepter les connexions par la méthode accept() et créer un objet Socket pour référencer la nouvelle connexion. • Passer la nouvelle connexion au programme approprié. • Fermer la connexion par la méthode close(). • Les étapes côté Client: • Se connecter au service approprié en instanciant la classe Socket et en lui passant comme paramètres l’adresse du Serveur et le port écouté. • Lorsque l’échange est terminé fermer la connexion par la méthode close(). Applications Java sous Android IvMad, 2011-2015 Android : Le mode connecté (TCP) • Le Client et le Serveur en mode connecté 36 Applications Java sous Android IvMad, 2011-2015 37 Android : StrictMode pour TCP • Dans une application Android, on doit éviter d'effectuer des opérations lentes sur le thread de l'interface utilisateur (GUI). • Les opérations lecture et écriture de fichiers et l'accès au réseau sont considérées comme lentes, car le temps d'aboutir est indéfini, voir imprévisible. • StrictMode est configuré pour une sécurité accrue, c.à.d. pour éviter de faire des choses incorrectes. L'exception NetworkOnMainThreadException est provoqué si l'accès réseau est effectué de l'interface utilisateur (le thread principal de l'application). • A partir de l'Android 3.0 on peut désactiver cette option pour faire des tests plus facilement sur l'accès réseau en plaçant dans la méthode onCreate() le code: StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); Applications Java sous Android IvMad, 2011-2015 Android : Connexion TCP Résoudre l'adresse IP locale 38 Applications Java sous Android IvMad, 2011-2015 39 Android : Connexion TCP Le serveur TCP reçoit le message du client TCP Android Applications Java sous Android IvMad, 2011-2015 40 Android : client-side TCP socket Le client TCP envoie un message au serveur TCP par l'interface graphique Android Applications Java sous Android IvMad, 2011-2015 41 Android : client-side TCP socket • Le fichier AndroidManifest.xml contient la description des ressources et les autorisations d'accès au réseau Internet L'autorisation d'accéder au réseau et configurée dans le Manifest de l'application <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ivmad.TCP.Client" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".ClientTCPAndroidActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> Applications Java sous Android IvMad, 2011-2015 42 Android : server-side TCP socket Le serveur TCP reçoit le message du client Android Le client TCP basé Android envoie un message au Serveur basé TCP Le serveur TCP est installé sur le port 1234 à l'adresse IP: 192.168.0.141 Applications Java sous Android IvMad, 2011-2015 43 Android : Connexion réseau • Avant de procéder à une connexion réseau, il faut s'assurer que cette connexion est disponible. Un téléphone portable, un Smartphone ou une tablette peut être hors réseau ou connexion Wifi désactivée. • Cette disponibilité est testée avec les méthodes getActiveNetworkInfo() et isConnected(). • La classe ConnectivityManager détecte les connexions Wifi, GPRS, UMTS, etc. public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); // Si le réseau est indisponible networkInfo = null et la // méthode retourne false, sinon true. if (networkInfo != null && networkInfo.isConnected()) { return true; } return false; } Applications Java sous Android IvMad, 2011-2015 44 Android : Connexion HTTP • HttpURLConnection avec URL sont des classes disponibles depuis Java 2.0 standard. • C'est un client léger d'usage général basé HTTP et approprié pour la plupart des applications Android. try { URL url = new URL("http://139.124.26.245/neticien/"); HttpURLConnection con = (HttpURLConnection)url.openConnection(); // méthode qui lit un contenu sur le Stream d'entrée readStream(con.getInputStream()); } catch (Exception e) { e.printStackTrace(); } Applications Java sous Android IvMad, 2011-2015 45 Android : Connexion HTTP • Lecture du Stream d'entrée dont la connexion est effectuée par HttpURLConnection et URL. private void readStream(InputStream in) { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(in)); String line = "", str = ""; while ((line = reader.readLine()) != null) { str += line; } Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } } } Applications Java sous Android IvMad, 2011-2015 46 Android : Connexion HTTP Le contenu de l'adresse: http://139.124.26.245/neticien Applications Java sous Android IvMad, 2011-2015 47 Android : LogCat view • Le développement pose toujours le problème de tester l'application avant sa mise en "service". La View de l'application est en mode graphique. Les logs permettent l'affichage en mode texte dans la fenêtre du LogCat. • Pour afficher les opérateurs 'log' dans Eclipse il faut activer le LogCat view: • Window->Show View->Other...->LogCat. • Pour écrire un opérateur 'Log' il faut importer la classe android.util.Log ‐ Log.d() ‐ Log.w() ‐ Log.e() ‐ • Log.i() • • • qui propose les méthodes: "Info", "Debug", "Warning", "Error". • Exemple: Log.i("NameActivity", "Bonjour, ça marche!");