APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · •...

48
APPLICATIONS JAVA Android Partie I Ivan MADJAROV - 2014 1. Android Développement d'activités Java sous Android Applications Java sous Android IvMad, 2011-2014 2 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. L'architecture du système Android Android est un système d'exploitation basé Linux pour les appareils mobiles (Smartphone et Tablette) avec une interface de programmation Java. Le SDK Android a tous les outils nécessaires pour le développement d'applications: Compilateur Débogueur Emulateur Machine virtuelle Applications Java sous Android IvMad, 2011-2014 3 Application Android Android est un SE créé par l'Open Handset Alliance dirigée par Google. Android propose une interface de programmation Java avec sa propre machine virtuelle DVM (Virtual Machine Dalvik). L'interface fournit des outils pour la compilation, le débogage et un simulateur de périphérique mobile est embarqué. Android utilise une machine virtuelle spéciale. Son byte-code est incompatible avec celui de Java standard (Oracle). Un outil "dx" est proposé pour convertir un fichier Java classe dans le format Android "dex"(Dalvik exécutable). Une application Android est emballée dans un fichier .apk (Android Package) par AAPT (Android Asset Packaging Tool) Pour développer Google fournit ADT (Android Development Tools) pour l'IDE Eclipse et pour l'IDE NetBeans de Sun (Oracle). Applications Java sous Android IvMad, 2011-2014 4

Transcript of APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · •...

Page 1: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

APPLICATIONSJAVA

Android

Partie I

Ivan MADJAROV - 2014

1. AndroidDéveloppement d'activités Java sous Android

Applications Java sous Android IvMad, 2011-2014 2

L'objectif principal de ce cours est de découvrir la programmation sousAndroid, sa plate-forme de développement et les spécificités du développementembarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichides supports disponibles sur Internet.

L'architecture du système Android• Android est un système d'exploitation basé Linux pour les appareils

mobiles (Smartphone et Tablette) avec une interface de programmation Java.

• Le SDK Android a tous les outils nécessaires pour le développement d'applications:• Compilateur• Débogueur• Emulateur• Machine virtuelle

Applications Java sous Android IvMad, 2011-2014 3

Application Android• Android est un SE créé par l'Open Handset Alliance dirigée par Google.• Android propose une interface de programmation Java avec sa propre

machine virtuelle DVM (Virtual Machine Dalvik).• L'interface fournit des outils pour la compilation, le débogage et un

simulateur de périphérique mobile est embarqué.• Android utilise une machine virtuelle spéciale. Son byte-code est

incompatible avec celui de Java standard (Oracle).• Un outil "dx" est proposé pour convertir un fichier Java classe dans le

format Android "dex" (Dalvik exécutable).• Une application Android est emballée dans un fichier .apk (Android

Package) par AAPT (Android Asset Packaging Tool)• Pour développer Google fournit ADT (Android Development Tools) pour

l'IDE Eclipse et pour l'IDE NetBeans de Sun (Oracle).

Applications Java sous Android IvMad, 2011-2014 4

Page 2: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android• L'ADT effectue automatiquement la conversion d'une classe "dex" en

.apk au cours du déploiement.• Android supporte le graphisme 2-D et 3-D avec OpenGL library.• Le stockage de données dans une BD est pris en charge par SQLite.

• SQLite est une Open Source Database intégrée dans Android.• SQLite supporte les fonctionnalités standards pour une BDR telles que

SQL syntaxe, la gestion des transactions et "prepared statements".• Une application Android s'exécute dans son propre processus et sous

son propre nom d'utilisateur qui est généré automatiquement au coursde son déploiement. Par conséquent, l'application est isolée des autresapplications en cours et ne peut pas facilement affecter leur sécurité.

Applications Java sous Android IvMad, 2011-2014 5

L'architecture du système Android• Le GUI d'Android est un système mono-thread, événementiel avec une

bibliothèque à composants extensibles organisée autour du modèleModel-View-Controller (MVC).• Model: représente les données et le conteneur de données: base de données,

images, sons, etc.• View: c'est la partie de l'application chargée de rendre l'affichage, l'envoi de l'audio

aux haut-parleurs, générant un retour tactile.• Controller: c'est la partie qui répond à des actions externes: le clavier, l'écran tactile,

les appels entrants.

Applications Java sous Android IvMad, 2011-2014 6

Le développement Android• Android dispose d'un SDK basé sur le langage Java.• Le SDK d'Android est disponible pour les plateformes Linux, Mac et

Windows à l'adresse : http://code.google.com/android/download.html

• Pour développer avec l'IDE Eclipse Google fournit un plugin ADT (Android Development Tools): https://dl-ssl.google.com/android/eclipse/

• Pour le développementt avec l'IDE NetBeans Android propose leplugin "nbandroid" accessible à : http://nbandroid.kenai.com.

• Le développement pour Android est possible aussi sans un IDEparticulier en se servant des commandes du SDK d'Android avec Antpour la compilation et la gestion du simulateur.• A consulter : http://ydisanto.developpez.com/tutoriels/android/debuter/

Applications Java sous Android IvMad, 2011-2014 7

Le développement Android• La chaine de production Java Android

Applications Java sous Android IvMad, 2011-2014 8

Page 3: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Le système Android• Architecture d'une application Java Android

Applications Java sous Android IvMad, 2011-2014 9

Java2SE (Oracle) et Java Dalvik (Google)Applications Java sous Android IvMad, 2011-2014 10

Architecture AndroidApplications Java sous Android IvMad, 2011-2014 11

L'application Android• Une application Android en général est composée d'éléments

identifiables qui peuvent se séquencer différemment en fonction desobjectifs :1. Interface graphique : la partie visuelle de l'application, elle sert de

support pour les interactions de l'utilisateur.2. Traitement d'un événement : Les interactions de l'utilisateur avec le

GUI déclenche des événements qui sont gérés par les écouteursd'événements (Listener)

3. Opération de fond (Intent) : Des opérations de fond peuventéchanger des messages par la technique des Intents.

4. Connexion TCP ou Bluetooth : connexion à un réseau Wi-Fi ou à unautre Smartphone.

5. Affichage des résultats : on retourne à l'interface graphique

Applications Java sous Android IvMad, 2011-2014 12

Page 4: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

APPLICATIONSJAVA

Android

Partie II

Ivan MADJAROV - 2014

2. AndroidDéveloppement sous Eclipse avec SDK Android

Applications Java sous Android IvMad, 2011-2014 2

L'objectif principal de ce cours est de découvrir la programmation sousAndroid, sa plate-forme de développement et les spécificités du développementembarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichides supports disponibles sur Internet.

Développer avec Eclipse• Les outils nécessaires sont :

• Android SDK: http://dl.google.com/android/android-sdk_r22.3-windows.zip• Eclipse: http://www.eclipse.org/downloads/eclipse-standard-kepler-x86_64.zip• Le plugin ADT de Eclipse: https://dl-ssl.google.com/android/eclipse/

• Préparation de l’environnement• Installation du SDK Android dans SE.• Installation plug-in ADT pour Android dans Eclipse• Installation d’un téléphone virtuel Android• Configuration d'une unité virtuel dans l'IDE Eclipse• Un téléphone ou tablette Android se connectent à un PC par le câble USB.

Applications Java sous Android IvMad, 2011-2014 3

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 4

Zone de stockage des projets Eclipse

Page 5: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 5

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 6

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 7

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 8

Page 6: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 9

1

2

3

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 10

Développer avec Eclipse• Installation du plug-in ADT pour Eclipse -> Help -> Installer un nouveau

Software

Applications Java sous Android IvMad, 2011-2014 11

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 12

Page 7: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Développer avec Eclipse• Renseigner les champs: Name et Location

Applications Java sous Android IvMad, 2011-2014 13

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 14

1

2

3

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 15

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 16

Page 8: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Développer avec EclipseApplications Java sous Android IvMad, 2011-2014 17

Installation du SDK AndroidApplications Java sous Android IvMad, 2011-2014 18

Installation du SDK AndroidApplications Java sous Android IvMad, 2011-2014 19

Développer avec Eclipse• Installation d’un téléphone virtuel Android

Applications Java sous Android IvMad, 2011-2014 20

Page 9: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android SDK Manager• Installation d’un téléphone virtuel Android

Applications Java sous Android IvMad, 2011-2014 21

Android Virtual Device ManagerApplications Java sous Android IvMad, 2011-2014 22

Android Virtual Device ManagerApplications Java sous Android IvMad, 2011-2014 23

Android Virtual Device ManagerApplications Java sous Android IvMad, 2011-2014 24

Page 10: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 25

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 26

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 27

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 28

Page 11: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 29

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 30

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 31

Code généré à la création du projet

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 32

Pour exécuter l'application on click sur le bouton "Run".L'émulateur Android est lancé (le chargement est long)

Page 12: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 33

Le "premier_projet_android" avec les composants à compiler et à exécuter dans un environnement d'émulateur

La classe R accède aux ressources

Classe interne associée à une

ressource

Nom de la ressource dans le répertoire

res/layout

Plug-Ins Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 34

Nouveau projet Eclipse-AndroidApplications Java sous Android IvMad, 2011-2014 35

Log.i: méthode de traçage de l'exécution d'une application Android

ADT Bundle pour Windows• Pour le développement Android un seul kit est proposé le ADT

Bundle qui inclue tous les outils nécessaires pour le développementd'une application sous Eclipse:• Eclipse + ADT plugin• Android SDK Tools• Android Platform-tools• The latest Android platform• The latest Android system image for the emulator• http://developer.android.com/sdk/index.html

Applications Java sous Android IvMad, 2011-2014 36

Page 13: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Intégrer un Smartphone au ADT• Le Smartphone doit être configuré en mode "PTP"• Avant de lancer Eclipse il faut brancher le Smartphone à l'ordinateur• Ouvrir un invité de commandes et exécuter la commande:

• C:\Program Files\Android\android-sdk\platform-tools\adb.exe -c devices

• A la demande du Smartphone autoriser l'adresse MAC du PC sur leSmartphone (étape à ne pas rater!)

Applications Java sous Android IvMad, 2011-2014 37

Page 14: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

APPLICATIONSJAVA

Android

Partie III

Ivan MADJAROV - 2014

3. Architecture d'une application Android

Applications Java sous Android IvMad, 2011-2014 2

L'objectif principal de ce cours est de découvrir la programmation sousAndroid, sa plate-forme de développement et les spécificités du développementembarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichides supports disponibles sur Internet.

Composantes Android (1)• Les éléments essentiels du Framework Android :

• Activity : C'est la composante principale d'une application Android.Elle représente la couche représentative et visuelle de l'applicationqui peut avoir plusieurs couches qui alternent entre elles lors del'exécution.

• Fragment : C'est une portion d'interface plus souple et dynamique.Donc, une activité peut être constituée de plusieurs fragments.

• Views : Le IHM (GUI) est un "layout" ou une "widgets" couche quihérite des classes "android.view.View" et "android.view.ViewGroups".

• Service : A la différence d'une Activity un Service ne possède pasd'interface mais permet l'exécution d'un traitement en tâche defond. Donc il n'a pas de vue, mais permet l’exécution d’unalgorithme sur un temps indéfini et terminé en fonction de la tâche.

Applications Java sous Android IvMad, 2011-2014 3

Composantes Android (2)• Content Provider : Il permet le partage des données entre

applications, via un fournisseur de contenu (photos, contacts, ...).• Intents : Les composantes Android (Activity, Service, Broadcast receiver)

communiquent via des messages système que l'on appelle Intent(intention). Une application peut appeler un service ou une activité(explicite) ou appeler un service du système Android (implicites).

• Broadcast Receiver : C'est le récepteur d'événements qui réagit à unévénement système et les "Intents" implicites. Il ne possède pasd'interface utilisateurs et est destiné à l'exécution de tâches légères.Pour des tâches plus lourdes on lance un service. Un broadcast receiverpeut afficher un message, lancer une activité ou un service.

• Intent-Filter : un filtre d'intention sert à indiquer à une activité, serviceou broadcast receiver quels Intents peuvent implicitement traiter.

Applications Java sous Android IvMad, 2011-2014 4

Page 15: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Cycle de vie d’une application AndroidApplications Java sous Android IvMad, 2011-2014 5

public class MainActivity extends Activity {public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.acceuil); 

}// suspendue détruit: onDestroy invoquéprotected void onDestroy() {super.onDestroy(); 

}// actif suspendue: ne détient plus le focusprotected void onPause() {

super.onPause(); }// suspendue actif: onResume invoquéprotected void onResume() {super.onResume(); 

}// démarrage actif: détient le focus et est démarréprotected void onStart() {super.onStart(); 

}protected void onStop() {super.onStop(); 

} }

Architecture d'une application Android• onCreate : La méthode est appelée à la création d'une activité pour

initialiser les données nécessaires à l'exécution de l'application. Al'appel de la méthode un Bundle est passé en argument. Il contient l’étatde sauvegarde enregistré lors de la dernière exécution.

• onStart : La méthode est appelée dans le cas où l'application est enarrière-plan et qu’elle repasse en avant-plan. Si l'activité ne peut paspasser en avant plan alors, l’activité sera transférée à OnStop.

• onResume : La méthode est appelée après OnStart quand l'applicationpasse en background à cause d’une autre application.

• onPause : La méthode met en pause l'application et se relance avec laméthodes OnResume.

• onStop : Appelée quand l'activité n’est plus visible.• onDestroy : Appelée quand l'application est fermée (processus closed).

Applications Java sous Android IvMad, 2011-2014 6

Contexte d'une application Android• Le contexte relève l'état courant d'une application et les informations

sur son environnement et sert à récupérer des objets transmis pard'autres parties de l'application.

• On dispose de quatre méthodes:• getApplicationContext() : récupère le contexte de l'application en cours;• getContext() : récupère le contexte de la vue courante;• getBaseContext() : récupère le

contexte défini par la méthode setBaseContext()

• this : peut être utilisé quant on hérite directement de la classe Context.

Applications Java sous Android IvMad, 2011-2014 7

Programmer sous Android• Interface graphique par programmation (partie dynamique)

• Pour faciliter le développement, Android propose un grand nombre de"widgets": des éléments d’interface graphique qu'on peut utiliser dans uneapplication de manière directe et simple.

• On peut utiliser les classiques :• boutons, listes déroulantes, cases à cocher

• mais aussi de composants plus poussés :• des horloges, des sélecteurs de dates, des galeries photos et des afficheurs de

vidéos.

• Interface graphique par fichier XML (partie statique)• Le fichier XML sera lu par le programme et l’interface graphique sera

automatiquement générée en conséquence. Il devient ainsi beaucoup plusfacile de modifier et de faire évoluer une interface graphique déjàexistante, et pouvoir l'adaptée suivant le contexte.

Applications Java sous Android IvMad, 2011-2014 8

Page 16: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Le principe de l'interface graphiqueApplications Java sous Android IvMad, 2011-2014 9

Le principe de l'interface graphique• Le GUI sous Android est basée sur les View, les Layout et les Widget.• Un layout (gabarit) est une View (vue) spéciale qui peut contenir d'autres

View, ainsi le layout joue le rôle d'un conteneur.• Le Layout n'est pas destinée à fournir du contenu ou des contrôles à

l'utilisateur.• Les layouts se contentent de

disposer les Views par un gestionnaire de placement.

• Les Views se chargent de mettrele contenu utilisateur en place.

• Une View qui ne peut pas enenglober d'autres est appelée un widget (composant).

Applications Java sous Android IvMad, 2011-2014 10

Composants graphiques (Java)Applications Java sous Android IvMad, 2011-2014 11

• La class View est une zone de composant et source d'événement ce qui forme la base du GUI.

Vues et schémas (Java)• Les éléments graphiques héritent de la classe View. On peut regrouper

des éléments graphiques dans une ViewGroup.• ViewGroup : le regroupement est prédéfini sous la forme de schémas

(layout) qui proposent une prédispositions des objets graphiques:• LinearLayout : dispose les éléments de gauche à droite et du haut vers le

bas;• RelativeLayout : les éléments enfants les uns par rapport aux autres;• TableLayout : disposition en imitant un tableau par lignes et colonnes;• FrameLayout : disposition en haut à gauche en empilant les éléments.

• La classe ViewGroup ressemble à un gestionnaire de placement connuen Swing de Java2SE.

• Les déclarations peuvent se faire aussi en XML, ce qui évite de passerpar les instanciations Java (on verra ça par la suite).

Applications Java sous Android IvMad, 2011-2014 12

Page 17: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Programmer: Bonjour tout le mondeimport android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class Bonjour extends Activity {

public void onCreate(Bundle icicle) {super.onCreate(icicle);TextView tv = new TextView(this);tv.setText("Bonjour tout le monde !");setContentView(tv);

}}

Applications Java sous Android IvMad, 2011-2014 13

Simulateur d'unité mobile sous Android

• La méthode setText de la classe TextViewmet un String dans GUI.

• La méthode setContentView affiche la chaine de caractère dans l'interface graphique. 

Fait passer une instance de l'activité 

Label de texte et zone de texte (Java)Applications Java sous Android IvMad, 2011-2014 14

Définir le conteneur et l'ordre de

placement des composants

Avec une image (Java)Applications Java sous Android IvMad, 2011-2014 15

ImageView() est la boite qui peut contenir une image.

Les images utiles au projet sont placées dans le dossier

"res/drawable"

TextView, EditText, ImageView, BoutonApplications Java sous Android IvMad, 2011-2014 16

Page 18: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Récupérer la saisie d'un texte (Java)Applications Java sous Android IvMad, 2011-2014 17

public void onClick(View view) {// au click changer le texte sur la boutonbtn.setText("Bouton cliqué");// récupérer le texte tapé dans le champString monTxt = edit.getText().toString();// définir un affichage de texteTextView txt = new TextView(this);// mettre le texte du champtxt.setText(monTxt);// ajouter un texte au Layoutlayout.addView(txt);

}

Android - un boutonpackage ivmad.tp.nowdatetime;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.widget.Button;import java.util.Date;public class MainActivity extends Activity implements View.OnClickListener {

Button btn;public void onCreate(Bundle icicle) {

super.onCreate(icicle);btn = new Button(this);btn.setOnClickListener(this);updateTime();setContentView(btn);

}public void onClick(View v) {

updateTime();}private void updateTime() {

btn.setText(new Date().toString());}

}

Applications Java sous Android IvMad, 2011-2014 18

Déroulement de l'exemple (1)• La déclaration de paquetage doit être identique à celle utilisée pour

créer le projet.• Pour un projet Java il faut importer les classes auxquelles l'application

fait référence.• La plupart des classes spécifiques à Android se trouvent dans le paquetage

android• Les classes de Java SE sont utilisables par les programmes Android, mail il

faut consulter le guide de référence des classes Android pour connaitre leurdisponibilité et compatibilité.

• Les activités sont des classes publiques héritées de la classe de baseandroid.app.Activity.

• Les widgets sont des éléments d’interface graphique qu'on peut utiliserdans une application.

Applications Java sous Android IvMad, 2011-2014 19

Déroulement de l'exemple (2)• L’activité contient un bouton : Button btn;

• Un bouton est un widget Android et peut être utilisé dans une application.• Pour capturer tous les clics de bouton dans l'activité elle-même on

implémente OnClickListener (écouteur d'événement).• La méthode onCreate() est appelée au lancement de l’activité, alors

on établi un chaînage vers la superclasse afin d’initialiser l’activitéAndroid de base (super.onCreate(<Bundle object>)).

• L’instance de bouton créée (new Button(this)), on demande l’envoiede tous les clics sur ce bouton à l’instance de l’activité(setOnClickListener()) qui appelle la méthode onClick(View v).

• Un appel la méthode privée updateTime() est constitué, et pour finiron configure la vue du contenu de l’activité avec le bouton lui-même(setContentView()).

Applications Java sous Android IvMad, 2011-2014 20

Page 19: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Déroulement de l'exemple (3)• Tous les widgets dérivent de la classe de base View.• Bundle icicle est un gestionnaire opaque, que toutes les activités

reçoivent lors de leur création.• Avec Swing, un clic sur un JButton déclenche un ActionEvent qui est

transmis à l’ActionListener configuré pour ce bouton (Java2SE).• Avec Android un clic sur un bouton fait appel de la méthodeonClick() sur l’instance OnClickListener configurée pour ça.

• L’écouteur reçoit la vue qui a déclenché le clic et on fait alors appel àla méthode privée updateTime().

• L’ouverture de l’activité (onCreate()) ou un clic sur le bouton (onClick())doit provoquer la mise à jour du label du bouton avec la date courante.On utilise pour cela la méthode setText(), qui fonctionne exactementcomme avec les JButton de Swing.

Applications Java sous Android IvMad, 2011-2014 21

Toast : popup surgissant• Afficher un contenu dans un popup surgissant

• La classe Toast avec la méthode makeText affiche une fenêtre popup pour un délai 'court' ou 'long'. La méthode prend trois paramètres:

Context context = getApplicationContext(); // référence vers l'applicationString text = "Bonjour toast!"; // le texte à afficherint duration = Toast.LENGTH_SHORT; // La durée d'expositionToast toast = Toast.makeText(context, text, duration); // Appeltoast.show(); // Visualiser

• Appel direct du Toast pour une durée 'courte'Toast.makeText(this,text,Toast.LENGTH_SHORT).show();

• Appel direct du Toast pour une durée 'longue'Toast.makeText(this,text,Toast.LENGTH_LONG).show();

Applications Java sous Android IvMad, 2011-2014 22

CheckBoxCheckBox cba, cbb, cbc;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout ll = new LinearLayout(this);ll.setGravity(Gravity.TOP);ll.setOrientation(LinearLayout.VERTICAL);

// add buttonButton b = new Button(this);b.setText("Cliquez ici!");b.setOnClickListener(this);ll.addView(b);//add checkboxescba = new CheckBox(this);cba.setText("Bleu");ll.addView(cba);cbb = new CheckBox(this);cbb.setText("Blanc");ll.addView(cbb);cbc = new CheckBox(this);cbc.setText("Rouge");ll.addView(cbc);setContentView(ll);

}

public void onClick(View v) {Toast tst;String answer=""; if (cba.isChecked()) {

answer += cba.getText()+" ";}if (cbb.isChecked()) {

answer += cbb.getText()+" ";}if (cbc.isChecked()) {

answer += cbc.getText()+" ";} tst = Toast.makeText(this, answer,

Toast.LENGTH_LONG);tst.show();

} }

Applications Java sous Android IvMad, 2011-2014 23

Afficher avec Toast

Radio boutonprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);// Gestionnaire de placementLinearLayout ll = new LinearLayout(this);ll.setGravity(Gravity.TOP);ll.setOrientation(LinearLayout.VERTICAL);// BoutonButton b = new Button(this);b.setText("Affichez votre langage préféré");b.setOnClickListener(this);ll.addView(b);// Radio boutons en grouperg = new RadioGroup(this);rg.setOrientation(RadioGroup.VERTICAL);rba = new RadioButton(this);rba.setText("Java");rg.addView(rba);rbb = new RadioButton(this);rbb.setText("Python");rg.addView(rbb);rbc = new RadioButton(this);rbc.setText("C#");rg.addView(rbc);// Placement dans layoutll.addView(rg);setContentView(ll);

}

public void onClick(View v) {Toast tst; if ( rba.isChecked() ) {

tst = Toast.makeText(this, rba.getText(), Toast.LENGTH_LONG);

tst.show();}if ( rbb.isChecked() ) {

tst = Toast.makeText(this, rbb.getText(), Toast.LENGTH_LONG);

tst.show();}if ( rbc.isChecked() ) {

tst = Toast.makeText(this, rbc.getText(), Toast.LENGTH_LONG);

tst.show();}

}

Applications Java sous Android IvMad, 2011-2014 24

Afficher avec Toast

Page 20: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android Spinner (ComboBox)public class SpinnerComBoxActivity extends Activity implements OnClickListener {

String colors[] = {"Red","Blue","White","Yellow","Black"};Spinner sp;

public class SpinnerComBoxActivity extends Activity implements OnClickListener {protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);LinearLayout ll = new LinearLayout(this);ll.setGravity(Gravity.TOP);ll.setOrientation(LinearLayout.VERTICAL);Button b = new Button(this);b.setText("Affichez votre choix");b.setOnClickListener(this);ll.addView(b);sp = new Spinner(this); // Appliquer une 'Array' pour le 'Spinner' ArrayAdapter<String> spArrayAdapter =

new ArrayAdapter<String> (this,android.R.layout.simple_spinner_item,colors); sp.setAdapter(spArrayAdapter);ll.addView(sp);setContentView(ll);

}public void onClick(View v) {

int i = sp.getSelectedItemPosition();Toast.makeText(getBaseContext(),"Votre choix: "+colors[i],Toast.LENGTH_SHORT).show();

}}

Applications Java sous Android IvMad, 2011-2014 25

Android Spinner (ComboBox)• Pour réaliser la liste déroulante avec la classe Spinner dans le fichier

activity_spinner_com_box.xml il faut ajouter le code suivant: <Spinner

android:id="@+id/Spinner01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawSelectorOnTop="true">

</Spinner>

Applications Java sous Android IvMad, 2011-2014 26

Android Toggle buttonpublic class ToggleButtonMainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);ScrollView scrl = new ScrollView(this);final LinearLayout ll = new LinearLayout(this);ll.setOrientation(LinearLayout.VERTICAL);scrl.addView(ll);// ajouter un 'Toggle button'ToggleButton tb = new ToggleButton(this);tb.setTextOn("ON");tb.setTextOff("OFF");tb.setChecked(true);tb.setLayoutParams(new LayoutParams

(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

ll.addView(tb);    this.setContentView(scrl); } }

Applications Java sous Android IvMad, 2011-2014 27

Android - GUI dynamiqueApplications Java sous Android IvMad, 2011-2014 28

Page 21: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : Ecrire dans un fichierWriteData(getApplicationContext(),textOut); // Appel de la méthode ............ // context: id de l'applicationpublic void WriteData(Context context, String data) {

FileOutputStream fOut = null; OutputStreamWriter osw = null; try { // Ouvrir un fichier 'contacts.dat' en mode ajouter

fOut = context.openFileOutput("contacts.dat",MODE_APPEND);osw = new OutputStreamWriter(fOut); osw.write(data); // Ecrire les données dans le flux de sortieosw.flush(); // Vider le flux de sortie// affiche le résultat de l'opérationToast.makeText(context,"Sauvegarde réussie",Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(context,"Problème de

sauvegarde!",Toast.LENGTH_SHORT).show();} finally {

try { osw.close(); // Fermer le flux d'écriturefOut.close(); // Fermer le fichier 'contact.dat'

} catch (IOException e) { Toast.makeText(context,"Problème de

sauvegarde",Toast.LENGTH_SHORT).show(); }

} }

Applications Java sous Android IvMad, 2011-2014 29

Android : Lire dans un fichierString dataread = ReadData(getApplicationContext()); // Appel de la méthode..................... // context: id de l'application public String ReadData(Context context) {

FileInputStream fIn = null; InputStreamReader isr = null; char[] inputBuffer = new char[255]; String data = null; try { fIn = context.openFileInput("contacts.dat"); // Ouvrir le fichier isr = new InputStreamReader(fIn); // Lire dans le flux d'entréeisr.read(inputBuffer); // Lire le contenu du tampondata = new String(inputBuffer); // Convertir les données en chaine de car.

// affiche le contenu du fichier dans un popup surgissantToast.makeText(context,"Contenu: "+data,Toast.LENGTH_SHORT).show();

} catch (Exception e) { Toast.makeText(context,"Erreur de lecture",Toast.LENGTH_SHORT).show();

} finally {

try { isr.close(); fIn.close(); } catch (IOException e) { Toast.makeText(context,"Erreur de lecture",Toast.LENGTH_SHORT).show();

} } return data;

}

Applications Java sous Android IvMad, 2011-2014 30

Page 22: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

APPLICATIONSJAVA

Android

Partie IV

Ivan MADJAROV - 2014

4. Application réseaux, Bluetooth, Wi-FiAndroid

Applications Java sous Android IvMad, 2011-2014 2

L'objectif principal de ce cours est de découvrir la programmation sousAndroid, sa plate-forme de développement et les spécificités du développementembarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichides supports disponibles sur Internet.

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 modegraphique. Les logs permettent l'affichage en mode texte dans lafenêtre du LogCat.

• Pour afficher les opérateurs 'log' dans Eclipse il faut activer le LogCatview:• Window->Show View->Other...->LogCat.

• Pour écrire un opérateur 'Log' il faut importer la classe android.util.Logqui propose les méthodes Log.i() "Info", Log.d() "Debug", Log.w() "Warning", Log.e() "Error" .

• Exemple:• Log.i("NameActivity", "Bonjour, ça marche!");

Applications Java sous Android IvMad, 2011-2014 3

Android : Bluetooth (1)• Bluetooth est un protocole d'interconnexion à de courtes distances, de

type "peer-to-peer" avec une bande passante faible. La communication estcryptée entre les périphériques appariés. L'API Bluetooth permet descanner 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éthodelistenUsingRfcommWithServiceRecord.

Applications Java sous Android IvMad, 2011-2014 4

Page 23: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : Bluetooth (2)• Pour s'assurer que le périphérique possède le Bluetooth on procéder à

une vérification rapide en instanciant la classe BluetoothAdapter. Leretour 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();elseToast.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-2014 5

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'IntentBluetoothAdapter.ACTION_REQUEST_ENABLE. On vérifie que leBluetooth 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 duBluetooth sur son appareil. Le résultat de sa décision est récupérable parla méthode onActivityResult.

Applications Java sous Android IvMad, 2011-2014 6

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@Overrideprotected 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-2014 7

Android : Bluetooth (5)• 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-2014 8

Page 24: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : Bluetooth (6)• Le code complet (étudiez les instructions 'Set' et 'for') :public class BluetoothDeviceListActivity extends Activity {private final static int BLUETOOTH_SCAN = 1;String s = "";@Overrideprotected 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-2014 9

Android : Bluetooth (7)• La recherche d'appareils inconnus est un traitement asynchrone et

gourmant en energie 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-2014 10

Android : BT (8) Mettre tout ensemble Applications Java sous Android IvMad, 2011-2014 11

Ajouter les permissions dans le fichier manifest.xml

Android : Wi-Fi (1)• Sous Android le Wi-Fi est géré par un WifiManager. Le WifiManager

représente un Android Wi-Fi Connectivity Service. Il est capable deconfigurer une connexion Wi-Fi, de gérer une connexion en cours, descanner pour des points d'accès et d'enregistrer tout changement dansune connexion Wi-Fi.

• Le Wi-FiManager utilise la méthode getSystemService en précisant le typede service en constante: Context.WIFI_SERVICEString service = Context.WIFI_SERVICE;WifiManager wifi = (WifiManager)getSystemService(service);

• Pour autoriser l'utilisation du Wi-FiManager les paramètres despermissions pour accès et modification doivent être réglés dans lefichier 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-2014 12

Page 25: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : Wi-Fi (2)• Avec le Wi-FiManager on peut notamment activer ou désactiver la

fonction Wi-Fi dans l'appareil par la méthode setWifiEnabled, obtenir lestatut actuel du Wi-Fi par la méthode getWifiState ou vérifier si le Wi-Fiest 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 indiquerla situation en cours du WiFi de l'appareil :0 ‐ WIFI_STATE_DISABLING1 ‐ WIFI_STATE_DISABLED2 ‐ WIFI_STATE_ENABLING3 ‐ WIFI_STATE_ENABLED4 ‐ WIFI_STATE_UNKNOWN

Applications Java sous Android IvMad, 2011-2014 13

Android : Wi-Fi (3)• Si on met tout ensemble on peut vérifier l'état de notre appareil :

public class WiFiStateActivity extends Activity {String[] wifiState = {"WIFI_STATE_DISABLING", 

"WIFI_STATE_DISABLED", "WIFI_STATE_ENABLING", "WIFI_STATE_ENABLED", "WIFI_STATE_UNKNOWN"};

@Overrideprotected 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-2014 14

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.• Cette classe offre un certain nombre de méthodes qui apportent des

informations importantes sur 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-2014 15

Android : Wi-Fi (5)Applications Java sous Android IvMad, 2011-2014 16

• Afficher les éléments d'une connexion Wi-Fi en ajoutant les composants dans un StringBuilder par la méthode append()

Page 26: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : Wi-Fi (6)• Avec le Wi-FiManager on peut procéder à la recherche des hotspot

(bornes Wi-Fi) dans le voisinage par la méthode startScan.• Pour effectuer cette opération il faut utiliser un Broadcasr Receiver avec

un Intent SCAN_RESULTS_AVAILABLE_ACTION passé enparamètre. Cela assure un traitement asynchrone et la prise du résultatquand le scan a terminé.

• On appelle la méthode getScanResults pour obtenir les résultats sous laforme d'une liste d'objets ScanResult.

• Chaque objet du type ScanResult comporte les détails de la connexionrepérée.

• Le résultat du Scan est récupéré dans un objet de type List<E>. C'estune collection d'éléments indexés à partir de zéro.List<ScanResult> results = wifi.getScanResults();

Applications Java sous Android IvMad, 2011-2014 17

Android : Wi-Fi (7)Applications Java sous Android IvMad, 2011-2014 18

• Retourne le nombre de hotspot détectés et le SSID avec le plus fort signale à proximité

Android : StrictMode• 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 NetworkOnMainThreadExceptionest 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 destests plus facilement sur l'accès réseau en plaçant dans la méthodeonCreate() le code:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

Applications Java sous Android IvMad, 2011-2014 19

Android : client-side TCP socketpackage ivmad.TCP.Client;import java.io.DataInputStream; import java.io.DataOutputStream;import java.io.IOException; import java.net.Socket;import java.net.InetAddress; import java.net.UnknownHostException;import android.app.Activity; import android.os.Bundle;import android.os.StrictMode; import android.view.View;import android.widget.Button; import android.widget.EditText;import android.widget.LinearLayout; import android.widget.TextView;public class ClientTCPAndroidActivity extends Activity {LinearLayout layout; EditText textOut; TextView textIn; Button buttonSend;public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);textIn = new TextView(this);textIn.setText("Message à soumettre");textOut = new EditText(this);buttonSend = new Button(this);buttonSend.setText("Envoyer");buttonSend.setOnClickListener(buttonSendOnClickListener);layout.addView(textIn);layout.addView(textOut);layout.addView(buttonSend);setContentView(layout);

}

Applications Java sous Android IvMad, 2011-2014 20

Page 27: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : client-side TCP socketButton.OnClickListener buttonSendOnClickListener = new Button.OnClickListener() {

public void onClick(View v) {Socket socket = null;DataOutputStream dataOutputStream = null;DataInputStream dataInputStream = null;InetAddress serverAddr;String serverIpAddress = "192.168.0.141";// Définir les droits d'accès au ressources réseauxStrictMode.ThreadPolicy policy = new

StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);

try {serverAddr = InetAddress.getByName(serverIpAddress);socket = new Socket(serverAddr, 1234);dataOutputStream = new DataOutputStream(socket.getOutputStream());dataInputStream = new DataInputStream(socket.getInputStream());dataOutputStream.writeUTF(textOut.getText().toString());textIn.setText(dataInputStream.readUTF());

} catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally {

if (socket != null && dataOutputStream != null && dataInputStream != null) {try {

socket.close(); dataOutputStream.close(); dataInputStream.close();} catch (IOException e) { e.printStackTrace(); } } } } }; }

Applications Java sous Android IvMad, 2011-2014 21

Android : client-side TCP socket• Le fichier AndroidManifest.xml contient la description des ressources et

les autorisations d'accès au réseau Internet<?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-2014 22

L'autorisation d'accéder au réseau et configurée dans le Manifest de l'application

Android : client-side TCP socketApplications Java sous Android IvMad, 2011-2014 23

Le serveur TCP reçoit le message du client Android

Le client TCP basé Android envoie un message au Serveur basé TCP

Android : client HTTPApplications Java sous Android IvMad, 2011-2014 24

• Avant de procéder à une connexion réseau, il faut s'assurer que cetteconnexion est disponible. Un téléphone portable, un Smartphone ouune 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;

}

Page 28: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : HTTP connection• 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://ivmad.free.fr/ic4");HttpURLConnection con = (HttpURLConnection) url.openConnection();// méthode qui lit un contenu sur le Stream d'entréereadStream(con.getInputStream());

} catch (Exception e) {e.printStackTrace();

}

Applications Java sous Android IvMad, 2011-2014 25

Android : HTTP connection• 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-2014 26

Page 29: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

APPLICATIONSJAVA

Android

Partie V

Ivan MADJAROV - 2014

4. Interface graphique dans une application Androidavec XML

Applications Java sous Android IvMad, 2011-2014 2

L'objectif principal de ce cours est de découvrir la programmation sousAndroid, sa plate-forme de développement et les spécificités du développementembarqué sur téléphone mobile. Le cours s’inspire, reprend, modifie et enrichides supports disponibles sur Internet.

Android : connexion à MySQL• Une application Java peut se connecter à une BD MySQL avec un

connecteur JDBC. Ceci est juste pour Java2SE et JSP.• Le pilote JDBC est l'interface de liaison entre l'application et le SGBD.• Les récentes version d'Android préconisent l'utilisation d'un service

Web et une connexion basée HTTP par l'intermédiaire de scripts PHPou JSP pour accéder au contenu de la BD et pour recevoir sur l'unitémobile sous Android le résultat d'une requête SQL.

• Néanmoins, il est possible de réussir une connexion avec une BDbasée MySQL en se servant d'un connecteur JDBC anciennegénération beaucoup plus adapté aux connexions lentes d'unSmartphone ou une Tablette.

• Ainsi, dans les transparents qui suivent je présente une connexion réussie avec le connecteur JDBC dans le contexte de la DOSI : mysql-connector-java-3.0.17-ga-bin.jar

Applications Java sous Android IvMad, 2011-2014 3

Android: connexion à MySQLpublic void listDB() {

// Renseigner les champs nécessaires à la connexionString url = "jdbc:mysql://dbs-perso.luminy.univmed.fr:3306/nom_BD";String user = "nom_utilisateur";String pass = "mot_de_passe";try {

// Instancier le driver JDBCClass.forName("com.mysql.jdbc.Driver").newInstance();// Effectuer la connexion avec le serveur de la BDConnection con = DriverManager.getConnection(url, user, pass);// Confirmer la connexionToast.makeText(getApplicationContext(),"Connexion OK!",Toast.LENGTH_SHORT).show();// Préparer la requete SQLString result = "";Statement st = con.createStatement();ResultSet rs = st.executeQuery("select * from contact");// Recuperer le résultat de la requeteResultSetMetaData rsmd = rs.getMetaData();// Extraire les éléments propres à chaque champswhile(rs.next()) {

result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";result += rsmd.getColumnName(3) + ": " + rs.getString(3) + "\n";result += rsmd.getColumnName(4) + ": " + rs.getString(4) + "\n";

}rs.close(); con.close();// Afficher le résultatToast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();

} catch(Exception e) { e.printStackTrace(); } }

Applications Java sous Android IvMad, 2011-2014 4

Toast affiche un contenu dans un cadre temporaire en fonction de trois paramètres:

context, text, duration

Page 30: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android: connexion à MySQL• Dans l'IDE Eclipse le connecteur JDBC doit être rajouté au projet qui

gère les classes de la connexion.• Télécharger dans un dossier le connecteur à partir de l'adresse:

http://139.124.26.245/ic4/pilot/mysql-connector-java-3.0.17-ga-bin.jar• Par simple glisser dans l'interface

Eclipse: copier/coller mettre le pilote dans le répertoire 'libs'

• Bouton droit sur le projet pour choisir 'Properties' -> 'Java buil Path' -> Libraries -> 'Add Jars' ->Ajouter dans Libs du projet.

Applications Java sous Android IvMad, 2011-2014 5

Android: connexion à MySQL// Insérer des données dans une table public void insertDB() {

try {// Instancier le connecteur Class.forName("com.mysql.jdbc.Driver").newInstance();// Etablir la connexion avec le serveur de la BDConnection con = DriverManager.getConnection(url, user, pass);// Construire la requête d'insertion de données requises à partir // d'une interface utilisateur sur l'unité mobileString sSQL = "";sSQL += "INSERT INTO Contact(prenom,nom,tel)";sSQL += " VALUES ('"+lastNameText.getText().toString()+

"','"+firstNameText.getText().toString()+"','"+telNumberText.getText().toString()+"');";

// Créer l'opérateurStatement st = con.createStatement();// Lancement de la requête int nb = st.executeUpdate(sSQL);// Fermeture des connexionsst.close();con.close();

}catch(Exception e) {

e.printStackTrace();}

}

Applications Java sous Android IvMad, 2011-2014 6

GUI par XML : Layout (1)• Android, vis-à-vis des autres systèmes d'exploitation mobiles, possède

la possibilité de créer des interfaces graphiques à l'aide de fichiers XML.• Cette particularité favorise la séparation de la description de l'interface

graphique (layout XML) de la logique applicative (code Java).• Cela a pour effet la séparation du fond de la forme et facilite par

exemple la "localisation" d'une interface graphique en fonction de lalangue (français, anglais, bulgare), du contexte d'utilisation (jour ou nuit) oula modification de l’ergonomie (boutons, listes, cases à cocher).

• Android inclut un système proche des CSS de W3C bien connu pour ledéveloppement Web. Il s'agit des styles et des thèmes qui permettent lerespect d'une cohérence à travers une application.

• Ainsi, l'interface graphique est construite dans des fichiers XMLprésents dans le dossier res/layout d'un projet Android (Eclipse).

Applications Java sous Android IvMad, 2011-2014 7

XML : les bases• XML signifie eXtensible Markup Language• C'est un langage à balises accompagné normalement d'une description

sémantique (grammaire) et éventuellement de scripts CSS ou procédurede transformation XSLT pour la visualisation du document XML parun navigateur Web.• Les balises sont ouvrantes, <balise_ouvrante> ou fermantes,

</balise_fermante>, ou balises à paramètre <balise paramètre1, paramètre2 />• Les balises peuvent être imbriquées : on peut insérer un ou plusieurs

couples de balises<cinematheque> élément racine

<film> élément enfant<nom>Die Hard 4</nom> balise à contenu<realisateur>Len Wiseman</realisateur><annee_sortie>2012</annee_sortie><acteur prenom="Bruce" nom="Willis" /> balise avec attributs

</film></cinematheque>

Applications Java sous Android IvMad, 2011-2014 8

Page 31: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Les Transformations XML Applications Java sous Android IvMad, 2011-2014 9

Android : Styles et Thèmes• Un style est un ensemble d'attributs de formatage qu'on peut appliquer

à des éléments simples mis dans un fichier XML.• Par exemple, on peut définir un style qui spécifie une taille ou une couleur

appliqué à un certain type d'éléments View.• Un thème est un ensemble d'attributs de formatage qu'on peut

appliquer à une unité pour toutes les activités d'une application.• Par exemple, on peut définir un thème qui met des couleurs spécifiques

pour l'ensemble des éléments d'une fenêtre (bordure et fond), définir lataille du texte et les couleurs des menus dans un fichier XML.

• Créer ses propres Styles et Thèmes :• Créer un fichier 'styles.xml' avec un nœud '<ressource>' dans le répertoire

'res/values' du projet. Pour chaque style ou thème il faut ajouter un élément'<style name="nom_de_style">'. Les éléments de style sont déclarés àl'intérieur par des '<item name="android:style>valeur</item>'.

Applications Java sous Android IvMad, 2011-2014 10

Layout XML : les plus utilisés (2)• Un XML layout est un conteneur permettant d'organiser le placement

des différents widgets dans l'interface utilisateur (UI). Ainsi :• FrameLayout : Les widgets contenus dans le FrameLayout sont affichés en

haut à gauche de l'écran.• LinearLayout : Tous les widgets sont affichés les uns après les autres, soit

verticalement, soit horizontalement.• RelativeLayout : Permet d'organiser les différents widgets en fonctions de la

position des autres widgets.• TableLayout : Permet d'organiser les widgets en lignes et en colonnes en

imitant une présentation en forme de tableau.• Sous Android, la notion de mise en page est reliée à la notion de

Layout ce qui représente l’agencement des différents élémentsgraphiques dans l'interface graphique en fonction des différentestailles et résolutions d’écran.

Applications Java sous Android IvMad, 2011-2014 11

Layout XML : les plus utilisés (3)• On peut déclarer les Layouts par code Java ou par XML.• La déclaration en XML convient pour les interfaces statiques et la

déclaration Java convient aux interfaces dynamiques.• Les approches peuvent entre combinées en fonction des objectifs de

l'application à développer.• La déclaration du Layout de la principale vue (activity_main.xml) se

trouve dans le répertoire "res/layout" à partir de la racine du projet.• android:orientation : pour l’orientation du LinearLayout

(Vertical ou Horizontal).• android:layout_width et android:layout_height : fill_parent (match_parent) pour

dire que cela représente la taille du parent ou wrap_content pour dire qu’elleprend la taille de contenu.

Applications Java sous Android IvMad, 2011-2014 12

Page 32: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android• L'application Android est décrite dans le fichier AndroidManifest.xml.

• Le fichier contient la description de tous les Activities, Services, BroadcastReceivers,ContentProvider de l'application.

• Le fichier contient aussi les éléments de sécurité pour l'application: l'autorisationpour un accès réseau par exemple.

• C'est aussi le fichier qui contient la description des composants de déploiementd'une application Android.

Applications Java sous Android IvMad, 2011-2014 13

AndroidManifest.xml• L'application Android est décrite dans le fichier AndroidManifest.xml.

Applications Java sous Android IvMad, 2011-2014 14

Autorisations pour accéder au réseau

Le projet ADT Android• Un projet plugin ADT est décomposé de la manière suivante:

• src/: les sources Java du projet• libs/: bibliothèques tierces• res/:

• res/drawable: ressources images• res/layout: description des IHM en XML• res/values: chaines de caractères et dimensions

• gen/: les ressources auto générées par ADT• assets/: ressources brutes (raw bytes)• bin/:

• bin/classes: les classes compilées en .class• bin/classes.dex: exécutable pour la JVM Dalvik• bin/myapp.zip: les ressources de l'application• bin/myapp.apk: application empaquetée avec ses ressource et prête pour le déploiement

Applications Java sous Android IvMad, 2011-2014 15

Les ressources d'une application Android• Le répertoire res contient toutes les ressources qui seront mises dans le

apk :• drawable-hdpi - images en haute définition;• drawable-ldpi - images en basse définition;• drawable-mdpi - images en moyenne définition;• layout - description en XML des interfaces;• values - définitions en XML de constantes (chaînes, tableaux, valeurs numériques);• anim - description en XML d’animations;• menus - description en XML de menus pour l’application;• xml - fichiers XML utilisés directement par l’application;• raw - tous les autres types de ressources : sons, vidéos, …

Applications Java sous Android IvMad, 2011-2014 16

Page 33: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Accès aux ressources Android• Référencement d’une ressource dans un fichier xml. La forme générale

est : "@type/identificateur",• Par exemple : @string/letexte : Fait référence à une chaine contenue dans

un fichier XML placé dans le répertoire res/values et définie comme suit:<resources>

…<string name="letexte">Contenu du texte à afficher</string>…

</resources>

• Référencement d’une ressource dans le code Java. La forme généraleest : R.type.nom.

• La classe Ressource (R) permet l’accès aux ressources. Par exemple :R.string.letexte fait référence à la chaine ci-dessus.

• Dans l'application on accède aux ressources par la mise en place del’interface principale: setContentView(R.layout.nom_du_fichier_xml);

Applications Java sous Android IvMad, 2011-2014 17

Application Android et XML (1)• Création d’un nouveau projet Android : commencer par File -> New ->

Android Project -> Next -> Project Name (premiereApplication) -> Next ->Next -> Package Name (com.premiere.application) -> Finish. Avec celal’application est créée et peut être lancée par le bouton Run (Run as ->Android application).

• Les fichiers XML de l’application Android: ouvrir le fichierpremiereApplication -> res -> values -> string.xml

<?xml version="1.0" encoding="utf-8"?><resources>

<string name="hello">Hello World, Premiere_applicationActivity!</string><string name="app_name">Premiere_application</string>

</resources>

• Modifier le texte de l'attribut "hello" avec "Android, Bonjour tout le monde!". Sauvegarder et relancer l'application.

Applications Java sous Android IvMad, 2011-2014 18

Application Android et XML (1)• Ajouter des composants dans le fichier string.xml: Ouvrir l'onglet "Ressources".• Cliquer sur le bouton "Add"

choisir attribut "String" confirmer avec "OK". Inscrire dans le champ Name"prenom" et dans le champ Value"Entrez votre prénom :".Refaire les opérations d’ajout pour encoredeux attributs: Name "nom", Value "Entrez votre nom :" et Name "bouton", Value "Envoyer". Sauvegarder à chaque modification!

Applications Java sous Android IvMad, 2011-2014 19

Application Android et XML (1)• L'application Android affiche à son exécution un texte de bien venu.

L'interface graphique peut être gérer par des fichiers XML. Ainsi, lataille des caractères et la couleur du texte peut être préciser.

• Pour créer les fichiers XML nécessaires il faut procéder par: Faire clicdroit sur le dossier values -> New -> Other -> Android -> Android XMLFile -> Next -> File (dimensions.xml) -> Finish.

• Créer ensuite un nouvel attribut de type Dimension avec le coupleName: "dimMessage", Value: "30px". Pour enregistrer CTRL/S.

• Créer de la même façon un fichier colors.xml, en ajoutant un attribut detype Color avec Name: couleurMessage, et Value: "#ffa800". Pourenregistrer CTRL/S.

Applications Java sous Android IvMad, 2011-2014 20

Page 34: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (1)• Interface graphique:

• le contenu du fichier main.xml qui se situe dans res -> layout est modifiéainsi:

Applications Java sous Android IvMad, 2011-2014 21

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"

android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent" >

<TextView android:id="@+id/TextViewPrenom"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/prenom" />

<LinearLayoutandroid:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content" >

<EditText android:id="@+id/EditTextPrenom" android:layout_width="wrap_content"

android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="bottom"

android:hint="@string/prenomHint" /> <Button android:id="@+id/ButtonEnvoyerandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/bouton" /></LinearLayout> <TextView android:id="@+id/TextViewHello"

android:layout_width="wrap_content"android:layout_height="fill_parent"

android:layout_gravity="center_horizontal"android:textSize="@dimen/dimMessage"android:textColor="@color/couleurMessage"

/> </LinearLayout>

Application Android et XML (1)Les attributs XML de l'interface graphique.• android:id identifie l'élément et le rend accessible dans code Java;• android:layout_width, android:layout_height défini les dimensions de l’élément;

• fill_parent l’élément prend toute la place disponible;• wrap_content l’élément prend la place qu’il a besoins;

• android:layout_gravity précise la position de l’élément; (center_horizontal, center_vertical, etc…)

• android:text configure le texte à afficher; (string.xml)• android:textSize configure la taille du texte affiché; (dimensions.xml)• android:textColor configure la couleur du texte; (colors.xml)• android:hint texte à afficher lorsque EditText est vide; (strings.xml)• android:layout_weight rapport de taille entre éléments;

Applications Java sous Android IvMad, 2011-2014 22

Application Android et XML (1)• Au lancement de l'application l'écran suivant apparait sur le simulateur

Android. Dans le champ de saisie un prénom peut être tapé. Ainsi,l'interface graphique est fonctionnelle.

• Le bouton "Envoyer" n'est attaché à un traitement d'évènements. C'estpourquoi aucune réaction pour l'instant n'est possible.

Applications Java sous Android IvMad, 2011-2014 23

Installer une application Android• Sous Android, les applications sont des fichiers *.apk.• Installer une application Android depuis un fichier apk sur un

téléphone portable ou une tablette équipés du système Android :• Installer AppManager en le récupérant depuis Android Market• Transférer le fichier apk à installer sur la carte SD

(on peut aussi utiliser MountUSB)• Lancer AppManager• Appuyer sur la touche menu et sélectionner "Install from SD", sélectionner

l’application à installer(si l’application n’apparait pas, appuyer sur menu et "Whole SD")

• Deuxième possibilité: Envoyer le fichier apk par email. A l'ouverture de la pièce attachée l'application s'installe automatiquement

Applications Java sous Android IvMad, 2011-2014 24

Page 35: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (Juno)• On crée un projet de base. Le code généré par l'environnement

Eclipse (Juno) et l'arborescence des ressources sont les suivants:package ivmad.iut.viewproject;import android.os.Bundle;import android.app.Activity;import android.view.Menu;

public class MainActivity extends Activity {

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

}public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);return true;

}

}

Applications Java sous Android IvMad, 2011-2014 25

Application Android et XML (2)• Dans la méthode OnCreate, on définit la vue à l’aide de la méthode

setContentView et on lui affecte R.layout.activity_main qui représente lavue, déclarée dans le dossier Layout.• R désigne la ressource utilisée dans le dossier res.• Toutes les ressources qui se trouvent dans le dossier res sont précompilées

et des liens sont générés dans le dossier R.java. (C'est automatique à lacréation du projet)

• Les ressources du dossier res peuvent être modifiées car ce sont desdescriptions en format XML, c.à.d. des fichiers textes à balisages

Applications Java sous Android IvMad, 2011-2014 26

Application Android et XML (2)• Pour changer une vue on change le fichier res/layout/activity_main.xml

Applications Java sous Android IvMad, 2011-2014 27

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ><ImageView android:id="@+id/android_picture" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/normal_padding" android:src="@drawable/android" android:contentDescription="@string/image_content_description" /><Button android:id="@+id/create_account" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="@dimen/small_padding" android:text="@string/create_account" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:paddingTop="@dimen/normal_padding" android:text="@string/email" android:textSize="@dimen/normal_text_size" android:textColor="@color/black_color" />

<EditText android:id="@+id/user_email" android:layout_width="@dimen/large_padding" android:layout_height="wrap_content" android:inputType="textEmailAddress" android:layout_gravity="center" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:paddingTop="@dimen/normal_padding" android:textSize="@dimen/normal_text_size" android:text="@string/password" android:textColor="@color/black_color" /> <EditText android:id="@+id/user_password" android:layout_width="@dimen/large_padding" android:layout_height="wrap_content" android:layout_gravity="center" android:inputType="textPassword" /><Button android:id="@+id/connect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="@dimen/normal_padding" android:text="@string/connect" /> </LinearLayout>

Application Android et XML (2)• LinearLayout :

• android:orientation : Orientation verticale.• android:layout_width et android:layout_height : Hauteur et largeur du Layout

• ImageView : élément qui sert à afficher une image• android:layout_height : Définir la hauteur de l’élément.• android:id : Identifiant de l’élément• android:layout_width : Largeur de l’élément.• android:src : Image source utilisée pour l’ImageView.• android:layout_marginTop : Marge externe du haut.

• Les différentes tailles utilisées sont déclarées dans le fichier dimens.xml (dossier values) etutilisées en suivant la syntaxe @dimen/nom_de_la_variable

• android:contentDescription : utiliser pour la description du contenu de l’image

Applications Java sous Android IvMad, 2011-2014 28

Page 36: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (2)• Button

• android:layout_gravity : Position de l’élément (center, left, right…).• android:text : Texte à afficher dans l’élément.

• Toute les chaines de caractères utilisées sont déclarées dans le ficher strings.xml etutilisées à l’aide de la syntaxe @string/nom_de_la_chaine

• TextView• android:textColor : Couleur du texte.

• Toute les couleurs utilisées sont déclarées dans le fichier colors.xml et utilisées à l’aide dela syntaxe @color/nom_de_la_couleur.

• android:paddingTop : Marge interne du haut.• android:textSize : Définie la taille du texte.

• EditText• android:inputType : Type du texte qui sera saisie dans la zone d’édition.

Applications Java sous Android IvMad, 2011-2014 29

Application Android et XML (2)• TextView et EditText (similaire aux CSS3)

• android:paddingTop : C’est pour l’espacement du haut du Layout.• android:gravity : Spécifie l’emplacement du contenu dans le conteneur.• android:textSize : Spécifie la taille de texte.• android:textStyle : Spécifie un style au texte (bold, italic, bolditalic).• android:textColor : Spécifie la couleur du texte.• android:id : Donne un identifiant à l’objet, afin de pouvoir y accéder depuis

une activité.• android:hint : Spécifie un texte par défaut sur la zone. Ce texte sera affiché

quand aucun android:text n’est défini (sert surtout en texte d’indicationpour des champs de formulaire par exemple).

Applications Java sous Android IvMad, 2011-2014 30

Application Android et XML (3)• Intent: Le sandboxing (bac à sable) est une pratique de sécurité dans la

téléphonie mobile qui consiste à séparer les applications entre elles.Android exécute une application en limitant les actions autorisées(accès mémoire, accès sur les capteurs, etc…).

• Pour contourner cette difficulté de communication entre applicationson utilise les Intent (Intentions).

• Un Intent permet d’envoyer et recevoir des messages (avec ou sans desdonnées) pour déclencher une action, dans un composant d’une mêmeapplication (une Activity) voir même dans une autre application.

• Ainsi, un Intent est un ensemble de données qui peut être passé à unautre composant applicatif (de la même Activity ou non) de façonimplicite (requête pour une action: lire de la musique ou scanner uncode barre) ou explicite (lancement d’une classe externe).

Applications Java sous Android IvMad, 2011-2014 31

Application Android et XML (4)Applications Java sous Android IvMad, 2011-2014 32

La figure illustre la manière dont un Intent implicite est délivré à travers lesystème pour démarrer une autre activité. L'activité A crée un Intent parstartActivity(). Le système Android cherche les applications dont l'Intent filtercorrespond. Si une correspondance est trouvée le système démarre l'activitéB en appelant la méthode onCreate().

Page 37: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (5)• Dans un contexte de l'informatique, le broadcasting désigne une

méthode de transmission de données à l'ensemble des machines d'unréseau.

• Pour pouvoir recevoir des Intent, Android permet de créer une classequi implémente BroadcastReceiver avec une seule méthode onReceive().

• Le système Android envoie l'intention (Intent) à tous les BroadCastReceiver abonnés par ordre de priorité (AndroidManifest.xml).

• Un BroadCast Receiver est un composant Android qui écoute etenregistre tout changement dans le mobile: la reception de messagesSMS, appels téléphoniques, statut de la batterie, accès au réseau Wi-Fi,etc.

Applications Java sous Android IvMad, 2011-2014 33

Application Android et XML (6)• Le fichier colors.xml contient les couleurs utilisées dans l’application

<?xml version="1.0" encoding="utf-8"?><resources>

<color name="black_color">#000</color></resources>

• Le fichier dimens.xml défini les dimensions utilisées.• Les tailles déclarées sont en dp (density independant pixel) pour la taille des

composants et en sp (scale independant pixel) pour la taille des polices.• Les tailles en dp / sp garantissent les mêmes proportions dans les interfaces

quelques soit la densité de l’écran cible<resources><dimen name="padding_small">8dp</dimen><dimen name="padding_medium">8dp</dimen><dimen name="padding_large">16dp</dimen><dimen name="normal_text_size">15sp</dimen><dimen name="normal_padding">20dp</dimen><dimen name="large_padding">100dp</dimen><dimen name="small_padding">10dp</dimen>

</resources>

Applications Java sous Android IvMad, 2011-2014 34

Application Android et XML (7)• Le fichier string.xml est utilisé pour déclarer les chaines de caractères<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">

FirstAndroidView</string><string name="hello_world">

Bonjour tout le monde!</string><string name="menu_settings">Settings</string><string name="title_activity_main">

MainActivity</string><string name="image_content_description">

Logo Android</string><string name="create_account">

Créer un compte</string><string name="email">Adresse email</string><string name="password">Mot de passe</string><string name="connect">Se connecter</string> </resources>

Applications Java sous Android IvMad, 2011-2014 35

Application Android et XML (8)• Gérer l'événement du bouton et afficher le résultat dans une autre Vue

par la création d'une deuxième activité. La vue est décrite dans lefichier XML: res/layout/login_display.xml

Applications Java sous Android IvMad, 2011-2014 36

<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" android:paddingTop="@dimen/layout_padding_top" ><TextView

android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/email"

android:textColor="@color/black_color"android:textSize="@dimen/big_text_size"android:textStyle="bold" /><TextView

android:id="@+id/email_display"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:hint="@string/hint_mail"android:textColor="@color/black_color"

android:textSize="@dimen/big_text_size" />

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"

android:paddingTop="@dimen/normal_padding"android:text="@string/password"

android:textColor="@color/black_color" android:textSize="@dimen/big_text_size"

android:textStyle="bold" /><TextView

android:id="@+id/password_display"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:hint="@string/hint_pass"

android:textColor="@color/black_color" android:textSize="@dimen/big_text_size" />

</LinearLayout>

Page 38: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (9)• Le nouvelle Vue est liée à une nouvelle activité dont il faut créer le

code Java dans le fichier : src/nom.package/LoginDisplayActivity.javapublic class LoginDisplayActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login_display);

}}

• Les activités et les ressources d'une application Android sont décritesdans le fichier XML : AndroidManifest.xml• La ligne à ajouter pour la nouvelle Vue à côté du nom de l'activité principale :<activity android:name=".LoginDisplayActivity" />

• Actualiser le fichier string.xml avec les chaines pour la nouvelle Vue:<string name="title_activity_login_display">LoginDisplayActivity</string><string name="hint_mail">"Ici : L'adresse email de l'utilisateur"</string><string name="hint_pass">"Ici : Le mot de passe de l'utilisateur"</string>

Applications Java sous Android IvMad, 2011-2014 37

Application Android et XML (10)• Le fichier XML dimens.xml doit être mis à jour en ajoutant les lignes

suivantes:<dimen name="layout_padding_top">80dp</dimen><dimen name="big_text_size">20sp</dimen>

• Pour mettre en place le passage d’une activité à une autre il fautajouter du code dans la MainActivity.java.• On déclare un OnClickListener sur le bouton libellé "se connecter".• Pour le passage d’une activité à une autre on crée un Intent

• Les intents sont des messages utilisées par le système comme moyen de communicationavec des applications, activités …

• Le premier argument représente le contexte et le second représente l’activité d’arrivée.

• On utilise la méthode startActivity avec comme argument l’intent crée.

Applications Java sous Android IvMad, 2011-2014 38

Application Android et XML (11)• Pour récupérer l'événement du bouton "se connecter" on ajoute le code

suivant dans la méthode OnCreate().loginButton.setOnClickListener(new OnClickListener() {

public void onClick(View v) {Intent intent = new Intent(MainActivity.this, LoginDisplayActivity.class);startActivity(intent);}

});

• Le code actuel effectue le passage de la première activité à la seconde sans transfert de données d'une activité à l'autre.

• Pour transmettre ces données, il faut ajouter à l’intent une clé permettant de les identifier.• On déclare EXTRA_LOGIN et EXTRA_PASSWORD pour le passage des

données. Lors du clic sur le bouton, on récupère les textes saisies par l’utilisateur getText().toString. On associe ces valeurs avec l’intent par la méthode putExtra

Applications Java sous Android IvMad, 2011-2014 39

Application Android et XML (12)• L'étape suivante: il faut récupérer les données transmises par l’intent et

les assigner aux zones de texte dans l'activité LoginDisplayActivity àl’aide de la méthode getIntent en vérifiant que ce dernier n’est pas nulle.

• Initialiser les deux zones de textes servant à afficher les informationsutilisateurs (login/password).

• Récupérer les deux informations à l’aide de leurs clés et de la méthodegetStringExtra. Il faut utiliser la méthode getTypeExtra où Typecorrespond au type de la donnée passé.

• Lier les textes récupérés aux TextView à l’aide de la méthode setText• En plus, un contrôle de la saisie peut être mis en place pour éviter les

champs vides ou l'adresse mail non conforme aux standards en seservant des "paternes" avec les symboles autorisés.

Applications Java sous Android IvMad, 2011-2014 40

Page 39: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (13)import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.widget.TextView;public class LoginDisplayActivity extends Activity {

final String EXTRA_LOGIN = "user_login";final String EXTRA_PASSWORD = "user_password";public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.login_display);Intent intent = getIntent();TextView loginDisplay = (TextView) findViewById(R.id.email_display);TextView passwordDisplay = (TextView) findViewById(R.id.password_display);if (intent != null) {

loginDisplay.setText(intent.getStringExtra(EXTRA_LOGIN));passwordDisplay.setText(intent.getStringExtra(EXTRA_PASSWORD));

}}

}

Applications Java sous Android IvMad, 2011-2014 41

Application Android et XML (14)import java.util.regex.Matcher;import java.util.regex.Pattern;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {

final String EXTRA_LOGIN = "user_login";final String EXTRA_PASSWORD = "user_password";public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final EditText login = (EditText) findViewById(R.id.user_email);final EditText pass = (EditText) findViewById(R.id.user_password);final Button loginButton = (Button) findViewById(R.id.connect);

Applications Java sous Android IvMad, 2011-2014 42

Application Android et XML (15)loginButton.setOnClickListener(new OnClickListener() {

public void onClick(View v) {final String loginTxt = login.getText().toString();final String passTxt = pass.getText().toString();// le 'pattern' pour vérifier le contenu de l'adresse mailPattern p = Pattern.compile(".+@.+\\.[a-z]+");// Le 'matcher' va comparer le 'pattern' avec le 'string' passé en argumentMatcher m = p.matcher(loginTxt);// Si l’adresse mail saisie ne correspond au format d’une// adresse mail on affiche un message d'erreurif (!m.matches()) {Toast.makeText(MainActivity.this,R.string.email_format_error,Toast.LENGTH_SHORT).show();// Pour éviter l'exécution des opérateurs qui suiventreturn;

}

Applications Java sous Android IvMad, 2011-2014 43

Application Android et XML (16)// le cas des différents champs qui ne doivent pas être videsif (loginTxt.equals("") || passTxt.equals("")) {

Toast.makeText(MainActivity.this,R.string.email_or_password_empty,Toast.LENGTH_SHORT).show();

return;}// activer la vue pour afficher le résultatIntent intent = new Intent(MainActivity.this,LoginDisplayActivity.class);intent.putExtra(EXTRA_LOGIN, loginTxt);intent.putExtra(EXTRA_PASSWORD, passTxt);startActivity(intent);}});}}

Applications Java sous Android IvMad, 2011-2014 44

Page 40: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Application Android et XML (17)Applications Java sous Android IvMad, 2011-2014 45

ListView Android• A la base une classe ListView utilise des objets TextView pour chaque

ligne de la liste•

Applications Java sous Android IvMad, 2011-2014 46

Les menus sous Android• Les types de menus existants au sein de la plateforme Android

• Les menus d’options : Le menu apparait quand on clique sur le bouton "Menu"du téléphone ou de la tablette. Les menus s’affichent en bas de l’écran. Laméthode utilisée pour la création des options du menu:• public boolean onCreateOptionsMenu(Menu menu)• On rajoute des événements lorsque l’on clique sur un des items du menu, grâce à la

méthode onMenuItemSelected(int featureId, MenuItem item)• Les menus d’options à préférences étendues : Ils permettent d’afficher un

menu en bas de l’écran lors de l’appui sur une touche d’option d’un menu.• Les menus contextuels : On les retrouve généralement en cliquant sur un objet

avec un appui long ou court, une fenêtre de choix s’affiche alors. Pour ouvrir unmenu contextuel on ses sert de la méthode:• onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo)

Applications Java sous Android IvMad, 2011-2014 47

Les menus sous Android• Pour créer un menu simple on procède par un nouveau projet

Android sous Eclipse et on modifie le code Java de l'activité principalede la manière suivante:import android.app.Activity;import android.view.Menu;public class MenuOptionActivity extends Activity {

public boolean onCreateOptionsMenu(Menu menu) {menu.add("Options");menu.add("Quitter");return true;

}}

• Après lancement du projet on appuie sur le bouton "menu" du téléphone ou de la tablette

Applications Java sous Android IvMad, 2011-2014 48

Page 41: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Les menus sous Android• La manière la plus adaptée à une maintenance et un développement

efficace est de passer par les fichiers XML. Le même principe estvalable et pour la création des menus. Le menu est décrit dans lefichier res/menu/menu.xml<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Options" android:id="@+id/itemOptions"></item><item android:title="Quitter" android:id="@+id/itemQuitter"></item>

</menu>

• Puis dans le code de la méthode onCreateOptionsMenu, on récupère lemenu sous forme XML et l’afficher.public boolean onCreateOptionsMenu(Menu menu) {

// Création du menu inflaterMenuInflater inflater = getMenuInflater();// On envoi a la variable menu le fichier xml parsé par l'inflaterinflater.inflate(R.menu.monmenu, menu);return true; }

Applications Java sous Android IvMad, 2011-2014 49

Les menus sous Android• Etape suivante: On rajoute des événements lorsque l’on clique sur

un des items du menu, grâce à la méthode onMenuItemSelected(int featureId, MenuItem item)• Deux paramètres sont passés: id du panel contenant le menu et l'item qui est cliquépublic boolean onMenuItemSelected(int featureId, MenuItem item) {

// On récupère l'id de l'item et on le compareswitch (item.getItemId()) {// choix égal à itemOptionscase R.id.itemOptions:// On affiche un messageToast.makeText(this, "Ouverture des options", Toast.LENGTH_SHORT).show();return true;// choix égal à itemQuittercase R.id.itemQuitter:// On ferme l'activitéfinish();return true;

}return super.onMenuItemSelected(featureId, item); }

Applications Java sous Android IvMad, 2011-2014 50

Les menus sous Android• Dans le fichier res/menu/menu.xml on peut ajouter l'item qui définie le

chargement d'une image ou icone dans l'élément du menu:<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Options" android:id="@+id/itemOptions"android:icon="@drawable/icon_preferences">

</item><item

android:title="Quitter" android:id="@+id/itemQuitter"android:icon="@drawable/icon_quit">

</item></menu>

• Les deux fichiers graphiques sont enregistrésdans le dossier res/drawable

Applications Java sous Android IvMad, 2011-2014 51

Tableau dans une application Android• La structure tableau dans toutes les plates-formes représente un

moyen efficace de présentation et/ou de stockage d'information.• Le point de départ pour mettre en place un tableau dans une

application Android est de s'adresser à l'élément TableLayout.• Le principe est un peu le même que pour le tableau en HTML :

• TableLayout défini un tableau, dans lequel on rajoute des lignes• TableRow contient les composants.

• Les colonnes peuvent être définies comme• extensibles (setColumnStretchable()) pour gérer la largeur des colonnes tout en

laissant une occuper l’espace vide pour arriver à la largeur du conteneur• rétractables (setColumnShrinkable()) pour obtenir l’effet inverse.

• Le TableLayout ne gère pas l’affichage des bordures, lignes, colonnes oucellules. C'est à définir dans un fichier style.xml.

Applications Java sous Android IvMad, 2011-2014 52

Page 42: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Tableau dans une application Android• Créer le tableau dans res/layout/main.xml

<TableLayout style="@style/frag1TableLayout" ><TableRow style="@style/frag1HeaderTableRow">

<TextView style="@style/frag1HeaderCol" android:text="cm"/><TextView style="@style/frag1HeaderCol" android:text="inch"/>

</TableRow><TableRow style="@style/frag1TableRow">

<TextView style="@style/frag1Col" android:text="2.54"/><TextView style="@style/frag1Col" android:text="1"/>

</TableRow><TableRow style="@style/frag1TableRow">

<TextView style="@style/frag1Col" android:text="5.08"/><TextView style="@style/frag1Col" android:text="2"/>

</TableRow><TableRow style="@style/frag1TableRow">

<TextView style="@style/frag1Col" android:text="7.62"/><TextView style="@style/frag1Col" android:text="3"/></TableRow>

</TableLayout>

Applications Java sous Android IvMad, 2011-2014 53

Tableau dans une application Android• Un style peut être appliqué pour chacune des colonnes comme une

feuille de style CSS dans le fichier style.xml.<resources xmlns:android="http://schemas.android.com/apk/res/android"><style name="AppTheme" parent="@android:style/android:Theme.Light" /><style name="defaultTextView" parent="@android:style/TextAppearance.Medium">

<item name="android:layout_width">match_parent</item><item name="android:layout_height">wrap_content</item></style>

<style name="frag1TableLayout"><item name="android:layout_width">match_parent</item><item name="android:layout_height">wrap_content</item></style>

<style name="frag1HeaderTableRow" parent="frag1TableLayout"><item name="android:layout_marginBottom">3dp</item></style>

<style name="frag1TableRow" parent="frag1TableLayout"></style><style name="frag1Col" parent="defaultTextView">

<item name="android:layout_marginBottom">1dp</item><item name="android:background">@drawable/tableborder</item></style>

<style name="frag1HeaderCol" parent="frag1Col"><item name="android:textStyle">bold</item></style>

</resources>

Applications Java sous Android IvMad, 2011-2014 54

Tableau dans une application Android• Ajouter une bordure au tableau grâce à un objet drawable en forme de

rectangle défini en arrière plan. Pour cela on créer l'objet drawable dansle répertoire /res/drawable/tableborder.xml.<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" >

<solid android:color="#FFFFFF"/><stroke android:width="1dp" android:color="#777777"/><corners android:radius="3dp" /><padding android:left="100dp" android:top="5dp"

android:right="10dp" android:bottom="5dp" /></shape>

Applications Java sous Android IvMad, 2011-2014 55

Géolocalisation avec Java Android• En général une unité mobile Android propose des moyens de

déterminer sa géolocalisation:• Par le module GPS (Global Positioning System),• Par triangulation des cellules mobiles (3G),• Par le réseau Wifi.

• Pour géolocaliser un Android, l'activité implémente LocationListener. • On s'adresse ensuite à l’objet LocationManager pour gérer l'abonnement

aux mises à jour des coordonnées GPS.• Dans l'Activité (Vue) 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 statuts d’une source change;• onLocationChanged est appelée quand les coordonnées GPS changent.

Applications Java sous Android IvMad, 2011-2014 56

Page 43: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Géolocalisation avec Java Android• 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-2014 57

Géolocalisation avec Java Android• Pour s’abonner à la mise à jour des coordonnées GPS, il faut utiliser la

méthode requestLocationUpdates(String, long, float, LocationListener)possédant 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 GPSdans la méthode onResume et de se désabonner dans la méthode onStopafin de stopper l’utilisateur des ressources de localisation alors quel’application n’en a plus l’utilité, sinon le processus de mise à jourcontinu est la consommation de la batterie est importante.

Applications Java sous Android IvMad, 2011-2014 58

Géolocalisation avec Java Androidimport android.app.Activity;import android.content.Context;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.widget.Toast;public class SimpleGeoLocalisationActivity extends Activity {

private LocationManager locationManager;private LocationListener locationListener;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple_geo_localisation);// On s'adresse à la classe LocationManager pour obtenir localisation GPSlocationManager =

(LocationManager)getSystemService(Context.LOCATION_SERVICE);locationListener = new MyLocationListener();// Géolocalisation par GPSlocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,

0, 0, locationListener);

Applications Java sous Android IvMad, 2011-2014 59

Géolocalisation avec Java Android// Géolocalisation par les cellules du réseau GSM, précision 500m// locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,

0, 0, locationListener); } public void onLocationChanged(Location loc) {

if (loc != null) {Toast.makeText(getBaseContext(),

"Localisation actuelle Lat: " + loc.getLatitude() + " Lng: " + loc.getLongitude() + " Alt: " + loc.getAltitude() + " Prec: " + loc.getAccuracy(),Toast.LENGTH_LONG).show();

}}public void onProviderDisabled(String provider) { }public void onProviderEnabled(String provider) { }public void onStatusChanged(String provider, int status,Bundle extras) { }}

}

Applications Java sous Android IvMad, 2011-2014 60

Page 44: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android: AsyncTask (Thread)• Un thread est un fil d'exécution ou tâche utilisé avec l'interface

graphique d'un programme Java ou par des programmes de calculintensif.

• Une application Android consommatrices de ressources (requêtes http,calculs lourds, …) doit faire appel à un thread séparé pour "déconnecter" leGUI du calcul. Ainsi, les deux taches fonctionnent de manièreasynchrone (AsyncTask) sans provoquer l'arrêt de l'Activité principalesi elle est bloquée trop longtemps.• Créer un nouveau projet appelé AsyncTache qui prend en charge un

traitement long de manière asynchrone.• Modifier le res/layout/main.xml en ajoutant un Button qui sert à lancer le

traitement et une ProgressBar pour afficher la progression du traitement(transparent suivant).

Applications Java sous Android IvMad, 2011-2014 61

Android: AsyncTask (Thread)• Le code XML à mettre dans res/layout/main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:layout_height="fill_parent"android:orientation="vertical" ><Button android:layout_marginTop="10dp"

android:id="@+id/btnLaunch" android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Lancer la tâche" />

<TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="Progression de la tâche asynchrone:" />

<ProgressBar android:id="@+id/pBAsync"style="?android:attr/progressBarStyleHorizontal"android:layout_width="fill_parent"android:layout_margin="10dp" android:layout_height="wrap_content" />

</LinearLayout>

Applications Java sous Android IvMad, 2011-2014 62

Android: AsyncTask (Thread)• Le code Java pour l'Activité principale:

public class AsyncTacheActivity extends Activity {private ProgressBar mProgressBar;private Button mButton;public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_async_big_calcul);// On récupère les composants de notre layoutmProgressBar = (ProgressBar) findViewById(R.id.pBAsync);mButton = (Button) findViewById(R.id.btnLaunch);// On met un Listener sur le boutonmButton.setOnClickListener(new OnClickListener() {

public void onClick(View arg0) {LaTache tache = new LaTache();tache.execute(); // On lance la tache séparée

}});

}

Applications Java sous Android IvMad, 2011-2014 63

Android: AsyncTask (Thread)• Ecriture de la classe LaTache, qui hérite d’AsyncTaskprivate class LaTache extends AsyncTask<Void, Integer, Void>

• Les trois paramètres attendus sont des types génériques :• Le premier est le type des paramètres fournis à la tâche• Le second est le type de données transmises durant la progression du traitement• Le troisième est le type du résultat de la tâche

• Une AsyncTask implémente la méthode doInBackground, qui réalise letraitement de manière asynchrone dans un thread séparé.

• Trois méthodes appelées depuis l'UI thread, capables de le modifier:• onPreExecute est appelée avant le traitement;• onProgressUpdate est appelée pour afficher la progression de la tache• onPostExecute est appelée après le traitement sont optionnelles.• Un appel à la méthode publishProgress permet la mise à jour de la progression. On

ne doit pas appeler la méthode onProgressUpdate directement.

Applications Java sous Android IvMad, 2011-2014 64

Page 45: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android: AsyncTask (Thread)private class LaTache extends AsyncTask<Void, Integer, Void> {

protected void onPreExecute() {super.onPreExecute();Toast.makeText(getApplicationContext(),

"Début du traitement asynchrone", Toast.LENGTH_LONG).show(); }protected void onProgressUpdate(Integer... values){

super.onProgressUpdate(values);// Mise à jour de la ProgressBarmProgressBar.setProgress(values[0]); }

protected Void doInBackground(Void... arg0) {int p;for (p=0; p<=100; p++) {

for (int i=0; i<1000000; i++) { /* vide */ }// la méthode publishProgress met à jour l'interface en // invoquant la méthode onProgressUpdatepublishProgress(p); }

return null; }protected void onPostExecute(Void result) {

Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show();

} }

Applications Java sous Android IvMad, 2011-2014 65

Android: AsyncTask (Thread)Applications Java sous Android IvMad, 2011-2014 66

Ecran 1 au lancement de l'activité

Ecran 2 fin de l'activité Ecran 3 résultat de l'activité : tri par

sélection

Android: AsyncTask (Thread)• Appliquer un traitement lourd comme le tri par sélection d'un certain

nombre d'entiers générés aléatoirement:int[] tbl = new int[100];......................tbl[i] = (int)(Math.random()*128);.......................protected void triSelection(int[] tbl, int N) {

int min, t, i;for (i=0; i<N-1; ++i) {

min = i;for (int j=i+1; j<N; ++j) {

if (tbl[j] < tbl[min]) {min = j;

}}t = tbl[min];tbl[min] = tbl[i];tbl[i] = t;

}}

Applications Java sous Android IvMad, 2011-2014 67

Connexion TCP avec AsyncTask (1)• Une application Android se connectant sur un serveur TCP par la

méthode de traitement asynchrone de la requête réseau:public class TCPAsyncTaskActivity extends Activity {

private String stringUrl = "192.168.0.142";private TextView textView;

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);textView = new TextView(this);setContentView(textView);TCPAsyncTaskRequest();

}

Applications Java sous Android IvMad, 2011-2014 68

Page 46: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Connexion TCP avec AsyncTask (2)• La méthode vérifie la connexion et l'accessibilité du service réseau

pour faire appel alors à la méthode gérée par AsyncTask.public void TCPAsyncTaskRequest() {

ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isConnected()) {

new AccessServerTask().execute(stringUrl);} else {

textView.setText("No network connection available.");}

}

Applications Java sous Android IvMad, 2011-2014 69

Connexion TCP avec AsyncTask (3)• La méthode appelle la méthode qui exécute la tache asynchrone en

fond et libère ainsi l'interface utilisateur. La méthode onPostExecuteretourne le résultat du traitement.private class AccessServerTask extends AsyncTask<String,Void,String> {

@Overrideprotected String doInBackground(String... urls) { // params comes from the execute() call: params[0] is the url.

return runTcpClient(urls[0]);}// onPostExecute displays the results of the AsyncTask.@Overrideprotected void onPostExecute(String result) {

textView.setText(result);}

}

Applications Java sous Android IvMad, 2011-2014 70

Connexion TCP avec AsyncTask (3)• La méthode qui effectue le traitement réseau.private String runTcpClient(String myurl) {

try {Socket s = new Socket(myurl, 1234);BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));// send output msgString outMsg = "Connexion du client TCP sur le port: 1234" +

System.getProperty("line.separator"); out.write(outMsg);out.flush();// accept server responseString inMsg = in.readLine() + System.getProperty("line.separator");// close connections.close();return inMsg;

} catch (UnknownHostException e) {return "Aucune connexion!";

} catch (IOException e) {return "Aucune connexion!";

} }

Applications Java sous Android IvMad, 2011-2014 71

Android : SQLite base de données • SQLite est Open Source Database accessible dans chaque unité mobile

avec SE Android. L'utilisation d'une BD SQLite ne demande aucuneinstallation ou administration.

• SQLite supporte le type TEXT (String en Java), INTEGER (long en Java)et REAL (double en Java). Tous les autres types doivent être convertivers un reconnu chez SQLite.

• Si une application Android crée une BD elle est alors sauvegardée par défaut dans le dossier: DATA/data/APP_NAME/databases/FILENAME.

• Le package android.database contient les classes nécessaires à lamanipulation d'une BD.

• Le package android.database.sqlite contient des classes spécifiques àSQLite.

Applications Java sous Android IvMad, 2011-2014 72

Page 47: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : SQLite• Pour créer et modifier une BD dans une application Android on étend

(hérite) la sous-classe SQLiteOpenHelper.• Le constructeur de l'Activité fait appel à la méthode super():

• super(context, DATABASE_NAME, null, DATABASE_VERSION);

• Dans cette classe les méthodes onCreate() et onUpgrade() sont à réécrire.• onCreate() est appelé pour la création de la BD si elle n'existe pas.• onUpgrade() est appelé pour modifier le schéma de la BD.• Les deux méthodes prennent en paramètre la référence de la BD.

• La classe SQLiteOpenHelper fourni les méthodes getReadableDatabase() etgetWriteableDatabase() pour accéder à un objet de type SQLiteDatabaseen lecture ou en écriture.

• Une table de BD doit être identifiée par un _id qui est prisautomatiquement pour une clé primaire.

Applications Java sous Android IvMad, 2011-2014 73

Android : SQLite• SQLiteDatabase est la classe de base pour opérer avec une BD sous

Android. Elle fournie les méthodes pour ouvrir, interroger, modifierou fermer une BD. Elle fournie aussi les méthodes: insert(), update() etdelete() et la méthode execSQL(), qui exécute une requête SQLdirectement.

• L'objet ContentValues fourni le binôme key/values. La clé (key) estl'attribut d'une colonne et la valeur (values) représente son contenu.ContentValues peut être utilisé pour insérer ou modifier desenregistrements dans la BD.

• Les requêtes sont créées via les méthodes rawQuery() ou query() et avecla classe SQLiteQueryBuilder.• rawQuery() accepte directement la requête SQL en paramètre.• query() propose une interface structurée pour la requête SQL.• SQLiteQueryBuilder est la classe qui facilite la création des requêtes SQL.

Applications Java sous Android IvMad, 2011-2014 74

Android : SQLitepublic class MaBaseDeDonneesAndroid extends SQLiteOpenHelper {

// Version de la BDprivate static final int DATABASE_VERSION = 1;// Nom de la BDprivate static final String DATABASE_NAME = "contactsManager";// Nom de la table dans la BDprivate static final String TABLE_CONTACTS = "contacts";

// Noms des colonnes dans la tableprivate static final String KEY_ID = "id";private static final String KEY_NAME = "name";private static final String KEY_PH_NO = "phone_number";

public MaBaseDeDonneesAndroid(Context context) {// Ouverture et création de la BD si n'existe passuper(context, DATABASE_NAME, null, DATABASE_VERSION);

}

Applications Java sous Android IvMad, 2011-2014 75

Android : SQLite// Création de la table@Overridepublic void onCreate(SQLiteDatabase db) {

String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"+ KEY_PH_NO + " TEXT" + ")";

db.execSQL(CREATE_CONTACTS_TABLE);}

// Effacer ou modifier une table@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// Drop older table if existeddb.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

// Create tables againonCreate(db);

}

Applications Java sous Android IvMad, 2011-2014 76

Page 48: APPLICATIONS 1. Android JAVA - Le blogivmad.free.fr/cours/Cours-IvMad-Android-2014x4.pdf · • L'interface fournit des outils pour la compilation, le débogage et un simulateur de

Android : SQLite// Ajouter un 'contact' dans la tablevoid addContact(Contact contact) {

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();// Prendre le nomvalues.put(KEY_NAME, contact.getName());// Prendre le numéro de téléphonevalues.put(KEY_PH_NO, contact.getPhoneNumber());

// Insérer une ligne dans la tabledb.insert(TABLE_CONTACTS, null, values);// Fermer la BDdb.close();

}

Applications Java sous Android IvMad, 2011-2014 77

Android : SQLite// "Afficher" le contenu de la tablepublic List<Contact> getAllContacts() {

List<Contact> contactList = new ArrayList<Contact>();// Sélectionner toutes les lignes de la tableString selectQuery = "SELECT * FROM " + TABLE_CONTACTS;SQLiteDatabase db = this.getWritableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);// On boucle pour ajouter les lignes à la listeif (cursor.moveToFirst()) {

do {Contact contact = new Contact();contact.setID(Integer.parseInt(cursor.getString(0)));contact.setName( cursor.getString(1) );contact.setPhoneNumber( cursor.getString(2) );contactList.add(contact); // Ajouter un contact à la liste

} while (cursor.moveToNext());}return contactList; // Retourne une liste de contacts

}

Applications Java sous Android IvMad, 2011-2014 78

Android : NFC • NFC 'Near Field Communication) is the international standard for

contactless exchange of data. In contrast of other technologies, suchas wireless LAN and Bluetooth, the maximum distance of two devicesis 10cm. The development of the standard started in 2002 by NXPSemiconductors and Sony.

• There are various possibilities for NFC use with mobile devices; forexample, paperless tickets, access controls, cashless payments, and carkeys. With the help of NFC tags you can control your phone andchange settings. Data can be exchanged simply by holding two devicesnext to each other.

• There are a variety of NFC tags that can be read with a smartphone.The spectrum ranges from simple stickers and key rings to complexcards with integrated cryptographic hardware. Tags also differ in theirchip technology. The most important is NDEF (NFC Data ExchangeFormat), which is supported by most tags.

Applications Java sous Android IvMad, 2011-2014 79