APPLICATIONS JAVA Android Ivan MADJAROV - 2013
Applications Java sous Android
IvMad, 2011-2013
2
4. Android Développement d'activités Java sous Android 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.
Applications Java sous Android
IvMad, 2011-2013
3
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-2013
4
Fonctionnement du système 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 et 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-2013
5
Fonctionnement du système 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 en utilisant la bibliothèque OpenGL. • 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 sous Android s'exécute dans son propre processus et
sous 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 la sécurité des autres applications.
Applications Java sous Android
IvMad, 2011-2013
6
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èle Model-View-Controller. • 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-2013
7
Structure d'une application Android • Android étant un système d'exploitation pour téléphone portable de
• • • •
•
nouvelle génération dispose d'un kit de développement (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). 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/
Applications Java sous Android
IvMad, 2011-2013
Le développement Android • La chaine de production Java Android
8
Applications Java sous Android
IvMad, 2011-2013
9
Le système Android • Architecture d'une application Java Android
Applications Java sous Android
IvMad, 2011-2013
Java2SE (Oracle) et Java Dalvik (Google)
10
Applications Java sous Android
IvMad, 2011-2013
11
Développer avec Eclipse • Les outils nécessaires sont : • Android SDK: http://dl.google.com/android/android-sdk_r21-windows.zip • Eclipse: http://www.eclipse.org/downloads/eclipse-SDK-4.2.1-win32.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-2013
12
Développer avec Eclipse Zone de stockage des projets Eclipse
Applications Java sous Android
IvMad, 2011-2013
13
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
14
Applications Java sous Android
IvMad, 2011-2013
15
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
16
Applications Java sous Android
IvMad, 2011-2013
17
Développer avec Eclipse
1
2
3
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
18
Applications Java sous Android
IvMad, 2011-2013
19
Développer avec Eclipse • Installation du plug-in ADT pour Eclipse -> Help -> Installer un nouveau
Software
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
20
Applications Java sous Android
IvMad, 2011-2013
21
Développer avec Eclipse • Renseigner les champs: Name et Location
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
1
2
3
22
Applications Java sous Android
IvMad, 2011-2013
23
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse
24
Applications Java sous Android
IvMad, 2011-2013
25
Développer avec Eclipse
Applications Java sous Android
IvMad, 2011-2013
Installation du SDK Android
26
Applications Java sous Android
IvMad, 2011-2013
27
Installation du SDK Android
Applications Java sous Android
IvMad, 2011-2013
Développer avec Eclipse • Installation d’un téléphone virtuel Android
28
Applications Java sous Android
IvMad, 2011-2013
29
Android SDK Manager • Installation d’un téléphone virtuel Android
Applications Java sous Android
IvMad, 2011-2013
Android Virtual Device Manager
30
Applications Java sous Android
IvMad, 2011-2013
31
Android Virtual Device Manager
Applications Java sous Android
IvMad, 2011-2013
Android Virtual Device Manager
32
Applications Java sous Android
IvMad, 2011-2013
33
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2013
Nouveau projet Eclipse-Android
34
Applications Java sous Android
IvMad, 2011-2013
35
Nouveau projet Eclipse-Android
Applications Java sous Android
IvMad, 2011-2013
Nouveau projet Eclipse-Android
36
Applications Java sous Android
IvMad, 2011-2013
37
Nouveau projet 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
IvMad, 2011-2013
Nouveau projet Eclipse-Android Exécution de l'application Android
Nom de la ressource dans le répertoire res/layout
38
Applications Java sous Android
IvMad, 2011-2013
39
Nouveau projet Eclipse-Android Lancement du système Android
Applications Java sous Android
L'application Android
IvMad, 2011-2013
40
Applications Java sous Android
IvMad, 2011-2013
41
Structure d'une application Android • Activity : La couche représentative et visuelle de l'application qui peut • • •
• •
avoir plusieurs couches qui alternent entre elles lors de l'exécution. Views : Le IHM (GUI) est une "widgets" couche qui hérite des classes "android.view.View" et "android.view.ViewGroups". Service : 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. Content Provider : fournit des données aux applications, via un fournisseur de contenu capable de les partager avec d'autres applications (agenda, photos, contacts stockés dans le téléphone). Intents : Une application peut appeler un service ou une activité (explicite) ou appeler un service du système Android (implicites). Broadcast Receiver : reçoit les messages système et les "Intents" implicites.
Applications Java sous Android
IvMad, 2011-2013
Cycle de vie 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(); } }
42
Applications Java sous Android
IvMad, 2011-2013
43
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. 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-2013
44
Programmer sous Android • Interface graphique par programmation • Pour faciliter le développement Android propose un grand nombre de
"widgets" qui sont 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 • 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.
Applications Java sous Android
IvMad, 2011-2013
45
Android - Java : 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); } }
Simulateur d'unité mobile sous Android
Une première application "Bonjour tout le monde"
Applications Java sous Android
IvMad, 2011-2013
46
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 particuliers sont prédéfinis 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.
Applications Java sous Android
IvMad, 2011-2013
47
Label de texte et zone de texte (Java)
Définir le conteneur et l'ordre de placement des composants
Applications Java sous Android
IvMad, 2011-2013
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"
48
Applications Java sous Android
IvMad, 2011-2013
49
TextView, EditText, ImageView, Bouton
Applications Java sous Android
IvMad, 2011-2013
Récupérer la saisie d'un texte (Java)
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); }
50
Applications Java sous Android
IvMad, 2011-2013
51
Android - GUI par Java 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 view) { updateTime(); } private void updateTime() { btn.setText(new Date().toString()); } }
Applications Java sous Android
IvMad, 2011-2013
52
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 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.
Applications Java sous Android
IvMad, 2011-2013
53
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. • 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. • 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()). • 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-2013
54
Déroulement de l'exemple (3) • Tous les widgets dérivent de la classe de base View.
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-2013
55
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élais
'court' ou 'long'. La méthode prend trois paramètres: Context context = getApplicationContext(); // référence vers l'application String text = "Bonjour toast!"; // le texte à afficher int duration = Toast.LENGTH_SHORT;
// La durée d'exposition
Toast toast = Toast.makeText(context, text, duration); toast.show();
// Appel
// Visualiser
• Appel direct du Toast pour une période 'courte' Toast.makeText(this,"message",Toast.LENGTH_SHORT).show();
• Appel direct du Toast pour une période 'longue' Toast.makeText(this,"message",Toast.LENGTH_LONG).show();
Applications Java sous Android
IvMad, 2011-2013
CheckBox CheckBox 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 button Button b = new Button(this); b.setText("Cliquez ici!"); b.setOnClickListener(this); ll.addView(b); //add checkboxes cba = 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(); } }
56
Applications Java sous Android
IvMad, 2011-2013
57
Radio bouton protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Gestionnaire de placement LinearLayout ll = new LinearLayout(this); ll.setGravity(Gravity.TOP); ll.setOrientation(LinearLayout.VERTICAL); // Bouton Button b = new Button(this); b.setText("Affichez votre langage préféré"); b.setOnClickListener(this); ll.addView(b); // Radio boutons en groupe rg = 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 layout ll.addView(rg); setContentView(ll); }
Applications Java sous Android
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(); } }
IvMad, 2011-2013
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 { String colors[] = {"Red","Blue","White","Yellow","Black"}; Spinner sp; 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); // Application of the Array to the 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(); } }
58
Applications Java sous Android
IvMad, 2011-2013
59
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:
Applications Java sous Android
IvMad, 2011-2013
Android Ecrire 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(); } } }
60
Applications Java sous Android
IvMad, 2011-2013
61
Android Lire dans un fichier 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
IvMad, 2011-2013
Android client-side TCP socket package 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); }
62
Applications Java sous Android
IvMad, 2011-2013
63
Android client-side TCP socket Button.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éseaux StrictMode.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-2013
64
Android client-side TCP socket • Le fichier AndroidManifest.xml contient la description des ressources et
les autorisations d'accès au réseau Internet
Applications Java sous Android
IvMad, 2011-2013
65
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-2013
66
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 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
Applications Java sous Android
IvMad, 2011-2013
67
Android connexion à MySQL 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(); } }
Applications Java sous Android
IvMad, 2011-2013
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.
68
Applications Java sous Android
IvMad, 2011-2013
69
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 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(); } }
Applications Java sous Android
IvMad, 2011-2013
70
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-2013
71
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 4 Len Wiseman 2012
Applications Java sous Android
IvMad, 2011-2013
Les Transformations XML
balise à contenu balise avec attributs
72
Applications Java sous Android
IvMad, 2011-2013
73
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 '