Programmation Android M1 informatique Étienne Payet Département de mathématiques et d informatique Ces transparents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pas d Utilisation Commerciale - Pas de Modification 3.0 non transcrit. Étienne Payet (DMI) Prog. Android M1 informatique 1 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 2 / 74
Rotation de l écran en cas de rotation de l écran, l activité courante est détruite (appel à ondestroy) puis une nouvelle activité adaptée à la nouvelle orientation est créée (appel à oncreate, utilisation éventuelle d une ressource alternative) attention aux pertes potentielles de données (certaines valeurs peuvent avoir changé pendant l exécution de l activité détruite par la rotation) Étienne Payet (DMI) Prog. Android M1 informatique 3 / 74
Forcer l orientation de l écran dans AndroidManifest.xml : <activity android:name=".mainactivity" android:label="@string/app_name" android:screenorientation="landscape"/> ou <activity android:name=".mainactivity" android:label="@string/app_name" android:screenorientation="portrait"/> Étienne Payet (DMI) Prog. Android M1 informatique 4 / 74
Éviter la perte de données : utiliser le Bundle instance de la classe Bundle = conteneur associatif (clé,valeur) ou la clé est une chaîne de caractères (String) chaque application qui tourne possède une instance de cette classe le Bundle existe tant que l application n est pas quittée (i.e. tant que la backstack n est pas vide) la méthode onsaveinstancestate(bundle) est appelée sur l activité avant sa destruction la méthode oncreate(bundle) est appelée sur la nouvelle activité Étienne Payet (DMI) Prog. Android M1 informatique 5 / 74
Éviter la perte de données : utiliser le Bundle public class MainActivity extends Activity { private int truc; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); if (savedinstancestate == null) truc = 2; else truc = savedinstancestate.getint("montruc"); @Override protected void onsaveinstancestate(bundle savedinstancestate) { // Méthode appelée avant destruction de l activité super.onsaveinstancestate(savedinstancestate); savedinstancestate.putint("montruc", truc); Étienne Payet (DMI) Prog. Android M1 informatique 6 / 74
Exercice Étienne Payet (DMI) Prog. Android M1 informatique 7 / 74
Exercice le menu options permet d éditer le message gérer la rotation de l écran : modes portrait et paysage autorisés la rotation conserve le message et le nombre de changements courants Étienne Payet (DMI) Prog. Android M1 informatique 8 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 9 / 74
Notion de diffusion informer l ensemble des applications de la survenue d un événement : appel entrant batterie faible... diffusion d un objet de la classe Intent à l ensemble des applications Étienne Payet (DMI) Prog. Android M1 informatique 10 / 74
La classe Intent un objet de la classe Intent : est une description d un message ou d une opération à exécuter a pour attributs : action = description générale (chaîne de caractères) - constantes de la classe Intent : ACTION_MAIN, ACTION_VIEW, ACTION_BATTERY_CHANGED, ACTION_SHUTDOWN,... - de la forme "com.etienne.android.view" category = informations complémentaires - constantes de la classe Intent : CATEGORY_DEFAULT, CATEGORY_LAUNCHER,...... constructeurs : Intent(String action),... Étienne Payet (DMI) Prog. Android M1 informatique 11 / 74
Diffuser un objet de la classe Intent méthode sendbroadcast de la classe Activity Intent intent = new Intent("com.etienne.android.VIEW"); intent.putextra("message", "Coucou!"); sendbroadcast(intent); Étienne Payet (DMI) Prog. Android M1 informatique 12 / 74
Prise en compte d un Intent diffusé toute application souhaitant considérer un Intent diffusé doit : définir un filtre d Intent qui précise ce souhait écouter les messages diffusés grâce à un récepteur de diffusion récepteur de diffusion = objet d une sous-classe de BroadcastReceiver composant de l application, au même titre qu une activité Étienne Payet (DMI) Prog. Android M1 informatique 13 / 74
Traitement d un Intent diffusé on définit une sous-classe de BroadcastReceiver : public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { // traitement de l Intent diffusé Étienne Payet (DMI) Prog. Android M1 informatique 14 / 74
Définition du filtre et création du récepteur création d un récepteur permanent : AndroidManifest.xml <manifest > <application > <receiver android:name="mybroadcastreceiver"> <intent-filter> <action android:name="com.etienne.android.view"/> <category android:name="android.intent.category.default"/> </intent-filter> </receiver> </application> </manifest> Étienne Payet (DMI) Prog. Android M1 informatique 15 / 74
Définition du filtre et création du récepteur création d un récepteur temporaire : MyBroadcastReceiver receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter("com.etienne.android.VIEW"); registerreceiver(receiver, filter); unregisterreceiver(receiver); // ne pas oublier, sinon erreur! Étienne Payet (DMI) Prog. Android M1 informatique 16 / 74
Exercice écrire : une application qui diffuse un Intent une application qui réagit à la diffusion en affichant un Toast Étienne Payet (DMI) Prog. Android M1 informatique 17 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 18 / 74
Fournisseurs de position plusieurs moyens de localisation : GPS, réseau mobile + WiFi,... constantes prédéfinies de type String pour désigner un fournisseur : LocationManager.GPS_PROVIDER LocationManager.NETWORK_PROVIDER LocationManager.PASSIVE_PROVIDER liste des fournisseurs activés : String locationcontext = Context.LOCATION_SERVICE; LocationManager locationmanager = (LocationManager) getsystemservice(locationcontext); List<String> providers = locationmanager.getproviders(true); Étienne Payet (DMI) Prog. Android M1 informatique 19 / 74
Fournisseurs de position permissions à déclarer dans AndroidManifest.xml : localisation précise (par GPS par exemple) <uses-permission android:name="android.permission.access_fine_location"/> localisation approximative (par le réseau par exemple) <uses-permission android:name="android.permission.access_coarse_location"/> Étienne Payet (DMI) Prog. Android M1 informatique 20 / 74
Obtenir sa position String locationcontext = Context.LOCATION_SERVICE; LocationManager locationmanager = (LocationManager) getsystemservice(locationcontext); String provider = LocationManager.GPS_PROVIDER; Location location = locationmanager.getlastknownlocation(provider); if (location!= null) { double latitude = location.getlatitude(); double longitude = location.getlongitude(); Étienne Payet (DMI) Prog. Android M1 informatique 21 / 74
Détecter le changement de position méthodes de la classe LocationManager : public void requestlocationupdates(string f, long t, float d, LocationListener l) - f : fournisseur de position - t : temps minimum (millisecondes) entre deux mises à jour - d : distance minimum (mètres) entre deux mises à jour - l : écouteur qui reçoit les notifications public void removeupdates(locationlistener l) - l : écouteur qui reçoit les notifications Étienne Payet (DMI) Prog. Android M1 informatique 22 / 74
Détecter le changement de position public class MyActivity extends Activity { private LocationManager locationmanager; private String locationprovider = LocationManager.GPS_PROVIDER; private LocationListener mlistener; Étienne Payet (DMI) Prog. Android M1 informatique 23 / 74
Détecter le changement de position @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); locationmanager = (LocationManager) getsystemservice( Context.LOCATION_SERVICE); if (locationmanager!= null) mlistener = new LocationListener() { public void onlocationchanged(location location) { displayposition(); public void onproviderdisabled(string provider) { public void onproviderenabled(string provider) { public void onstatuschanged(string provider, int status, Bundle extras) { ; Étienne Payet (DMI) Prog. Android M1 informatique 24 / 74
Détecter le changement de position @Override public void onresume() { super.onresume(); if (locationmanager!= null) { displayposition(); locationmanager.requestlocationupdates( locationprovider, 6000, 100, mlistener); @Override public void onpause() { if (locationmanager!= null) locationmanager.removeupdates(mlistener); super.onpause(); Étienne Payet (DMI) Prog. Android M1 informatique 25 / 74
Détecter le changement de position public void displayposition() { String msg = null; Location location = locationmanager.getlastknownlocation(locationprovider); if (location!= null) msg = String.format("(%.2f, %.2f)", location.getlatitude(), location.getlongitude()); else msg = "position inconnue"; Log.v("Position", msg); // fin de la classe MyActivity Étienne Payet (DMI) Prog. Android M1 informatique 26 / 74
Détecter le changement de position une autre possibilité : utiliser les Google Play Services http://developer.android.com/training/location/retrieve-current.html http://developer.android.com/training/location/receive-location-updates.html squelette de code Étienne Payet (DMI) Prog. Android M1 informatique 27 / 74
Un nouveau système de permissions depuis Android 6.0 https://developer.android.com/guide/topics/security/permissions.html https://developer.android.com/training/permissions/requesting.html Étienne Payet (DMI) Prog. Android M1 informatique 28 / 74
Exercice détection des changements de position l affichage tient compte de la langue Étienne Payet (DMI) Prog. Android M1 informatique 29 / 74
Alertes de proximité objectif : indiquer qu on se rapproche d un point d intérêt un Intent est diffusé lorsque l appareil entre ou sort d une zone circulaire centrée sur le point d intérêt l Intent diffusé peut être capturé par un récepteur de diffusion (voir section 2) Étienne Payet (DMI) Prog. Android M1 informatique 30 / 74
Ajout d une alerte méthode de la classe LocationManager : public void addproximityalert(double latitude, double longitude, float rayon, long expiration, PendingIntent pintent) latitude, longitude : coordonnées du point d alerte rayon : rayon (mètres) de la zone autour du point d alerte expiration : temps (millisecondes) de l alerte, -1 pour une alerte permanente pintent : pour générer l Intent diffusé lorsque l appareil entre/sort de la zone d alerte Étienne Payet (DMI) Prog. Android M1 informatique 31 / 74
Retrait d une alerte méthode de la classe LocationManager : public void removeproximityalert(pendingintent pintent) pintent : le PendingIntent qui a été utilisé lors de l appel à addproximityalert Étienne Payet (DMI) Prog. Android M1 informatique 32 / 74
Gestion d une alerte public class ProximityBroadcastReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { String message; String key = LocationManager.KEY_PROXIMITY_ENTERING; Boolean entering = intent.getbooleanextra(key, false); if (entering) message = "entree dans la zone"; else message = "sortie de la zone"; Log.v("Message", message); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); Étienne Payet (DMI) Prog. Android M1 informatique 33 / 74
Gestion d une alerte <manifest > <uses-permission android:name="android.permission.access_fine_location" /> <application > <receiver android:name="proximitybroadcastreceiver" > <intent-filter> <action android:name="com.etienne.position.proximityalert"/> <category android:name="android.intent.category.default"/> </intent-filter> </receiver> </application> </manifest> Étienne Payet (DMI) Prog. Android M1 informatique 34 / 74
Gestion d une alerte public class MainActivity extends Activity { private LocationManager locationmanager; private PendingIntent proximityintent; @Override protected void oncreate(bundle savedinstancestate) { locationmanager = (LocationManager) getsystemservice( Context.LOCATION_SERVICE); Intent intent = new Intent("com.etienne.position.ProximityAlert"); proximityintent = PendingIntent.getBroadcast( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Étienne Payet (DMI) Prog. Android M1 informatique 35 / 74
Gestion d une alerte @Override public void onresume() { locationmanager.addproximityalert(-21.11, 55.53, 1000.0f, -1, proximityintent); @Override public void onpause() { locationmanager.removeproximityalert(proximityintent); // Fin de la classe MainActivity Étienne Payet (DMI) Prog. Android M1 informatique 36 / 74
Exercice Étienne Payet (DMI) Prog. Android M1 informatique 37 / 74
Google Play Services accès aux services Google (Maps, Google+,...) dans les applications API fournie par le Google Play Services SDK http://developer.android.com/google/play-services/index.html Étienne Payet (DMI) Prog. Android M1 informatique 38 / 74
Utilisation des Google Maps https://developers.google.com/maps/documentation/android/ start?hl=fr compte Google nécessaire pour générer une clé et la lier au projet Étienne Payet (DMI) Prog. Android M1 informatique 39 / 74
Utilisation des Google Maps créer une application faisant intervenir les classes : GoogleMap : modélise une carte MapFragment ou MapView pour l affichage d une carte (MapFragment est plus simple à utiliser que MapView) utiliser le template Google Maps Activity lors de la création du projet sous Android Studio Étienne Payet (DMI) Prog. Android M1 informatique 40 / 74
Exercice un appui sur le bouton en haut à droite permet de pointer la position courante sur une carte tester différents types de carte Étienne Payet (DMI) Prog. Android M1 informatique 41 / 74
Mouvements de la caméra créer une instance de la classe CameraUpdate grâce à la classe CameraUpdateFactory : CameraUpdateFactory.zoomBy(float) CameraUpdateFactory.newLatLng(LatLng)... utiliser les méthodes movecamera(cameraupdate) ou animatecamera(cameraupdate) pour bouger la caméra la classe LatLng permet de créer des points : constructeur LatLng(double, double) Étienne Payet (DMI) Prog. Android M1 informatique 42 / 74
Marqueurs GoogleMap map = ((MapFragment) getfragmentmanager(). findfragmentbyid(r.id.map)).getmap(); map.addmarker(new MarkerOptions().position(new LatLng(0, 0)).title("Coucou").snippet("Je suis ici")); Étienne Payet (DMI) Prog. Android M1 informatique 43 / 74
Exercice Étienne Payet (DMI) Prog. Android M1 informatique 44 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 45 / 74
Capteurs accéléromètre, gyroscope, capteur de pression,... classe Sensor : - Sensor.TYPE_ACCELEROMETER, - Sensor.TYPE_GYROSCOPE, - Sensor.TYPE_PRESSURE, -... Étienne Payet (DMI) Prog. Android M1 informatique 46 / 74
Gestion des capteurs classe SensorManager pour gérer tous les capteurs différents taux de rafraîchissement possibles : - SensorManager.SENSOR_DELAY_FASTEST, - SensorManager.SENSOR_DELAY_GAME, - SensorManager.SENSOR_DELAY_NORMAL, - SensorManager.SENSOR_DELAY_UI Étienne Payet (DMI) Prog. Android M1 informatique 47 / 74
Écouter un capteur interface SensorEventListener méthodes à implémenter : public void onaccuracychanged(sensor sensor, int accuracy) public void onsensorchanged(sensorevent event) Étienne Payet (DMI) Prog. Android M1 informatique 48 / 74
Écouter un capteur méthodes de la classe SensorManager pour lier un écouteur à un capteur : public boolean registerlistener( SensorEventListener ecouteur, Sensor capteur, int tauxrafraichissement) public void unregisterlistener( SensorEventListener ecouteur, Sensor capteur) Étienne Payet (DMI) Prog. Android M1 informatique 49 / 74
Exemple public class MySensorActivity extends Activity implements SensorEventListener { private Sensor maccelerometer; private SensorManager manager; private boolean accelsupported; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); manager = (SensorManager) getsystemservice(service.sensor_service); maccelerometer = manager.getdefaultsensor(sensor.type_accelerometer); Étienne Payet (DMI) Prog. Android M1 informatique 50 / 74
Exemple @Override public void onresume() { super.onresume(); accelsupported = manager.registerlistener( this, maccelerometer, SensorManager.SENSOR_DELAY_GAME); @Override public void onpause() { if (accelsupported) manager.unregisterlistener(this, maccelerometer); super.onpause(); Étienne Payet (DMI) Prog. Android M1 informatique 51 / 74
Exemple @Override public void onaccuracychanged(sensor sensor, int accuracy) { @Override public void onsensorchanged(sensorevent event) { switch (event.sensor.gettype()) { case Sensor.TYPE_ACCELEROMETER: // fin de la classe MySensorActivity Étienne Payet (DMI) Prog. Android M1 informatique 52 / 74
Exercice Étienne Payet (DMI) Prog. Android M1 informatique 53 / 74
Exercice choix du capteur : accéléromètre, gyroscope, magnétomètre choix du taux de rafraîchissement : SENSOR_DELAY_FASTEST, SENSOR_DELAY_GAME, SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI listes déroulantes : voir la classe Spinner Étienne Payet (DMI) Prog. Android M1 informatique 54 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 55 / 74
La classe MediaPlayer utilisée pour la lecture audio et vidéo différentes sources possibles (fichier local, streaming sur Internet) fichier local = ressource à placer dans le dossier res/raw plusieurs formats peuvent être lus (WAV, MP3...) Étienne Payet (DMI) Prog. Android M1 informatique 56 / 74
Lecture d un fichier son méthodes de la classe MediaPlayer : création d un lecteur : public static MediaPlayer create (Context context, int resid) démarrage de la lecture : public void start () l interface MediaPlayer.OnCompletionListener permet de définir une méthode appelée lorsque la lecture du fichier est terminée Étienne Payet (DMI) Prog. Android M1 informatique 57 / 74
Interruption de la lecture une instance de MediaPlayer peut monopoliser des ressources système partagées avec d autres applications (décodeur audio...) règle : n avoir qu une seule instance de MediaPlayer et ne garder cette instance que si elle lit quelque chose la méthode public void release () permet de détruire une instance de MediaPlayer et de libérer toutes les ressources système qui lui étaient allouées Étienne Payet (DMI) Prog. Android M1 informatique 58 / 74
Exemple public class MonActivite extends Activity { // activité présentant un bouton play et un bouton stop private MediaPlayer mplayer; @Override public void oncreate(bundle savedinstancestate) { // Méthode appelée si appui sur bouton stop: public void stop(view v) { if (mplayer!= null) { mplayer.release(); mplayer = null; Étienne Payet (DMI) Prog. Android M1 informatique 59 / 74
Exemple // Méthode appelée si appui sur bouton play public void play(view v) { stop(); mplayer = MediaPlayer.create(this, R.raw.mon_fichier_son); mplayer.setoncompletionlistener( new MediaPlayer.OnCompletionListener() { public void oncompletion(mediaplayer mp) { stop(); ); mplayer.start(); Étienne Payet (DMI) Prog. Android M1 informatique 60 / 74
Exemple // Méthode appelée lors de la destruction de l activité: @Override public void ondestroy() { super.ondestroy(); stop(); // fin de la classe MonActivite Étienne Payet (DMI) Prog. Android M1 informatique 61 / 74
Exercice la balle verte se déplace sur l écran en fonction de l inclinaison de l appareil, elle ne sort pas de l écran le ToggleButton active/désactive le déplacement de la balle les boutons -/+ modifient la vitesse lorsque la balle touche le bord de l écran, un son est émis vérouiller la rotation de l écran (mode portrait uniquement) Étienne Payet (DMI) Prog. Android M1 informatique 62 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 63 / 74
Capture d une touche utilisateur méthode ontouchevent(motionevent e) des classes View et Activity cette méthode renvoie true si l événement est capturé et false sinon voir les constantes : MotionEvent.ACTION_MOVE MotionEvent.ACTION_DOWN... Étienne Payet (DMI) Prog. Android M1 informatique 64 / 74
Exemple public class MainActivity extends Activity { @Override public boolean ontouchevent(motionevent event) { int action = MotionEventCompat.getActionMasked(event); switch(action) { case (MotionEvent.ACTION_DOWN): Log.d(DEBUG_TAG,"Action DOWN"); return true; default: return super.ontouchevent(event); Étienne Payet (DMI) Prog. Android M1 informatique 65 / 74
Gestes courants la classe GestureDetector définit les interfaces : ongesturelistener pour capturer les touches, les pressions longues, les mouvements de scroll... ondoubletaplistener pour capturer les doubles taps et les confirmations de simples taps ces interfaces déclarent des méthodes de la forme boolean on<evénement>() qui doivent renvoyer true si on considère que l événement en paramètre est capturé et false sinon (et alors, l événément est passé à un autre objet jusqu à ce qu il soit traité) Étienne Payet (DMI) Prog. Android M1 informatique 66 / 74
Exemple public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private static final String DEBUG_TAG = "Gestures"; private GestureDetectorCompat mdetector; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mdetector = new GestureDetectorCompat(this,this); mdetector.setondoubletaplistener(this); Étienne Payet (DMI) Prog. Android M1 informatique 67 / 74
Exemple @Override public boolean ontouchevent(motionevent event) { this.mdetector.ontouchevent(event); return super.ontouchevent(event); @Override public boolean ondown(motionevent event) { Log.d(DEBUG_TAG,"onDown: " + event.tostring()); return true; @Override public boolean ondoubletap(motionevent event) { Log.d(DEBUG_TAG, "ondoubletap: " + event.tostring()); return true; Étienne Payet (DMI) Prog. Android M1 informatique 68 / 74
Gestion du balayage (swipe) utiliser la méthode onfling de GestureDetector.OnGestureListener Étienne Payet (DMI) Prog. Android M1 informatique 69 / 74
Gestion du balayage (swipe) public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_THRESHOLD_VELOCITY = 200; @Override public boolean onfling(motionevent event1, MotionEvent event2, float velocityx, float velocityy) { if (event1.getx() - event2.getx() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) // Left swipe else if (event2.getx() - event1.getx() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) // Right swipe else if (event1.gety() - event2.gety() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) // Swipe up else if (event2.gety() - event1.gety() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) // Swipe down return false; Étienne Payet (DMI) Prog. Android M1 informatique 70 / 74
Exercice écrivez une application qui affiche un message à l écran lorsque l un des gestes gérés par la classe GestureDetector (simple/double tap, pression longue, fling... ) est reconnu Étienne Payet (DMI) Prog. Android M1 informatique 71 / 74
Exercice : jeu du taquin à 9 cases https: //fr.wikipedia.org/wiki/taquin le déplacement d une case se fait par un mouvement de balayage (swipe) un son est émis lorsqu une case est déplacée menu options : recommencer la partie en cours, commencer une nouvelle partie et quitter le jeu gérer la rotation de l écran (modes portrait et paysage autorisés) Étienne Payet (DMI) Prog. Android M1 informatique 72 / 74
Plan 1 Rotation de l écran 2 Récepteurs de diffusion 3 Géolocalisation 4 Capteurs 5 Lecture audio 6 Gestes courants 7 Appareil photo Étienne Payet (DMI) Prog. Android M1 informatique 73 / 74
Capture et sauvegarde d une photo 2 possibilités : utiliser un Intent pour invoquer un logiciel de capture existant déjà dans l appareil créer son propre logiciel de capture détails : http://developer.android.com/guide/topics/media/camera.html Étienne Payet (DMI) Prog. Android M1 informatique 74 / 74