Programmation Android M1 informatique

Documents pareils
Projet Android (LI260) Cours 2

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

Android en action. Abdelkader Lahmadi Université de Lorraine

Développement sous Android

TP au menu «UI ANDROID»

SOMMAIRE

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Les fondamentaux du développement d applications Java

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

Android et le Cloud Computing

DÉVELOPPEMENT ANDROID

TP SIN Programmation sur androïde Support : eclipse

Android 4 Les fondamentaux du développement d'applications Java

Warren PAULUS. Android SDK et Android x86

Créer des applications Android

Les connexions sans fil avec Android. JMF (Tous droits réservés) 1

Programmer en JAVA. par Tama

Tutorial pour une application simple

Education Delivery Intelligent Tool

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Premiers Pas en Programmation Objet : les Classes et les Objets

1.3 Gestion d'une application

Programmation mobile avec Android

Module Architecture des systèmes mobiles : Android première partie Didier FERMENT - UPJV

Architectures Mobiles

Projet de programmation (IK3) : TP n 1 Correction

Environnements de développement (intégrés)

Corrigé des exercices sur les références

Unity. Moteur de jeu 3D et 2D. Cross platform: Windows, Mac, Linux, ios, Android, Blackberry, Xbox, Playstation, Wii

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmation Android L3 informatique

Développement tablette Android. SophiaConf2011 Par Arnaud FARINE

TP1 : Initiation à Java et Eclipse

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Stockage de données sous Android

Programmation avec des objets : Cours 7. Menu du jour

Plan du cours. Historique du langage Nouveautés de Java 7

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Paris Airports - Web API Airports Path finding

Intégration d'un système d'audio-vidéo conférence sur un robot de téléprésence

Java Licence Professionnelle CISII,

Android UIThread, Thread, Handler et AsyncTask

Introduction ANDROID

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Threads. Threads. USTL routier 1

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

TD/TP PAC - Programmation n 3

Tutoriel Android. Pour démarrer la programmation d'applications Android

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Remote Method Invocation (RMI)

Guide utilisateur de l application messagerie vocale visuelle pour smartphone

Table des matières. Partie I Concepts de base Préface... VII

Package Java.util Classe générique

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

1. Base de données SQLite

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Développement sous Android

De Java à Android version 0.1

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Tutoriel Android - TP de prise en main

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TD/TP PAC - Programmation n 3

Développement Android. J.-F. Couchot

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Installation et prise en main

Développement d applications professionnelles avec Android 2

Cours 1: Java et les objets

Composants Logiciels. Le modèle de composant de CORBA. Plan

Programmation Par Objets

Programme Compte bancaire (code)

République Algérienne Démocratique et Populaire Université Abou Bakr Belkaid Tlemcen Faculté des Sciences Département d Informatique

Une introduction à Java

7 Développement d une application de MapReduce

Bases de données et fournisseurs de contenu

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)


TD/TP 1 Introduction au SDK d Android

WiFi Security Camera Quick Start Guide. Guide de départ rapide Caméra de surveillance Wi-Fi (P5)

CTIconnect PRO. Guide Rapide

as Architecture des Systèmes d Information

Objets et Programmation. origine des langages orientés-objet

Remote Method Invocation Les classes implémentant Serializable

ACTIVITÉ DE PROGRAMMATION

INITIATION AU LANGAGE JAVA

APPLICATIONS JAVA. 1. Android. Développement d'activités Java sous Android. Android Partie I. L'architecture du système Android. Application Android

Une introduction à la technologie EJB (2/3)

Construire une application marketing Facebook sur la plateforme Windows Azure

Solutions du chapitre 4

Bases Java - Eclipse / Netbeans

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Création d un service web avec NetBeans 5.5 et SJAS 9

Twixl Portfolio DE INDESIGN VERS LES TABLETTES. Luk Dhondt - Product Manager

Wireless IP Camera 75790, 75790WH, Quick Start Guide Guide de départ rapide

Microsoft Windows XP. Movie Maker 2

Transcription:

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