1. Android Développement d'activités Java sous Android
Android Partie I
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. Ivan MADJAROV - 2014
Applications Java sous Android
IvMad, 2011-2014
3
Applications Java sous Android
IvMad, 2011-2014
4
L'architecture du système Android
Application Android
• Android est un système d'exploitation basé Linux pour les appareils
• Android est un SE créé par l'Open Handset Alliance dirigée par Google.
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:
• 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
5
Applications Java sous Android
IvMad, 2011-2014
6
L'architecture du système Android
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.
• Le GUI d'Android est un système mono-thread, événementiel avec une
bibliothèque à composants extensibles organisée autour du modèle Model-View-Controller (MVC). • Model: représente les données et le conteneur de données: base de données,
images, sons, etc.
• SQLite est une Open Source Database intégrée dans Android.
• View: c'est la partie de l'application chargée de rendre l'affichage, l'envoi de l'audio
• 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
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.
son propre nom d'utilisateur qui est généré automatiquement au cours de son déploiement. Par conséquent, l'application est isolée des autres applications en cours et ne peut pas facilement affecter leur sécurité.
Applications Java sous Android
IvMad, 2011-2014
7
Applications Java sous Android
IvMad, 2011-2014
Le développement Android
Le développement Android
• Android dispose d'un SDK basé sur le langage Java.
• La chaine de production Java Android
• 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 le plugin "nbandroid" accessible à : http://nbandroid.kenai.com. • Le développement pour Android est possible aussi sans un IDE particulier en se servant des commandes du SDK d'Android avec Ant pour la compilation et la gestion du simulateur. • A consulter : http://ydisanto.developpez.com/tutoriels/android/debuter/
8
Applications Java sous Android
IvMad, 2011-2014
9
Applications Java sous Android
IvMad, 2011-2014
10
Java2SE (Oracle) et Java Dalvik (Google)
Le système Android • Architecture d'une application Java Android
Applications Java sous Android
Architecture Android
IvMad, 2011-2014
11
Applications Java sous Android
IvMad, 2011-2014
12
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 des objectifs : 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 écouteurs d'é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 à un autre Smartphone. 5. Affichage des résultats : on retourne à l'interface graphique
Applications Java sous Android
APPLICATIONS JAVA
IvMad, 2011-2014
2
2. Android Développement sous Eclipse avec SDK Android
Android Partie II
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. Ivan MADJAROV - 2014
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
3
Applications Java sous Android
IvMad, 2011-2014
4
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.
Zone de stockage des projets Eclipse
Applications Java sous Android
IvMad, 2011-2014
5
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2014
6
Développer avec Eclipse
7
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
8
Applications Java sous Android
IvMad, 2011-2014
9
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2014
10
Développer avec Eclipse
1
2
3
Applications Java sous Android
IvMad, 2011-2014
11
Développer avec Eclipse • Installation du plug-in ADT pour Eclipse -> Help -> Installer un nouveau
Software
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
12
Applications Java sous Android
IvMad, 2011-2014
13
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2014
14
Développer avec Eclipse
• Renseigner les champs: Name et Location
1
2
3
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
15
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse
16
Applications Java sous Android
IvMad, 2011-2014
17
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2014
Installation du SDK Android
Applications Java sous Android
IvMad, 2011-2014
18
Installation du SDK Android
19
Applications Java sous Android
IvMad, 2011-2014
Développer avec Eclipse • Installation d’un téléphone virtuel Android
20
Applications Java sous Android
IvMad, 2011-2014
21
Android SDK Manager
Applications Java sous Android
IvMad, 2011-2014
22
Android Virtual Device Manager
• Installation d’un téléphone virtuel Android
Applications Java sous Android
IvMad, 2011-2014
Android Virtual Device Manager
23
Applications Java sous Android
IvMad, 2011-2014
Android Virtual Device Manager
24
Applications Java sous Android
IvMad, 2011-2014
25
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2014
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2014
26
Nouveau projet Eclipse-Android
27
Applications Java sous Android
IvMad, 2011-2014
Nouveau projet Eclipse-Android
28
Applications Java sous Android
IvMad, 2011-2014
29
Nouveau projet Eclipse-Android
Applications Java sous Android
Applications Java sous Android
IvMad, 2011-2014
30
Nouveau projet Eclipse-Android
IvMad, 2011-2014
31
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2014
Nouveau projet Eclipse-Android Code généré à la création du projet
Pour exécuter l'application on click sur le bouton "Run". L'émulateur Android est lancé (le chargement est long)
32
Applications Java sous Android
IvMad, 2011-2014
33
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2014
34
Plug-Ins Eclipse-Android
Le "premier_projet_android" avec les composants à compiler et à exécuter dans un environnement d'émulateur
La classe R accède aux ressources
Applications Java sous Android
Classe interne associée à une ressource
Nom de la ressource dans le répertoire res/layout
IvMad, 2011-2014
35
Nouveau projet Eclipse-Android Log.i: méthode de traçage de l'exécution d'une application Android
Applications Java sous Android
IvMad, 2011-2014
36
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éveloppement d'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
37
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 le
Smartphone (étape à ne pas rater!)
Applications Java sous Android
APPLICATIONS JAVA
IvMad, 2011-2014
2
3. Architecture d'une application Android
Android Partie III
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. Ivan MADJAROV - 2014
Applications Java sous Android
IvMad, 2011-2014
3
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'application qui peut avoir plusieurs couches qui alternent entre elles lors de l'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 qui hérite des classes "android.view.View" et "android.view.ViewGroups". • Service : A la différence d'une Activity un Service ne possède pas d'interface mais permet l'exécution d'un traitement en tâche de fond. Donc il n'a pas de vue, mais permet l’exécution d’un algorithme sur un temps indéfini et terminé en fonction de la tâche.
Applications Java sous Android
IvMad, 2011-2014
4
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 pas d'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 receiver peut afficher un message, lancer une activité ou un service. • Intent-Filter : un filtre d'intention sert à indiquer à une activité, service ou broadcast receiver quels Intents peuvent implicitement traiter.
Applications Java sous Android
IvMad, 2011-2014
5
Cycle de vie d’une application Android
•
• • • •
IvMad, 2011-2014
7
• Le contexte relève l'état courant d'une application et les informations
sur son environnement et sert à récupérer des objets transmis par d'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;
contexte défini par la méthode setBaseContext() • this : peut être utilisé quant on hérite directement de la classe Context.
6
• onCreate : La méthode est appelée à la création d'une activité pour
Contexte d'une application Android
• getBaseContext() : récupère le
IvMad, 2011-2014
Architecture d'une application Android
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 focus protected 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(); } }
Applications Java sous Android
Applications Java sous Android
initialiser les données nécessaires à l'exécution de l'application. A l'appel de la méthode un Bundle est passé en argument. Il contient l’état de sauvegarde enregistré lors de la dernière exécution. onStart : La méthode est appelée dans le cas où l'application est en arrière-plan et qu’elle repasse en avant-plan. Si l'activité ne peut pas passer en avant plan alors, l’activité sera transférée à OnStop. onResume : La méthode est appelée après OnStart quand l'application passe en background à cause d’une autre application. onPause : La méthode met en pause l'application et se relance avec la mé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
8
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 une application 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 plus facile 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
9
Le principe de l'interface graphique
Applications Java sous Android
IvMad, 2011-2014
10
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 • •
• •
Applications Java sous Android
IvMad, 2011-2014
11
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 mettre le contenu utilisateur en place. Une View qui ne peut pas en englober d'autres est appelée un widget (composant).
Applications Java sous Android
IvMad, 2011-2014
12
Composants graphiques (Java)
Vues et schémas (Java)
• La class View est une zone de composant et source d'événement ce qui forme la base du GUI.
• 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 connu
en Swing de Java2SE. • Les déclarations peuvent se faire aussi en XML, ce qui évite de passer par les instanciations Java (on verra ça par la suite).
Applications Java sous Android
IvMad, 2011-2014
13
Programmer: Bonjour tout le monde import 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); } }
Fait passer une instance de l'activité
Applications Java sous Android
IvMad, 2011-2014
14
Label de texte et zone de texte (Java)
Simulateur d'unité mobile sous Android
Définir le conteneur et l'ordre de placement des composants
• La méthode setText de la classe TextView met un String dans GUI. • La méthode setContentView affiche la chaine de caractère dans l'interface graphique.
Applications Java sous Android
IvMad, 2011-2014
Avec une image (Java)
ImageView() est la boite qui peut contenir une image. Les images utiles au projet sont placées dans le dossier "res/drawable"
15
Applications Java sous Android
IvMad, 2011-2014
TextView, EditText, ImageView, Bouton
16
Applications Java sous Android
IvMad, 2011-2014
17
Récupérer la saisie d'un texte (Java)
IvMad, 2011-2014
IvMad, 2011-2014
18
Android - un bouton package 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()); } }
public void onClick(View view) { // au click changer le texte sur la bouton btn.setText("Bouton cliqué"); // récupérer le texte tapé dans le champ String monTxt = edit.getText().toString(); // définir un affichage de texte TextView txt = new TextView(this); // mettre le texte du champ txt.setText(monTxt); // ajouter un texte au Layout layout.addView(txt); }
Applications Java sous Android
Applications Java sous Android
19
Applications Java sous Android
IvMad, 2011-2014
Déroulement de l'exemple (1)
Déroulement de l'exemple (2)
• La déclaration de paquetage doit être identique à celle utilisée pour
• L’activité contient un bouton : Button btn;
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 leur disponibilité et compatibilité. • Les activités sont des classes publiques héritées de la classe de base
android.app.Activity. • Les widgets sont des éléments d’interface graphique qu'on peut utiliser dans une application.
20
• 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()). • L’instance de bouton créée (new Button(this)), on demande l’envoie de 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 finir on configure la vue du contenu de l’activité avec le bouton lui-même (setContentView()).
Applications Java sous Android
IvMad, 2011-2014
21
Applications Java sous Android
IvMad, 2011-2014
Déroulement de l'exemple (3)
Toast : popup surgissant
• Tous les widgets dérivent de la classe de base View.
• Afficher un contenu dans un popup surgissant
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éthode onClick() 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 exactement comme avec les JButton de Swing.
• Bundle icicle
• • • •
Applications Java sous Android
IvMad, 2011-2014
CheckBox
23
22
• 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'application String text = "Bonjour toast!";
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 spArrayAdapter = new ArrayAdapter (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
Android Toggle button public class ToggleButtonMainActivity extends Activity { @Override protected 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); } }
27
Applications Java sous Android
IvMad, 2011-2014
Android - GUI dynamique
28
Applications Java sous Android
IvMad, 2011-2014
29
Applications Java sous Android
IvMad, 2011-2014
30
Android : Ecrire dans un fichier
Android : Lire dans un fichier
WriteData(getApplicationContext(),textOut); // Appel de la méthode ............ // context: id de l'application public 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 sortie osw.flush(); // Vider le flux de sortie // affiche le résultat de l'opération Toast.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'écriture fOut.close(); // Fermer le fichier 'contact.dat' } catch (IOException e) { Toast.makeText(context,"Problème de sauvegarde",Toast.LENGTH_SHORT).show(); } } }
String 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ée isr.read(inputBuffer); // Lire le contenu du tampon data = new String(inputBuffer); // Convertir les données en chaine de car. // affiche le contenu du fichier dans un popup surgissant Toast.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
APPLICATIONS JAVA
IvMad, 2011-2014
2
4. Application réseaux, Bluetooth, Wi-Fi Android
Android Partie IV
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. Ivan MADJAROV - 2014
Applications Java sous Android
IvMad, 2011-2014
3
Android : LogCat view • Le développement pose toujours le problème de tester l'application
avant sa mise en "service". La View de l'application est en mode graphique. Les logs permettent l'affichage en mode texte dans la fenêtre du LogCat. • Pour afficher les opérateurs 'log' dans Eclipse il faut activer le LogCat view: • Window->Show View->Other...->LogCat.
• Pour écrire un opérateur 'Log' il faut importer la classe android.util.Log
qui 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
4
Android : Bluetooth (1) • Bluetooth est un protocole d'interconnexion à de courtes distances, de
type "peer-to-peer" avec une bande passante faible. La communication est cryptée entre les périphériques appariés. L'API Bluetooth permet de scanner et de lier les appareils entre eux et de transférer des données. • Les connexions Bluetooth sont gérées par les classes suivantes : • BluetoothAdapter : est l'unité locale où l'application Bluetooth est lancée. • BluetoothDevice : est le périphérique distant avec lequel on cherche à
communiquer. • BluetoothSocket : fait une demande de connexion au périphérique distant par l'appel de la méthode createRfcommSocketToServiceRecord. • BluetoothServerSocket : installe un Socket Bluetooth serveur pour écouter les demandes de connexion entrantes en utilisant la méthode listenUsingRfcommWithServiceRecord.
Applications Java sous Android
IvMad, 2011-2014
5
Android : Bluetooth (2)
Applications Java sous Android
IvMad, 2011-2014
6
Android : Bluetooth (3)
• Pour s'assurer que le périphérique possède le Bluetooth on procéder à
• Le Bluetooth peut être disponible sur l'appareil mais non activé. On peut
une vérification rapide en instanciant la classe BluetoothAdapter. Le retour de son objet va indiquer la présence ou non de cette option.
demander l'autorisation à l'utilisateur d'activer cette option. Pour cela, on appelle la méthode startActivityForResult avec un paramètre d'Intent BluetoothAdapter.ACTION_REQUEST_ENABLE. On vérifie que le Bluetooth n'est pas activé et on demande son activation :
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) Toast.makeText(BluetoothActivity.this, "Pas de Bluetooth!", Toast.LENGTH_SHORT).show(); else Toast.makeText(BluetoothActivity.this,"Le Bluetooth est disponible", Toast.LENGTH_SHORT).show();
private final static int BLUETOOTH_ACTIVATION = 1; BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ........................................ if (!bluetoothAdapter.isEnabled() { startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), BLUETOOTH_ACTIVATION); }
• 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 :
• Un dialog-box incitera l'utilisateur d'accepter ou non l'activation du
Bluetooth sur son appareil. Le résultat de sa décision est récupérable par la méthode onActivityResult.
Applications Java sous Android
IvMad, 2011-2014
7
Android : Bluetooth (4) • On surcharge la méthode onActivityResult pour savoir si le Bluetooth est
activé ou non. La méthode est appelée à la sortie de la boite de dialogue @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == BLUETOOTH_ACTIVATION) { if (resultCode == RESULT_OK) { Toast.makeText(BluetoothActivity.this, "Bluetooth est activé", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(BluetoothActivity.this, "Bluetooth non activé", Toast.LENGTH_SHORT).show(); } } }
Applications Java sous Android
IvMad, 2011-2014
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 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).
8
Applications Java sous Android
IvMad, 2011-2014
9
Android : Bluetooth (6)
IvMad, 2011-2014
10
Android : Bluetooth (7)
• Le code complet (étudiez les instructions 'Set' et 'for') :
• La recherche d'appareils inconnus est un traitement asynchrone et
public class BluetoothDeviceListActivity extends Activity { private final static int BLUETOOTH_SCAN = 1; String s = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE),BLUETOOTH_SCAN); Set 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
Applications Java sous Android
IvMad, 2011-2014
11
Android : BT (8) Mettre tout ensemble
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
12
Android : Wi-Fi (1) • Sous Android le Wi-Fi est géré par un WifiManager. Le WifiManager
Ajouter les permissions dans le fichier manifest.xml
représente un Android Wi-Fi Connectivity Service. Il est capable de configurer une connexion Wi-Fi, de gérer une connexion en cours, de scanner pour des points d'accès et d'enregistrer tout changement dans une connexion Wi-Fi. • Le Wi-FiManager utilise la méthode getSystemService en précisant le type de service en constante: Context.WIFI_SERVICE String service = Context.WIFI_SERVICE; WifiManager wifi = (WifiManager)getSystemService(service);
• Pour autoriser l'utilisation du Wi-FiManager les paramètres des
permissions pour accès et modification doivent être réglés dans le fichier manifest du projet.
Applications Java sous Android
IvMad, 2011-2014
13
Applications Java sous Android
IvMad, 2011-2014
14
Android : Wi-Fi (2)
Android : Wi-Fi (3)
• Avec le Wi-FiManager on peut notamment activer ou désactiver la
• Si on met tout ensemble on peut vérifier l'état de notre appareil :
fonction Wi-Fi dans l'appareil par la méthode setWifiEnabled, obtenir le statut actuel du Wi-Fi par la méthode getWifiState ou vérifier si le Wi-Fi est activé avec la méthode isWifiEnabled. if (!wifi.isWifiEnabled()) if (wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING) wifi.setWifiEnabled(true);
• La méthode getWifiState() retourne un entier entre 0 et 4 pour indiquer
la situation en cours du WiFi de l'appareil : 0 1 2 3 4
• Pour obtenir des informations détaillées sur une connexion il faut se
• Afficher les éléments d'une connexion Wi-Fi en ajoutant les composants dans un StringBuilder par la méthode append()
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é.
16
Applications Java sous Android
IvMad, 2011-2014
17
Android : Wi-Fi (6) •
•
• • •
Applications Java sous Android
IvMad, 2011-2014
18
Android : Wi-Fi (7)
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é en paramètre. Cela assure un traitement asynchrone et la prise du résultat quand le scan a terminé. On appelle la méthode getScanResults pour obtenir les résultats sous la forme d'une liste d'objets ScanResult. Chaque objet du type ScanResult comporte les détails de la connexion repérée. Le résultat du Scan est récupéré dans un objet de type List. C'est une collection d'éléments indexés à partir de zéro.
• Retourne le nombre de hotspot détectés et le SSID avec le plus fort signale à proximité
List results = wifi.getScanResults();
Applications Java sous Android
IvMad, 2011-2014
19
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 NetworkOnMainThreadException est provoqué si l'accès réseau est effectué de l'interface utilisateur (le thread principal de l'application). • A partir de l'Android 3.0 on peut désactiver cette option pour faire des tests plus facilement sur l'accès réseau en plaçant dans la méthode onCreate() le code: StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
• Le fichier AndroidManifest.xml contient la description des ressources et
Applications Java sous Android
IvMad, 2011-2014
les autorisations d'accès au réseau Internet
L'autorisation d'accéder au réseau et configurée dans le Manifest de l'application
23
Android : client-side TCP socket Le serveur TCP reçoit le message du client Android Le client TCP basé Android envoie un message au Serveur basé TCP
Applications Java sous Android
IvMad, 2011-2014
24
Android : client HTTP • Avant de procéder à une connexion réseau, il faut s'assurer que cette connexion est disponible. Un téléphone portable, un Smartphone ou une tablette peut être hors réseau ou connexion Wifi désactivée. • Cette disponibilité est testée avec les méthodes getActiveNetworkInfo() et isConnected(). • La classe ConnectivityManager détecte les connexions Wifi, GPRS, UMTS, etc. public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); // Si le réseau est indisponible networkInfo = null et la // méthode retourne false, sinon true. if (networkInfo != null && networkInfo.isConnected()) { return true; } return false; }
Applications Java sous Android
IvMad, 2011-2014
25
Applications Java sous Android
IvMad, 2011-2014
26
Android : HTTP connection
Android : HTTP connection
• HttpURLConnection avec URL sont des classes disponibles depuis Java
• Lecture du Stream d'entrée dont la connexion est effectuée par
2.0 standard. • C'est un client léger d'usage général basé HTTP et approprié pour la plupart des applications Android.
private void readStream(InputStream in) {
HttpURLConnection et URL. BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(in));
try {
String line = "", str = ""; while ((line = reader.readLine()) != null) {
URL url = new URL("http://ivmad.free.fr/ic4");
str += line;
HttpURLConnection con = (HttpURLConnection) url.openConnection(); }
// méthode qui lit un contenu sur le Stream d'entrée
4. Interface graphique dans une application Android avec XML
Android Partie V
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. Ivan MADJAROV - 2014
Applications Java sous Android
IvMad, 2011-2014
3
Applications Java sous Android
IvMad, 2011-2014
Android : connexion à MySQL
Android: connexion à MySQL
• Une application Java peut se connecter à une BD MySQL avec un
public void listDB() { // Renseigner les champs nécessaires à la connexion String url = "jdbc:mysql://dbs-perso.luminy.univmed.fr:3306/nom_BD"; String user = "nom_utilisateur"; String pass = "mot_de_passe"; try { // Instancier le driver JDBC Class.forName("com.mysql.jdbc.Driver").newInstance(); // Effectuer la connexion avec le serveur de la BD Connection con = DriverManager.getConnection(url, user, pass); // Confirmer la connexion Toast.makeText(getApplicationContext(),"Connexion OK!",Toast.LENGTH_SHORT).show(); // Préparer la requete SQL String result = ""; Toast affiche un contenu Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from contact"); dans un cadre temporaire en // Recuperer le résultat de la requete fonction de trois paramètres: ResultSetMetaData rsmd = rs.getMetaData(); context, text, duration // Extraire les éléments propres à chaque champs while(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ésultat Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show(); } catch(Exception e) { e.printStackTrace(); } }
• •
•
•
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 PHP ou 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 BD basée MySQL en se servant d'un connecteur JDBC ancienne génération beaucoup plus adapté aux connexions lentes d'un Smartphone 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
4
Applications Java sous Android
IvMad, 2011-2014
5
Applications Java sous Android
IvMad, 2011-2014
6
Android: connexion à MySQL
Android: connexion à MySQL
• Dans l'IDE Eclipse le connecteur JDBC doit être rajouté au projet qui
// 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 BD Connection con = DriverManager.getConnection(url, user, pass); // Construire la requête d'insertion de données requises à partir // d'une interface utilisateur sur l'unité mobile String sSQL = ""; sSQL += "INSERT INTO Contact(prenom,nom,tel)"; sSQL += " VALUES ('"+lastNameText.getText().toString()+ "','"+firstNameText.getText().toString()+ "','"+telNumberText.getText().toString()+"');"; // Créer l'opérateur Statement st = con.createStatement(); // Lancement de la requête int nb = st.executeUpdate(sSQL); // Fermeture des connexions st.close(); con.close(); } catch(Exception e) { e.printStackTrace(); } }
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
7
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 la langue (français, anglais, bulgare), du contexte d'utilisation (jour ou nuit) ou la modification de l’ergonomie (boutons, listes, cases à cocher). Android inclut un système proche des CSS de W3C bien connu pour le développement Web. Il s'agit des styles et des thèmes qui permettent le respect d'une cohérence à travers une application. Ainsi, l'interface graphique est construite dans des fichiers XML présents dans le dossier res/layout d'un projet Android (Eclipse).
Applications Java sous Android
IvMad, 2011-2014
8
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édure de transformation XSLT pour la visualisation du document XML par un navigateur Web. • Les balises sont ouvrantes, ou fermantes,
, ou balises à paramètre • Les balises peuvent être imbriquées : on peut insérer un ou plusieurs couples de balises élément racine élément enfant Die Hard 4Len Wiseman2012
balise à contenu balise avec attributs
Applications Java sous Android
IvMad, 2011-2014
9
Les Transformations XML
Applications Java sous Android
IvMad, 2011-2014
10
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 la taille 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 '' dans le répertoire
'res/values' du projet. Pour chaque style ou thème il faut ajouter un élément '
Applications Java sous Android
IvMad, 2011-2014
55
Applications Java sous Android
IvMad, 2011-2014
56
Tableau dans une application Android
Géolocalisation avec Java Android
• Ajouter une bordure au tableau grâce à un objet drawable en forme de
• En général une unité mobile Android propose des moyens de
rectangle défini en arrière plan. Pour cela on créer l'objet drawable dans le répertoire /res/drawable/tableborder.xml.
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
57
Applications Java sous Android
IvMad, 2011-2014
58
Géolocalisation avec Java Android
Géolocalisation avec Java Android
• Le fichier AndroidManifest.xml doit être enrichi avec les permissions
• Pour s’abonner à la mise à jour des coordonnées GPS, il faut utiliser la
requises pour accéder aux services de localisation, Internet et au GPS:
• Le provider utiliser pour recevoir les mises à jour des coordonnées utilisateurs
(GPS / NETWORK …)
• L'intervalle minimum entre deux notifications (en millisecondes)
android:name="android.permission.INTERNET" />
• L'intervalle minimum entre deux notifications (en mètre) • L’instance du LocationListener
• Il est conseillé de s’abonner aux mises à jour des coordonnées GPS
dans la méthode onResume et de se désabonner dans la méthode onStop afin de stopper l’utilisateur des ressources de localisation alors que l’application n’en a plus l’utilité, sinon le processus de mise à jour continu est la consommation de la batterie est importante.
Applications Java sous Android
IvMad, 2011-2014
Géolocalisation avec Java Android import 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 GPS locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); locationListener = new MyLocationListener(); // Géolocalisation par GPS locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
59
Applications Java sous Android
IvMad, 2011-2014
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) { } } }
60
Applications Java sous Android
IvMad, 2011-2014
61
Applications Java sous Android
IvMad, 2011-2014
Android: AsyncTask (Thread)
Android: AsyncTask (Thread)
• Un thread est un fil d'exécution ou tâche utilisé avec l'interface
• Le code XML à mettre dans res/layout/main.xml :
graphique d'un programme Java ou par des programmes de calcul intensif. • Une application Android consommatrices de ressources (requêtes http, calculs lourds, …) doit faire appel à un thread séparé pour "déconnecter" le GUI du calcul. Ainsi, les deux taches fonctionnent de manière asynchrone (AsyncTask) sans provoquer l'arrêt de l'Activité principale si 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).
android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Lancer la tâche" />
Applications Java sous Android
IvMad, 2011-2014
63
Applications Java sous Android
IvMad, 2011-2014
Android: AsyncTask (Thread)
Android: AsyncTask (Thread)
• Le code Java pour l'Activité principale:
• Ecriture de la classe LaTache, qui hérite d’AsyncTask
public class AsyncTacheActivity extends Activity { private ProgressBar mProgressBar; private Button mButton; public void onCreate(Bundle savedInstanceState) {
• 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
mProgressBar = (ProgressBar) findViewById(R.id.pBAsync); mButton = (Button) findViewById(R.id.btnLaunch); // On met un Listener sur le bouton mButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) {
} }); }
private class LaTache extends AsyncTask
super.onCreate(savedInstanceState); // On récupère les composants de notre layout
64
• Une AsyncTask implémente la méthode doInBackground, qui réalise le
traitement 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;
LaTache tache = new LaTache();
• onProgressUpdate est appelée pour afficher la progression de la tache
tache.execute(); // On lance la tache séparée
• 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
65
Android: AsyncTask (Thread)
Applications Java sous Android
IvMad, 2011-2014
66
Android: AsyncTask (Thread)
private class LaTache extends AsyncTask { 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 ProgressBar mProgressBar.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 onProgressUpdate publishProgress(p); return null;
}
Ecran 1 au lancement de l'activité
}
protected void onPostExecute(Void result) {
Ecran 2 fin de l'activité
Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show(); }
Ecran 3 résultat de l'activité : tri par sélection
}
Applications Java sous Android
IvMad, 2011-2014
67
Applications Java sous Android
IvMad, 2011-2014
68
Android: AsyncTask (Thread)
Connexion TCP avec AsyncTask (1)
• Appliquer un traitement lourd comme le tri par sélection d'un certain
• Une application Android se connectant sur un serveur TCP par la
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
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; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); textView = new TextView(this); setContentView(textView); TCPAsyncTaskRequest(); }
Applications Java sous Android
IvMad, 2011-2014
69
Applications Java sous Android
IvMad, 2011-2014
70
Connexion TCP avec AsyncTask (2)
Connexion TCP avec AsyncTask (3)
• La méthode vérifie la connexion et l'accessibilité du service réseau
• La méthode appelle la méthode qui exécute la tache asynchrone en
pour faire appel alors à la méthode gérée par AsyncTask.
fond et libère ainsi l'interface utilisateur. La méthode onPostExecute retourne le résultat du traitement.
private class AccessServerTask extends AsyncTask { @Override protected 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. @Override protected void onPostExecute(String result) { textView.setText(result); } }
71
Applications Java sous Android
IvMad, 2011-2014
72
Connexion TCP avec AsyncTask (3)
Android : SQLite base de données
• La méthode qui effectue le traitement réseau.
• SQLite est Open Source Database accessible dans chaque unité mobile
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 msg String outMsg = "Connexion du client TCP sur le port: 1234" + System.getProperty("line.separator"); out.write(outMsg); out.flush(); // accept server response String inMsg = in.readLine() + System.getProperty("line.separator"); // close connection s.close(); return inMsg; } catch (UnknownHostException e) { return "Aucune connexion!"; } catch (IOException e) { return "Aucune connexion!"; } }
•
•
• •
avec SE Android. L'utilisation d'une BD SQLite ne demande aucune installation 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 converti vers 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 à la manipulation d'une BD. Le package android.database.sqlite contient des classes spécifiques à SQLite.
Applications Java sous Android
IvMad, 2011-2014
73
Applications Java sous Android
IvMad, 2011-2014
74
Android : SQLite
Android : SQLite
• Pour créer et modifier une BD dans une application Android on étend
• SQLiteDatabase est la classe de base pour opérer avec une BD sous
(hérite) la sous-classe SQLiteOpenHelper. • Le constructeur de l'Activité fait appel à la méthode super():
Android. Elle fournie les méthodes pour ouvrir, interroger, modifier ou fermer une BD. Elle fournie aussi les méthodes: insert(), update() et delete() et la méthode execSQL(), qui exécute une requête SQL directement. • L'objet ContentValues fourni le binôme key/values. La clé (key) est l'attribut d'une colonne et la valeur (values) représente son contenu. ContentValues peut être utilisé pour insérer ou modifier des enregistrements dans la BD. • Les requêtes sont créées via les méthodes rawQuery() ou query() et avec la classe SQLiteQueryBuilder.
• 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() et
getWriteableDatabase() pour accéder à un objet de type SQLiteDatabase en lecture ou en écriture. • Une table de BD doit être identifiée par un _id qui est pris automatiquement pour une clé primaire.
• 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
Android : SQLite public class MaBaseDeDonneesAndroid extends SQLiteOpenHelper {
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
79
Android : NFC • NFC 'Near Field Communication) is the international standard for
contactless exchange of data. In contrast of other technologies, such as wireless LAN and Bluetooth, the maximum distance of two devices is 10cm. The development of the standard started in 2002 by NXP Semiconductors and Sony. • There are various possibilities for NFC use with mobile devices; for example, paperless tickets, access controls, cashless payments, and car keys. With the help of NFC tags you can control your phone and change settings. Data can be exchanged simply by holding two devices next 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 complex cards with integrated cryptographic hardware. Tags also differ in their chip technology. The most important is NDEF (NFC Data Exchange Format), which is supported by most tags.