Programmation Android M1 informatiquelim.univ-reunion.fr/staff/epayet/Teaching/ProgMobiles_L3... ·...

Post on 05-Jul-2021

1 views 0 download

Transcript of Programmation Android M1 informatiquelim.univ-reunion.fr/staff/epayet/Teaching/ProgMobiles_L3... ·...

Programmation AndroidM1 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é - Pasd’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 estcréée (appel à onCreate, utilisation éventuelle d’une ressource alternative)

attention aux pertes potentielles de données (certaines valeurs peuventavoir 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 laclé 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 quela 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;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

if (savedInstanceState == null) truc = 2;else truc = savedInstanceState.getInt("monTruc");

}

@Overrideprotected 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 entrantbatterie 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écutera 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 BroadcastReceivercomposant 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 {

@Overridepublic 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 unIntent

une application qui réagit à ladiffusion 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_PROVIDERLocationManager.NETWORK_PROVIDERLocationManager.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-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>

localisation approximative (par le réseau par exemple)

<uses-permissionandroid: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...

@Overridepublic 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

...

@Overridepublic void onResume() {

super.onResume();if (locationManager != null) {

displayPosition();locationManager.requestLocationUpdates(

locationProvider, 6000, 100, mListener);}

}

@Overridepublic 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 deposition

l’affichage tient compte de lalangue

É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 zonecirculaire centrée sur le point d’intérêt

l’Intent diffusé peut être capturé par un récepteur de diffusion (voirsection 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’alerterayon : rayon (mètres) de la zone autour du point d’alerteexpiration : temps (millisecondes) de l’alerte, -1 pour une alertepermanentepIntent : pour générer l’Intent diffusé lorsque l’appareil entre/sortde 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 {

@Overridepublic 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;...@Overrideprotected 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

@Overridepublic void onResume() {

...locationManager.addProximityAlert(-21.11, 55.53,

1000.0f, -1, proximityIntent);...

}

@Overridepublic 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 projetsous Android Studio

Étienne Payet (DMI) Prog. Android – M1 informatique 40 / 74

Exercice

un appui sur le bouton en haut àdroite permet de pointer laposition 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 classeCameraUpdateFactory :

CameraUpdateFactory.zoomBy(float)CameraUpdateFactory.newLatLng(LatLng). . .

utiliser les méthodes moveCamera(CameraUpdate) ouanimateCamera(CameraUpdate) pour bouger la caméra

la classe LatLng permet de créer des points : constructeurLatLng(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 Activityimplements SensorEventListener {

private Sensor mAccelerometer;private SensorManager manager;private boolean accelSupported;

@Overridepublic 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

...

@Overridepublic void onResume() {

super.onResume();accelSupported = manager.registerListener(

this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);}

@Overridepublic void onPause() {

if (accelSupported)manager.unregisterListener(this, mAccelerometer);

super.onPause();}...

Étienne Payet (DMI) Prog. Android – M1 informatique 51 / 74

Exemple

...@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) { ... }

@Overridepublic 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 unemé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 ressourcessystème partagées avec d’autres applications (décodeur audio. . .)

règle : n’avoir qu’une seule instance de MediaPlayer et ne gardercette instance que si elle lit quelque chose

la méthode public void release () permet de détruire uneinstance de MediaPlayer et de libérer toutes les ressources systèmequi 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;

@Overridepublic 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 playpublic 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é:@Overridepublic 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 enfonction de l’inclinaison de l’appareil,elle ne sort pas de l’écran

le ToggleButton active/désactive ledéplacement de la balle

les boutons -/+ modifient la vitesse

lorsque la balle touche le bord del’écran, un son est émis

vérouiller la rotation de l’écran (modeportrait 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_MOVEMotionEvent.ACTION_DOWN. . .

Étienne Payet (DMI) Prog. Android – M1 informatique 64 / 74

Exemple

public class MainActivity extends Activity {

...

@Overridepublic 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 lesconfirmations 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 estcapturé et false sinon (et alors, l’événément est passé à un autre objetjusqu’à ce qu’il soit traité)

Étienne Payet (DMI) Prog. Android – M1 informatique 66 / 74

Exemple

public class MainActivity extends Activity implementsGestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener {

private static final String DEBUG_TAG = "Gestures";private GestureDetectorCompat mDetector;

@Overridepublic 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

...

@Overridepublic boolean onTouchEvent(MotionEvent event) {

this.mDetector.onTouchEvent(event);return super.onTouchEvent(event);

}

@Overridepublic boolean onDown(MotionEvent event) {

Log.d(DEBUG_TAG,"onDown: " + event.toString());return true;

}

@Overridepublic 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 implementsGestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

private static final int SWIPE_MIN_DISTANCE = 120;private static final int SWIPE_THRESHOLD_VELOCITY = 200;

...

@Overridepublic 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 desgestes gérés par la classe GestureDetector (simple/double tap, pressionlongue, 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 parun mouvement de balayage (swipe)

un son est émis lorsqu’une case estdéplacée

menu options : recommencer la partieen cours, commencer une nouvellepartie et quitter le jeu

gérer la rotation de l’écran (modesportrait 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