Você está na página 1de 11

www.elektor.

fr/android

Android
Apprendre programmer des applis
Environnement de dveloppement Eclipse
Programmation oriente objet en JAVA

Auteur : Stephan Schwark


diteur : Elektor
ISBN : 978-2-86661-187-3
Format : 17 23,5 cm
Nbre de pages : 208
Prix : 33,50

SOMMAIRE
Prface . . . . . . . . . . . . . . . . . . . . . 7

1.

Android

1.1
1.2
1.3
1.4

Histoire et dveloppement . . . . . . . . 9
Android et Linux . . . . . . . . . . . . . . 11
Projets Open Source . . . . . . . . . . . . 13
Portages dAndroid. . . . . . . . . . . . . 14

2.

Eclipse

2.1
2.2

Logiciels ncessaires . . . . . . . . . . . 15
Appareils virtuels Android . . . . . . . 17

3.

Concepts de base de la
programmation Android

3.1
3.2
3.3
3.4

Composants du systme Android. . 19


Fichier manifeste dAndroid . . . . . 21
Niveaux dAPI dAndroid . . . . . . . 22
Activits Android . . . . . . . . . . . . . . 24

4.

Interface utilisateur
dAndroid

4.1
4.2
4.3

Views et ViewGroups . . . . . . . . . . 27
Fichiers de description XML . . . . . 27
Gabarits . . . . . . . . . . . . . . . . . . . . . 29
4.3.1 LinearLayout . . . . . . . . . . . . 31
4.3.2 AbsoluteLayout . . . . . . . . . . 32
4.3.3 TableLayout . . . . . . . . . . . . . 33

Android - Apprendre programmer des applis


Sommaire - Copyright 2012 - Elektor International Media

www.elektor.fr/android
4.3.4 RelativeLayout . . . . . . . . . . .34
4.3.5 FrameLayout. . . . . . . . . . . . .35
4.3.6 ScrollView . . . . . . . . . . . . . .36
5.

Android et Java

5.1
5.2
5.3
5.4

Introduction Java . . . . . . . . . . . . .39


Paquetages Android . . . . . . . . . . . .42
Types de donnes . . . . . . . . . . . . . .43
Visibilit des variables
et des mthodes . . . . . . . . . . . . . . . .44

6.

Applications Android
simples

6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8

Votre premire application . . . . . . .45


Programme de calcul simple . . . . . .49
Listes de choix . . . . . . . . . . . . . . . .58
Chronomtre . . . . . . . . . . . . . . . . . .71
Minuteur . . . . . . . . . . . . . . . . . . . . .77
Notifications . . . . . . . . . . . . . . . . . .83
Lecture et criture de fichiers . . . . .84
Envoi et rception de SMS . . . . . . .89

7.

Consultation et
reprsentation des
godonnes

7.1
7.2
7.3
7.4
7.5

7.6

Godonnes . . . . . . . . . . . . . . . . . . .97
Dessiner sur lcran. . . . . . . . . . . .105
Outil GPS . . . . . . . . . . . . . . . . . . .110
Enregistrer une route GPS. . . . . . .118
Interroger les capteurs . . . . . . . . . .126
7.5.1 Acclromtre. . . . . . . . . . .126
7.5.2 Magntomtre . . . . . . . . . . .130
7.5.3 Capteur de luminosit . . . . .134
App Widgets . . . . . . . . . . . . . . . . .135

8.

Lecture multimdia

8.1

Restitution des fichiers audio . . . .145

8.2
8.3

Gnrateur de frquences . . . . . . . 147


Enregistrer le son . . . . . . . . . . . . . 156

9.

Applications pour le Web

9.1

Afficher du contenu Web . . . . . . . 163


9.1.1 Camra . . . . . . . . . . . . . . . . 163
9.1.2 Google Maps . . . . . . . . . . . 165
9.1.3 Barre de progression. . . . . . 166
Restitution des vidos Internet . . . 168
Applications Web en JavaScript
et HTML . . . . . . . . . . . . . . . . . . . . 170
Application pour les wikis . . . . . . 171
Interroger une base de donnes
via HTTP . . . . . . . . . . . . . . . . . . . 174
Communiquer par socket . . . . . . . 182

9.2
9.3
9.4
9.5
9.6

10. Android et Linux


10.1 Droits et utilisateurs . . . . . . . . . . . 189
10.2 Lancer des commandes Linux . . . 190
Postface . . . . . . . . . . . . . . . . . . 193

11. Appendices
11.1 Application HTML . . . . . . . . . . . . 195
11.2 Rfrences. . . . . . . . . . . . . . . . . . . 202
11.2 Crdits des images . . . . . . . 202
11.2 Crdits des codes source . . 202
11.2 Ressources Web . . . . . . . . . 202
Index . . . . . . . . . . . . . . . . . . . . . . . 203

Android - Apprendre programmer des applis


Sommaire - Copyright 2012 - Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

4.

Interface utilisateur dAndroid

4.1

Views et ViewGroups

Bien comprendre linterface utilisateur dAndroid est indispensable pour afficher


lcran du texte, de limage, ou plus gnralement des informations. Linterface utilisateur comprend plusieurs classes. Les objets de ces classes reprsentent les lments
visuels dont se sert le systme pour construire les interfaces graphiques.
La vue (View) est le composant graphique lmentaire dAndroid. Un objet View reprsente une surface rectangulaire qui peut servir de conteneur pour dautres objets. Un
objet View gre lui-mme les lments de sa propre reprsentation ainsi que les vnements qui surviennent dans sa zone dcran.
Les objets View sont placs dans larbre qui reprsente la hirarchie des vues. Il est possible dinsrer des lments supplmentaires dans une vue, soit en crivant directement
dans le code dune activit, soit en utilisant un fichier de description XML externe.
ViewGroup est une sous-classe de la classe View. Les objets de cette classe peuvent
contenir dautres objets View ainsi que des gabarits (ou layouts, des conteneurs qui per-

mettent de positionner des composants graphiques), et ainsi tendre larbre de la hirarchie des vues.
Lappel dune activit dclenche laffichage des gabarits. Lactivit invoque la
mthode setContentView() en passant une rfrence au nud suprieur de larbre.
Android dmarre depuis ce nud et parcourt larbre de haut en bas en deux passes.
Dans la premire, Android demande les dimensions des objets contenus dans larborescence. La seconde passe sert au calcul de leurs positions lcran. Les objets qui
nappartiennent pas une zone afficher ne sont pas dessins. Chaque objet enfant est
ainsi responsable de sa propre reprsentation lcran.

4.2

Fichiers de description XML

La faon la plus simple et aussi la plus frquente de crer une interface est de la dclarer
dans un fichier XML. Ce fichier XML dfinira la structure hirarchique des lments
graphiques qui composent linterface. Cr en 1996, le XML (Extended Markup Language) est un langage qui permet de reprsenter le contenu des donnes laide de

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

50

6. Applications Android simples

Figure 7 - La CalculOhmlette.

Crons dabord un nouveau projet. Reprenez la procdure suivie lors de la cration du


projet HelloWorld prcdent, mais cette fois-ci appelez le projet Calculator, et entrez
com.example.Calculator dans le champ Package Name. Le projet apparat dans
lexplorateur de paquetages une fois termine la configuration. Ltape suivante est la
construction dune interface pour cette CalculOhmlette.
Nous aurons besoin de champs de saisie pour entrer les valeurs ncessaires au calcul,
soit trois champs, respectivement pour la tension, la rsistance et lintensit. Comme
nous lavons vu dans la prcdente section 6.1, ces champs de saisie peuvent tre dfinis dans le fichier main.xml. Eclipse offre galement la possibilit de construire les
interfaces par glisser-dposer. Ouvrez le fichier main.xml depuis larborescence du projet, puis cliquez sur longlet Graphical layout de la fentre ddition si ce nest pas la
vue par dfaut.
gauche sont regroups diffrents types de composants. Linterface affiche est pour
le moment celle par dfaut. Nous retrouvons le contenu de la chane hello de lexemple
prcdent. Insrons par glisser-dposer les diffrents lments qui composeront notre
interface. Puisque notre CalculOhmlette attend des valeurs dcimales, les trois champs
de saisie dont nous avons besoin doivent tre du type Decimal, un type qui se trouve
dans la liste des lments Text Fields. Positionnez-en trois dans la vue graphique. Nous
avons galement besoin de trois boutons, et nous avons trois textes de description (lments TextView) placer au-dessus des champs de saisie.
Si vous avez russi arranger les lments dans le bon ordre, le nouveau fichier
main.xml devrait tre :

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

6.2 Programme de calcul simple


<?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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/resist"
/>
<EditText
android:id="@+id/editText1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:inputType="numberDecimal">
<requestFocus></requestFocus>
</EditText>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/voltage"
/>
<EditText
android:id="@+id/editText2"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:inputType="numberDecimal">
</EditText>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/current"
/>
<EditText
android:id="@+id/editText3"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:inputType="numberDecimal">
</EditText>
<Button
android:text="Calculer la rsistance"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<Button
android:text="Calculer la tension"
android:id="@+id/button2"
android:layout_width="wrap_content"

ISBN 978-2-86661-187-3
copyright Elektor International Media

51

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

6.6 Notifications

6.6

83

Notifications

Lapplication prcdente affiche un message dalarme et dclenche le vibreur au bout


dun temps dtermin, mais que se passe-t-il si le tlphone nest pas proximit de
lutilisateur ce moment-l ? Le vibreur risque de ne pas tre entendu. Voil pourquoi
nous devons galement afficher un message indiquant que le temps est coul.
Nous nous servirons pour cela de la classe Notification fournie par le systme
Android. Cette classe permet dafficher des messages dans la barre dtat situe en haut
de lcran ou encore dallumer la LED de notification. Compltons donc le code de
lapplication prcdente afin quelle dispose de ces deux notifications :
package alarm.example.com;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Le gestionnaire de notification
NotificationManager notMan = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
// Affichage dun message dalarme
Toast.makeText(context, "Le temps est coul.", Toast.LENGTH_LONG).show();
// Vibration du tlphone pendant 2 s
Vibrator vibrator = (Vibrator) context
.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(2000);
// Paramtrage de la notification
String text = "Fin de la dure programme";
Notification notification = new Notification(
android.R.drawable.stat_notify_sync, text, System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL;
PendingIntent contentIntent = PendingIntent.getActivity(context
.getApplicationContext(), 0, new Intent(context
.getApplicationContext(), AlarmActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

104

7. Consultation et reprsentation des godonnes

Figure 15 - Lactivit GPS


avec des donnes fictives.

Essayons de tester notre programme avec geo fix. Cette commande attend deux coordonnes de longitude et de latitude. Entrons par exemple :
geo fix 20 30

Les champs latitude et longitude de notre petite application GPS affichent bien 30.0
et 20.0. Comme il sagit de la premire modification de position dtecte, la mthode
onLocationChanged de lcouteur LocationListener est appele pour la premire
fois. Ce nest donc qu cet instant que les autres champs sont remplis. Date excepte,
nous ny trouvons cependant que des 0.0 puisquaucune donne na t transmise.
Lapplication voluerait bien sr diffremment avec un vrai tlphone puisque la position serait actualise toutes les minutes.
Nous pouvons de mme transmettre une phrase GPS conforme la norme NMEA
0183 utilise par les interfaces des rcepteurs GPS. Pour cela nous lanons la
commande geo nmea suivie de la trame transmettre. Nous ne pouvons toutefois pas
nous contenter dune trame contenant uniquement les donnes de latitude et de
longitude ; la saisie est quelque peu fastidieuse, moins de recourir au copier-coller
dune trame complte. Voici un exemple de commande geo nmea :
geo nmea $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

126

7. Consultation et reprsentation des godonnes

<wpt lat=50.81899881362767 lon=6.136915683746159>


<ele>243.0</ele>
</wpt>
<wpt lat=50.81899881362767 lon=6.1369371414182785>
<ele>243.0</ele>
</wpt>
<wpt lat=50.81900954246373 lon=6.1369371414182785>
<ele>243.0</ele>
</wpt>
</gpx>

Chaque point de passage est enregistr dans un lment XML <wpt>. Longitude et latitude correspondent aux valeurs des attributs lon et lat. Laltitude est quant elle
contenue dans la balise <ele> de llment <wpt>. Lensemble des coordonnes de
cette route GPS est insr dans la balise racine <gpx>. Un tel format de fichier pourra
tre lu par dautres programmes, ou encore partag sur une page Internet.
Nous pourrions de la mme faon enregistrer lun ou lautre des nombreux lments
dcrits par la spcification du format ouvert GPX. Notre exemple nen utilise quun
petit nombre, le minimum ncessaire la reprsentation dun trac sous forme dune
suite de points de passage. Nous aurions mme pu nous passer de laltitude.

7.5

Interroger les capteurs

Les smartphones Android sont tous quips de capteurs. Citons parmi ceux-ci : les capteurs photosensibles pour la commande de la camra, les acclromtres, les thermomtres, ou encore les magntomtres pour lenregistrement du champ magntique
terrestre. Bon nombre dapplications nexisteraient pas sans ces capteurs. La rotation
automatique de lcran, qui ncessite la connaissance de la position spatiale du tlphone, repose par exemple sur une mesure de lacclration due la pesanteur.
LAPI Android permet bien videmment dinterroger ces capteurs. Nous allons voir
qucouter leur changement dtat est trs simple, et que le modus operandi est peu ou
prou le mme pour chaque type de capteur. Les exemples suivants nen utilisent quun
seul la fois, car tous les tlphones tactiles ne sont pas forcment quips du mme
nombre de capteurs.

7.5.1

Acclromtre

Commenons par lacclromtre, prsent sur la majorit des tlphones puisque, nous
lavons dit, il est indispensable la rotation automatique de laffichage.
Lacclromtre mesure lacclration selon trois axes. Ce capteur renvoie donc les

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

150

8. Lecture multimdia

Comme toujours les textes de description des lments TextView sont rfrencs dans
le fichier de ressources strings.xml. Crons-le et remplissons les balises string des
champs de texte prcdents :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="level"></string>
<string name="form">Forme d\onde :</string>
<string name="sine">Sinusode</string>
<string name="square">Rectangulaire</string>
<string name="textlevel">Niveau de sortie</string>
<string name="textfrequency">Frquence</string>
<string name="frequency">Frquence (Hz)</string>
<string name="app_name">Gnrateur audio</string>
</resources>

La figure 16 montre linterface produite par ces deux fichiers : deux champs de saisie
pour la frquence et le niveau de sortie, deux champs pour laffichage des donnes en
cours et un champ de texte pour indiquer la forme donde slectionne. Nous nous
contenterons ici de deux formes donde, savoir une sinusode et une onde rectangulaire. Dans main.xml, les attributs android:text des champs Frquence et Niveau de
sortie ont pour valeurs -- . Ces champs contiendront donc par dfaut deux tirets
lorsquaucune valeur naura encore t saisie.

Figure 16 - Linterface du gnrateur.

ISBN 978-2-86661-187-3
copyright Elektor International Media

Extrait du livre "Android - Apprendre programmer des applis"


de Stefan Schwark

9.1 Afficher du contenu Web

165

<action android:name="android.intent.action.MAIN" />


<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Nous avons utilis la permission :


<uses-permission android:name="android.permission.INTERNET" />

Llment uses-permission possde un seul attribut, android:name. Sa valeur


commence toujours par android.permission pour les permissions systme, suivie
du nom de la permission, ici INTERNET, une permission prdfinie dAndroid. Sans ce
droit daccs, le navigateur refuserait de charger le contenu demand et le systme
mettrait un message derreur. Lutilisateur devra confirmer cette permission au
moment de linstallation de lapplication
Selon le dbit de votre connexion, limage prise par la camra apparatra plus ou moins
rapidement aprs le lancement de lactivit. La camra fournit ses prises de vue au format image, lapplication na rien dautre faire que de charger puis afficher le contenu
de ladresse de lappareil. La barre dadresse ne contient ici quune adresse IP car la
webcam appartient un rseau interne.

9.1.2

Google Maps

Un autre exemple intressant exploite laccs linternet : la visualisation de cartes.


Pour ce prochain exemple, nous allons nous servir dun WebView pour afficher sur le
tlphone une des pages de dmonstration de lAPI Google Maps. Le code source de
lactivit est ici encore trs court :
package com.example.webview;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class WebviewActivity extends Activity {
/** onCreate() est appel au dmarrage de lactivit. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ISBN 978-2-86661-187-3
copyright Elektor International Media

Você também pode gostar