0% ont trouvé ce document utile (0 vote)
11 vues109 pages

IHM Android : Création avec XML

Ce document présente la programmation d'interfaces graphiques pour des applications Android en utilisant XML, soulignant la séparation entre l'interface utilisateur et la logique applicative. Il décrit les structures XML, les styles et thèmes, ainsi que les différents types de layouts disponibles pour organiser les éléments graphiques. Le document aborde également l'utilisation d'Android Studio pour créer et gérer ces interfaces, ainsi que les interactions avec les composants via le code Java.

Transféré par

ayouberrechaki350
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
11 vues109 pages

IHM Android : Création avec XML

Ce document présente la programmation d'interfaces graphiques pour des applications Android en utilisant XML, soulignant la séparation entre l'interface utilisateur et la logique applicative. Il décrit les structures XML, les styles et thèmes, ainsi que les différents types de layouts disponibles pour organiser les éléments graphiques. Le document aborde également l'utilisation d'Android Studio pour créer et gérer ces interfaces, ainsi que les interactions avec les composants via le code Java.

Transféré par

ayouberrechaki350
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Interface graphique avec

XML pour une


application Android
L'objectif principal de ce cours est de découvrir la programmation sous Android, sa
plate-forme et les spécificités du développement embarqué sur smartphone, tablette et
d'autres objets connectés.
Interface graphique avec XML IvMad, 2011-2019 3

IHM par XML : Introduction


• Android, vis-à-vis des autres systèmes d'exploitation mobiles peut créer des
interfaces graphiques à l'aide de fichiers XML (interface statique).
• Cette particularité favorise la séparation 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" de l'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).
• Le SDK Android inclut un système proche des CSS de W3C
• Il s'agit des styles et thèmes qui permettent le respect d'une cohérence
visuelle à travers une application.
• L'interface graphique est définie dans des fichiers XML présents dans le
dossier res/layout du projet Android Studio.
Interface graphique avec XML IvMad, 2011-2019 4

IHM par XML : Layout


• Les composants graphiques sont hiérarchisés par encapsulation dans les
nœuds XML à la création d'un projet Android Studio.
• /res/layout contient le fichier XML de l'interface graphique pour
l'activité (TextView, EditText, Button, …, etc).
• /res/values contient les fichiers XML à paramétrer.
• /res/drawable contient les fichiers graphiques de type image
• Les composants sont paramétrables par des attributs XML.
• Plusieurs méthodes Java ont un équivalent d'attribut XML.
• Dans le fichier XML on utilise l'identificateur @id suivi d'un nom
(@id/etiquette_attribut).
• Cette technique spécifie le lien entre le code Java et le fichier des
composants paramétrés.
Interface graphique avec XML IvMad, 2011-2019 5

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, <balise_ouvrante>, fermantes </balise_fermante>
ou balises à paramètre <balise paramètre1, paramètre2 />
• Les balises peuvent être imbriquées :
<cinematheque> élément racine
<film> élément enfant
<nom>Die Hard 4</nom> balise à contenu
<realisateur>Len Wiseman</realisateur>
<annee_sortie>2012</annee_sortie>
<acteur prenom="Bruce" nom="Willis" /> balise avec attributs
</film>
</cinematheque>
Interface graphique avec XML IvMad, 2011-2019 7

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.
• On peut définir un style qui spécifie une taille ou une couleur appliqué à un
certain type d'éléments View. (res/values/[Link] | [Link])
• Un thème est un ensemble d'attributs de formatage qu'on peut
appliquer à une unité pour toutes les activités d'une application.
• 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.
• Créer ses propres Styles et Thèmes :
• Créer un fichier [Link] avec un nœud '<ressource>' dans le répertoire
'res/values' du projet. Pour chaque style ou thème il faut ajouter un élément
'<style name="nom_de_style">'. Chaque élément de style est déclaré à
l'intérieur par des '<item name="android:style>valeur</item>'.
Interface graphique avec XML IvMad, 2011-2019 8

Layout XML : les plus utilisés


• Un XM L layout est l’agencement des différents éléments graphiques
dans l'interface graphique en fonction des différentes tailles et
résolutions d’écran. C'est un conteneur permettant d'organiser le
placement des différents widgets dans l'interface utilisateur (UI). Ainsi :
• FrameLayout: Les widgetscontenus dans le FrameLayoutsont affichés en
haut à gauche de l'écran.
• LinearLayout : Tous les widgets sont affichés les uns après les autres, soit
verticalement, soit horizontalement.
• RelativeLayout : Permet d'organiser les différents widgets en fonctions de la
position des autres widgets. (par défaut à la création d'un projet ContraintLayout)
• TableLayout : Permet d'organiser les widgetsen lignes et en colonnes en
imitant une présentation en forme de tableau.
• ContraintLayout : permet l'agencement dynamique d'éléments de l'interface
graphique pour présentations complexes.
Interface graphique avec XML IvMad, 2011-2019 9

Application Android
• L'application Android est décrite dans le fichier [Link].
• Le fichier contient la description de tous les Activities, Services, BroadcastReceivers, ContentProvider de l'application.
• Le fichier contient aussi les éléments de sécurité pour l'application:
• l'autorisation pour un accès réseau par exemple.
Interface graphique avec XML IvMad, 2011-2019 10

• Autorisation pour accéder au réseau Internet dans [Link].

[Link]

Autorisations
pour accéder
au réseau
Interface graphique avec XML IvMad, 2011-2019 11

Android Studio : Le projet

Eléments principaux du projet:


• le fichier java
• le fichier modèle xml
Accès aux ressources Android
Interface graphique avec XML IvMad, 2011-2019 12

• La forme générale de référencement d’une ressource dans un fichier


xml. est : "@type/identificateur",
• Exemple : @string/letexte fait référence à un String dans un fichier
XML dans le répertoire res/values :
<resources>

<string name="letexte">Texte à afficher</string>

</resources>
• La forme générale de référencement d’une ressource dans le code Java est :
[Link].
• La classe Ressource (R) permet l’accès aux ressources.
Par exemple : [Link] fait référence à la chaine ci-dessus.
• Dans l'activité on affiche les ressources de l’interface principale :
setContentView([Link].nom_du_fichier_xml);
Interface graphique avec XML IvMad, 2011-2019 13

TextView : XML
• On crée un nouveau projet XMLString.
[Link]

TextView : XML
res/values/[Link]

activity_xml_string_main.xml
Interface graphique avec XML IvMad, 2011-2019 14

TextView, EditText : XML


res/values/[Link]

TextView, EditText : XML

Xml_String_Main_Activity.xml

Dans le RelativeLayout il faut préciser


l'agencement des éléments graphiques:
EditText succède à TextView par
layout_below=@+id/prenom
Ouzayr
15

TextView, EditText , Button : XML

Ouzayr

res/values/[Link]
Application Android et XML

• Ajouter un bouton avec son écouteur à l'interface graphique :


Button bouton = (Button) findViewById([Link]);
[Link](new [Link]() {
@Override
public void onClick(View v) {
// action après le click
}
});
• L'affichage du bouton est référencé par la méthode findViewById.
• L'écouteur est installé par le référencement anonyme de la classe
[Link].
• Au click, la méthode onClick() prend le relais par l'intermédiaire de la
méthode setOnClickListener qui instancie en paramètre anonyme la
classe de l'écouteur des événements. (Cela évite l'utilisation des interfaces)
17

TextView, EditText, Button : par XML

Ouzayr

La méthode findViewById() reprend la


description de l'élément graphique dans le fichier
activity_xml_string_main.xml
18

Application Android et XML

Avec le gestionnaire
"RelativeLayout" la pile se
forme par positionnement relatif
à l'élément précédent
android:layout_below
="@+id/identifiant"

android:hint="écrire ici"
Attribut appliqué pour EditText
défini un texte censé disparaître
au moment de la saisie
ContraintLayout
• Android Studio 3.0 et les versions plus récentes proposent un éditeur
graphique visuel.
• Les composants graphiques sont positionnés par simple glisser-déposer.
• La description XML se remplie ainsi de manière automatique.
• ContraintLayout est un style de présentation d'interface graphique
complexe et adaptative vis-à-vis différentes plateformes mobiles
basées Android.
• ConstraintLayout est une évolution du RelativeLayout et la façon dont les
éléments sont liés entre eux à la manière du LinearLayout.
• En plus d’hériter des contraintes de placement nouvelles possibilités sont
introduites pour lier des Widgets, Text, … entre eux, d’appliquer un "poids"
ou encore d’attribuer un identifiant unique à plusieurs éléments pour
effectuer des actions groupées.
• Un tutoriel : [Link]
TextView,EditText,Button : Editeur
20

Un éditeur graphique
WYSIWYG est
disponible à l'onglet
"Design" de
l'environnement
Android Studio pour
le projet en cours
Les éléments peuvent
être glissés de la
colonnes de gauche à
l'écran de l'émulateur
mobile.
Interface graphique avec XML IvMad, 2011-2019 21

Application Android et XML

L'onglet "design" offre


une palette de widgets
à intégrer par "drag and
drop" dans l'espace du
simulateur
Interface graphique avec XML IvMad, 2011-2019 22

Application Android et XML

Les attributs XML de l'interface graphique.


• android:id identifie l'élément et le rend accessible dans code Java;
• android:layout_width, android:layout_height défini les dimensions de l’élément;
• fill_parent l’élément prend toute la place disponible;
• wrap_content l’élément prend la place qu’il a besoins;
• android:layout_gravity précise la position de l’élément;
(center_horizontal, center_vertical, etc…)
• android:text configure le texte à afficher; ([Link])
• android:textSize configure la taille du texte affiché; ([Link])
• android:textColor configure la couleur du texte; ([Link])
• android:hint texte à afficher lorsque EditText est vide; ([Link])
• android:layout_weight rapport de taille entre éléments;
Application Android et XML

• Dans la méthode OnCreate, on définit la vue à l’aide de la méthode


setContentView et on lui affecte [Link].activity_main qui représente la
vue, déclarée dans le dossier Layout.
• R désigne la ressource utilisée dans le dossier res.
• Toutes les ressources qui se trouvent dans le dossier res sont
précompilées et des liens sont générés dans le dossier [Link]. (C'est
automatique à la création du projet)
• Les ressources du dossier res peuvent être modifiées car ce sont des
descriptions en format XML, .c.à.d. des fichiers textes à balisages
Interface graphique avec XML IvMad, 2011-2019 24

Application Android et XML


• L'application Android affiche à son exécution un texte de bien venu.
L'interface graphique peut être gérer par des fichiers XML. Ainsi, la
taille des caractères et la couleur du texte peut être préciser.
• Pour créer les fichiers XML nécessaires il faut procéder par: Faire un
clic droit sur le dossier values -> New -> File ([Link]) -> Finish.
Utiliser "[Link]" s'il existe!
• Créer ensuite un nouvel attribut de type Dimension avec le couple
Name: "dimMessage", Value: "30px". Pour enregistrer CTRL/S.
• Créer de la même façon un fichier [Link], en ajoutant un attribut de
type Color avec Name: couleurMessage, et Value: "#ffa800". Pour
enregistrer CTRL/S.
Interface graphique avec XML IvMad, 2011-2019 25

Application Android et XML


• X_Layout :
• android:orientation : Orientation verticale.
• android:screenOrientation="landscape" : Mode paysage
• android:layout_width et android:layout_height : Hauteur et largeur du Layout
• ImageView : élément qui sert à afficher une image
• android:layout_height : Définir la hauteur de l’élément.
• android:id : Identifiant de l’élément
• android:layout_width : Largeur de l’élément.
• android:src : Image source utilisée pour ImageView.
• android:layout_marginTop : Marge externe du haut.
• Les différentes tailles utilisées sont déclarées dans le fichier [Link] (dossier
values) et utilisées en suivant la syntaxe @dimen/nom_de_la_variable
• android:contentDescription : utiliser pour la description du contenu de l’image
Interface graphique avec XML IvMad, 2011-2019 26

Application Android et XML

• Button
• android:layout_gravity : Position de l’élément (center, left, right…).
• android:text : Texte à afficher dans l’élément.
• Toute les chaines de caractères utilisées peuvent être déclarées dans le ficher
[Link] et utilisées à l’aide de la syntaxe @string/nom_de_la_chaine
• TextView
• android:textColor : Couleur du texte.
• Toute les couleurs utilisées sont déclarées dans le fichier [Link] et utilisées à
l’aide de la syntaxe @color/nom_de_la_couleur.
• android:paddingTop : Marge interne du haut.
• android:textSize : Définie la taille du texte.
• EditText
• android:inputType : Type du texte qui sera saisie dans la zone d’édition.
Interface graphique avec XML IvMad, 2011-2019 27

Application Android et XML

• TextView et EditText (similaire aux CSS3)


• android:paddingTop : C’est pour l’espacement du haut du Layout.
• android:gravity : Spécifie l’emplacement du contenu dans le conteneur.
• android:textSize : Spécifie la taille de texte.
• android:textStyle : Spécifie un style au texte (bold, italic, bolditalic).
• android:textColor : Spécifie la couleur du texte.
• android:id : Donne un identifiant à l’objet, afin de pouvoir y accéder depuis
une activité.
• android:hint : Spécifie un texte par défaut sur la zone.
• Ce texte sera affiché quand aucun android:text n’est défini (sert surtout en texte
d’indication pour des champs de formulaire par exemple).
Interface graphique avec XML IvMad, 2011-2019 28

Application Android et XML

Ajouter l'écouteur de
d'événement
addListenerButton()
dans la méthode
MainActivity.
Ajouter les lignes pour
le traitement du "click"
bouton
Interface graphique avec XML IvMad, 2011-2019 29

Application Android et XML par GUI


30

Application Android et XML par GUI

Pour récupérer la
saisie du champ
"EditText" il faut
mettre l'appel de
la description dans
le code Java avec
la méthode de
récupération
31

Application Android et XML par GUI

Pour changer le texte


affiché par le composant
"TextView", on le déclare
dans le code Java et on
procède avec la méthode
"setText()" au
changement d'affichage
Interface graphique avec XML IvMad, 2011-2019 32

Application Android et XML par GUI


Interface graphique avec XML IvMad, 2011-2019 33

RelativeLayout : TextView, EditText, …

RelativeLayout : TextView,
EditText, …

Gérer les composants


graphiques TextView,
EditText et Button avec
RelativeLayout
Interface graphique avec XML IvMad, 2011-2019 34

Android et XML : RadioButton (1)


• Les radio-boutons groupés retournent un choix unique parmi les options
proposées. La mise en œuvre passe par le renseignement du fichier XML
définissant l'IHM dans projet Android.

L'activité définie le traitement


des éléments décrits dans le
fichier XML du projet
Pour connaître l'indice du
choix:
int pos =
[Link]
(findViewById(selectedId));
Android et XML : RadioButton (2)
• La description du GUI est dans le fichier: activity_radio_groupe_xml.xml
36

Android et XML : CheckBox (1)


37

Android et XML : CheckBox (2)


Android et XML : Spinner (1)
Pour mettre en œuvre une liste déroulante d'options on applique le
code suivant:

Un Spinner_Adapter est installé avec


une Spinner_Array pour stocker les
options du choix attrapé par
OnItemSelectedListener
Android et XML : Spinner (1)
• Pour mettre en œuvre une liste déroulante :
Un Spinner_Adapter est installé avec
une Spinner_Array pour stocker les
options du choix attrapé par
OnItemSelectedListener

<Spinner android:id="@+id/contenu"

<resources> <string-array name="elements">


Android et XML : Spinner (2)
• Les options sont décrites dans le fichier: res/values/[Link]

• La définition du Spinner est dans le fichier


res/layout/activity_spinner_list.xml
Interface graphique avec XML IvMad, 2011-2019 41

Android : Afficher une liste d’éléments


• Afficher plus d’une centaine d’éléments en permettant le scroll
lorsqu'on dépasse la taille de l'écran avec la classe ListView.
Interface graphique avec XML IvMad, 2011-2019 42

Android : liste d’éléments cliquables


• On associe un ArrayAdapter à la ListView pour récupérer le click.

Android : liste d’éléments


cliquables
Interface graphique avec XML IvMad, 2011-2019 43

Android et XML : ImageView


• Afficher une image dans IU Android. L'image est enregistré dans le
répertoire /res/drawable.
Interface graphique avec XML IvMad, 2011-2019 44

Android et XML : ImageButton


• Un bouton peut recevoir une image à la place du texte libellé. L'image
de remplacement est enregistré dans le répertoire /res/drawable.

/res/layout
Interface graphique avec XML IvMad, 2011-2019 45

Android : changer l'icône de l'application


• Le dossier /res/mipmap contient les icônes attribuées par défaut à
l'APK installé sur le smartphone.
• Pour ajouter sa propre icône il faut activer l'éditeur : click droit sur res
puis New->Image Asset.
• Charger l'icône choisie en format PNG. L'éditeur se chargera de son
redimensionnement pour différents résolutions.
• Modifier dans AndroidManifest la ligne android:icon avec le
nouveau nom

Plus de détails sur [Link]


Interface graphique avec XML IvMad, 2011-2019 46

Android : Contrôler click depuis XML


• Le click du bouton peut être contrôler depuis l'interface XML de
l'application Android
WebView
Android et XML : WebView (1)
• Si on veut afficher un site web ou une simple page HTML dans une
activité Android, il faut se servir de la classe WebView.
• Son interface XML :
• <WebView
android:id="@+id/monwebview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
• Une autorisation d'accéder à Internet est nécessaire dans le fichier
[Link]
• <uses-permission android:name="[Link]" />
• Pour charger une page web à partir d'un site on utilise :
WebView monwebview = (WebView) findViewById([Link]);
[Link]("[Link]
• Pour afficher un contenu HTML :
WebView monwebview = (WebView) findViewById([Link]);
[Link](string_html, "text/html", null);
49

Android et XML : WebView (2)


50

Android et XML : WebView (3)


TableLayout
Interface graphique avec XML IvMad, 2011-2019 52

Android : Présenter en Tableau (1)


• La structure tableau dans toutes les plates-formes représente un
moyen efficace de présentation et/ou de stockage d'information.
• Le point de départ pour mettre en place un tableau dans une
application Android est de s'adresser à l'élément TableLayout.
• Le principe est un peu le même que pour le tableau en HTML :
• TableLayout défini un tableau, dans lequel on rajoute des lignes
• TableRow contient les composants.
• Les colonnes peuvent être définies comme
• extensibles (setColumnStretchable()) pour gérer la largeur des colonnes tout en
laissant une occuper l’espace vide pour arriver à la largeur du conteneur
• rétractables (setColumnShrinkable()) pour obtenir l’effet inverse.
• Le TableLayout ne gère pas l’affichage des bordures, lignes, colonnes ou
cellules. C'est à définir dans un fichier [Link].
53

Android : Présenter en Tableau (2)


• Créer le tableau dans res/layout/[Link]
<TableLayout style="@style/frag1TableLayout" >
<TableRow style="@style/frag1HeaderTableRow">
<TextView style="@style/frag1HeaderCol" android:text="cm"/>
<TextView style="@style/frag1HeaderCol" android:text="inch"/>
</TableRow>
<TableRow style="@style/frag1TableRow">
<TextView style="@style/frag1Col" android:text="2.54"/>
<TextView style="@style/frag1Col" android:text="1"/>
</TableRow>
<TableRow style="@style/frag1TableRow">
<TextView style="@style/frag1Col" android:text="5.08"/>
<TextView style="@style/frag1Col" android:text="2"/>
</TableRow>
<TableRow style="@style/frag1TableRow">
<TextView style="@style/frag1Col" android:text="7.62"/>
<TextView style="@style/frag1Col" android:text="3"/></TableRow>
</TableLayout>
Android : Présenter en Tableau (3)

• Un style peut être appliqué pour chacune des colonnes comme une
feuille de style CSS dans le fichier [Link].
<resources xmlns:android="[Link]
<style name="AppTheme" parent="@android:style/android:[Link]" />
<style name="defaultTextView" parent="@android:style/[Link]">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item></style>
<style name="frag1TableLayout">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item></style>
<style name="frag1HeaderTableRow" parent="frag1TableLayout">
<item name="android:layout_marginBottom">3dp</item></style>
<style name="frag1TableRow" parent="frag1TableLayout"></style>
<style name="frag1Col" parent="defaultTextView">
<item name="android:layout_marginBottom">1dp</item>
<item name="android:background">@drawable/tableborder</item></style>
<style name="frag1HeaderCol" parent="frag1Col">
<item name="android:textStyle">bold</item></style>
</resources>
Interface graphique avec XML IvMad, 2011-2019 55
Android : Présenter en Tableau (4)
• Ajouter une bordure au tableau grâce à un objet drawable en forme de
rectangle défini en arrière plan. Pour cela on créer l'objet drawable dans
le répertoire /res/drawable/[Link].
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="[Link] >
<solid android:color="#FFFFFF"/>
<stroke android:width="1dp" android:color="#777777"/>
<corners android:radius="3dp" />
<padding android:left="100dp" android:top="5dp"
android:right="10dp" android:bottom="5dp" />
</shape>
Interface graphique avec XML IvMad, 2011-2019 56
Android : Présenter en Tableau (5)

• TableLayout peut servir pour afficher un contenu de manière


dynamique à la sortie d'un calcul par exemple.
• On défini TableLayout dans /res/layout avec l'option ScrollView
pour assurer le défiler du tableau si le nombre de lignes dépasse l’écran.

/res/values/[Link]

/res/layout/
activity_table_layout_dynamique.xml
Interface graphique avec XML IvMad, 2011-2019 57
Android : Présenter en Tableau (6)
• Le code pour avoir la correspondance entre pouces et centimètres :
Log.x LogCat View
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 "LogCat".
• Pour afficher les opérateurs 'log' dans Android Studio il faut ajouter au
code Java la ligne Log.x(); et suivre les message dans la fenêtre.
• Pour écrire un opérateur 'Log' il faut importer la classe
[Link] qui propose les méthodes:
• Log.i() - "Info",
• Log.d() - "Debug",
• Log.w() - "Warning",
• Log.e() - "Error".
• Exemple:
• Log.i("NameActivity", "Bonjour, ça marche!");
Interface graphique avec XML IvMad, 2011-2019 60

Android : LogCat view


Géolocalisation
Applications TCP
Fichiers
Géolocalisation

Géocodage
Global Positioning System (GPS)
• GPS compte 24 satellites répartis sur 6 orbites parcourues en 12h
pour couvrir le globe terrestre.
• Mis en place par le département de la Défense des États-Unis à des fins militaires
à partir de 1973, le système est opérationnel en 1995 et s'ouvre au civil en 2000.
• Les satellites NAVSTAR (Navigation Satellite Timing And Ranging) sont
situés à 20184 km d'altitude et diffusent leur position et l'heure sur des
fréquences dans la bande des micro-ondes (~1500Mhz).
• Le GPS se synchronise puis calcule la distance avec le satellite grâce à
la différence de temps en émission et réception. Position
• distance = deltaT * c évaluée
(~vitesse de la lumière ~300000km/s) avec 3
1 3
satellites
• Le GPS fonctionne par triangulation sur une
2
avec 4 satellites (1) longitude, (2) latitude, surface
(3) altitude et (4) synchronisation temporelle. 3D
Développement d'applications mobiles IvMad, 2011-2019 5

Global Positioning System (GPS)


• Le fonctionnement :
• Les 24 satellites tournant autour de la terre diffusent leur position et
l'heure de diffusion
• Un récepteur, équipé d'une horloge, reçoit au moins 4 signaux de 4
satellites et calcule alors sa position par triangulation.
• La précision est de 15 à 100 mètres (en OutDoor)
• La (géo)localisation Android Network Location
utilise aussi les réseaux téléphoniques
cellulaires et le Wi-Fi. La technologie Li-Fi
est donnée avec une précision la plus fine.
• Plus économique à l'utilisation de la batterie ,
• Fonctionne à :
• l'intérieur (InDoor)
• l'extérieur (OutDoor).
Autres systèmes de géolocalisation
• GLONASS (ГЛОНАСС - глобальная навигационная спутниковая
система) est le système russe, pleinement opérationnel depuis
décembre 2011 avec 24 satellites (accès restreint);
• BEIDOU est le système de positionnement créé par la Chine,
opérationnel uniquement sur le territoire chinois et les régions
limitrophes.
• Le système utilise quatre satellites géostationnaires;
• GALILEO est le système civil de l'Union européenne, partiellement
opérationnel depuis fin 2016.
• À terme (prévu vers 2020), Galileo sera constitué de 30 satellites dont 6 de
rechange.
• Chaque satellite circule sur une orbite moyenne (23 222 km)
dans trois plans orbitaux distincts ayant une inclinaison de 56°.
• Ces satellites émettent un signal qui leur est propre.
Développement d'applications mobiles IvMad, 2011-2019 7

Android : Paramètres de sécurité


• Depuis Android 6.0 (API level 23) plusieurs points de sécurité ont été
considérablement renforcés.
• L'essentiel du changement pour le développement d’activité Java-
Android consiste à demander systématiquement l'accord de
l'utilisateur pour effectuer des opérations avec des ressources ou
informations en dehors du bac à sable définie par le système Android.
• Le développeur déclare la liste des permissions dans le fichier Manifest.
En temps réel ces permissions sont vérifiées et confirmées par
l’utilisateur. Une demande de permission :
[Link](thisActivity,
new String[]{[Link].READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
• Les activités concernées sont: Géolocalisation, Wifi, Bluetooth,
Contacts, Caméra et d’autres.
Développement d'applications mobiles IvMad, 2011-2019 8

Android : Géolocalisation API ≥ 23


• A partir de Android 6 l’utilisateur confirmera chaque permission au
"RunTime" (une pop-up demandera l'accord utilisateur)
• pour les versions inférieures à API 23 la permission sera donnée à
l’installation de l’application.
• Une permission est déclarée dans le fichier de l'application:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=[Link] ......
<uses-permission
android:name="[Link].ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="[Link].ACCESS_FINE_LOCATION" />
<application...............
</application>
Les permissions nécessaire
</manifest> pour accéder au GPS
Développement d'applications mobiles IvMad, 2011-2019 9

Android : Géolocalisation
• Les activités de géolocalisation sont considérées comme sensibles et
une permission doit être accordée chaque fois que l'application aurait
besoin de ces données en temps réel.
• On vérifie l'état de la permission par la méthode
[Link]()
int permissionCheck =
[Link](thisActivity,
[Link].ACCESS_FINE_LOCATION);
• Si la p e r m i s s i o n e s t a c c o r d é e la m é t h o d e r e t o u r n e
PackageManager.PERMISSION_GRANTED et l'application peut procéder
aux opérations prévues.
• Dans le cas de PERMISSION_DENIED l'application doit explicitement
demander la permission à l'utilisateur par la méthode
requestPermissions().
Développement d'applications mobiles IvMad, 2011-2019 10

Android : Demande de permission

Version allégée
avec accord ou refus
de la permission
Développement d'applications mobiles IvMad, 2011-2019 11

Android : Vérifier la permission (1)

On vérifie si la
permission est
accordée avec
checkSelfPermission
sinon on demande la
permission avec
requestPermissions
Développement d'applications mobiles IvMad, 2011-2019 12

Android : Obtenir la permission (2)

La variable PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION sert de call


back pour savoir si la permission est garantie ou non.
Une fois la permission demandée, le résultat de la demande sera
retourné dans la méthode onRequestPermissionsResult
Quand la permission est accordée pour la première fois alors on fait
appel à la méthode surchargée getLocationPosition.
Android : Afficher les coordonnées (3)
La méthode getLocationPosition configure le locationManager et fait appel à sa
méthode getLastKnownLocation pour relever les dernières coordonnées connues
de la position GPS du smartphone ou de la tablette.
Développement d'applications mobiles IvMad, 2011-2019 14

Géolocalisation
• Deux éléments principaux pour utiliser les services de géolocalisation
• Gestionnaire delocalisation qui fournit l'accès aux services de localisation
• Fournisseur de localisation en fonction de la technologie utilisée pour la
localisation de l'appareil.
• Pour accéder au gestionnaire de localisation il faut obtenir l'instance de
LOCATION_SERVICE par la méthode getSystemService:
String serviceName = Context.LOCATION_SERVICE;
LocationManager locationManager =
(LocationManager)getSystemService(svcName);
• L'utilisation des services doit être déclarer dans le fichier
[Link] avec la ligne:
<uses-permission
android:name="[Link].ACCESS_FINE_LOCATION"/>
Android : Géolocalisation
• Pour trouver le dernier emplacement connu par le GPS on s'adresse à
un fournisseur de localisation avec la méthode getLastKnownLocation:
String provider = LocationManager.GPS_PROVIDER;
Location loc = [Link](provider);
• La méthode getLastKnownLocation ne demande pas au fournisseur de
localisation de mettre à jour la position courante!
• L'objet Location retourné inclut toutes les informations de position
disponibles chez le fournisseur:
• Latitude (méthode [Link]();)
• Longitude (méthode [Link]();)
• Altitude (méthode [Link]();)
• Vitesse et heure à laquelle la position a été déterminée (getSpeed())
Développement d'applications mobiles IvMad, 2011-2019 16

Géolocalisation (≤ API 21 Android 5)


public class WhereAmIMainActivity extends ActionBarActivity
{ TextView myLocationText;
String latLongString;
@Override
protected void onCreate(Bundle savedInstanceState)
{ [Link](savedInstanceState);
myLocationText = (TextView) findViewById([Link]);
setContentView(myLocationText);
LocationManager locationManager;
String svcName = Context.LOCATION_SERVICE;
locationManager =
(LocationManager)getSystemService(svcName);
// String provider = LocationManager.GPS_PROVIDER;
String provider = LocationManager.NETWORK_PROVIDER;
Location loc = [Link](provider); Cet exemple est
if (loc != null) { conforme aux API
double lat = [Link]();
double lng = [Link](); Android 5 c.à.d. < 23
double alt = [Link](); (21, 19, 18, 17, …)
double spd = [Link]();
latLongString = "\n Latitude: "+lat+"\n Longitude: "+ L’API 23 de
lng+"\n Altitude: "+alt+"m"+"\n Vitesse: "+spd; l’Android 6 demande
} else {
latLongString = "Aucun emplacement disponible"; des permissions au
} "RunTime"
[Link]("Votre position est: " + latLongString);
}
}
Géolocalisation
• L'exemple précédent s'appuie sur la dernière position connu
(getLastKnownLocation(provider))
• L'exemple peut évoluer en équipant l'application d'un écouteur de
changement de position pour qu'on puisse mettre à jour la position suivant
son évolution.
• Les mises à jour peuvent être programmées pour toutes les 2 secondes et
lorsqu'un déplacement est détecté de plus de 5 mètres.
• Plutôt que sélectionner un fournisseur (provider), on peut laisser
A n d r o i d choisir le provider d i s p o n i b l e le mieux a d a p t é à
l'environnement ou aux critères déposés (objet Criteria)
• Créer une instance de LocationListever qui déclenchera la méthode
updateWithNewLocation chaque fois qu'un changement de position sera
détecté.
Développement d'applications mobiles IvMad, 2011-2019 18

Moyens de géolocalisation
• L'unité mobile Android propose différents moyens de déterminer la
géolocalisation:
• Par triangulation des stations GPS (Global Positioning System),
• Par recouvrement des cellules mobiles (3G/4G/5G),
• Par le réseau Wifi, Lifi.
• Pour une géolocalisation on implémente l'interface LocationListener.
• On s'adresse ensuite à l’objet LocationManager pour gérer l'abonnement
aux mises à jour des coordonnées GPS.
• Dans l'Activité (View) 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 statut d’une source change;
• onLocationChanged est appelée quand les coordonnées GPS changent.
Géolocalisation
• Pour s’abonner à la mise à jour des coordonnées GPS, il faut utiliser la
méthode requestLocationUpdates(String, long, float, LocationListener) qui
possède 4 arguments :
• le provider utilisé pour recevoir les mises à jour des coordonnées
(GPS / NETWORK …)
• l'intervalle minimum entre deux notifications (en millisecondes)
• la distance minimum entre deux notifications (en mètre)
• l’instance de l'écouteur de géolocalisation 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’utilisation 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.
Géolocalisation "courte"

1. On instancie le critère du
meilleurs provider.
getBestProvider
2. On fait appel à la dernière
position connue.
getLastKnownLocation
3. Une mise à jour de la
position est demandée
après 2000ms ou 5m
d'écart.
requestLocationUpdates
Géolocalisation
• Pour trouver les fournisseurs de localisation disponibles:
LocationManager.GPS_PROVIDER // localisation par GPS
LocationManager.NETWORK_PROVIDER // localisation par Wi-Fi
LocationManager.PASSIVE_PROVIDER // localisation par GSM (2G/3G/4G/5G)
• Le fichier [Link] doit être enrichi avec les permissions
requises pour accéder aux services de localisation, Internet et au GPS:
<uses-permission
android:name="[Link].ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="[Link].ACCESS_FINE_LOCATION" />
<uses-permission
android:name="[Link]" />
Géolocalisation (API 21)
Géocodage (1)
• Le géocodage traduit des adresses en coordonnées géographiques et
inversement avec la classe Geocoder dont l'utilisation demande deux
permissions supplémentaires dans le fichier manifest de l'activité:
<uses-library android:name="[Link]" />
<uses-permission android:name="[Link]" />
• La classe Geocoder donne accès à deux fonctions de géocodage:
• Géocodage avant qui donne la latitude et la longitude d'une adresse;
• Géocodage inverse qui donne l'adresse en fonction de la latitude et la
longitude.
• Les fonctions renvoient une liste d'objets Address. La granularité de la liste
dépend des limites indiquées à l'appel.
Geodecoder geodecoder =
new Geodecoder(getApplicationContext(),[Link]());
List<Address> addresses = null;
Géocodage (2)
Géocodage (3)

Récupérer l'adresse du
point GPS avec la classe
Geocoder
Android : Ajouter une "map" (1)
• Un nouveau projet est crée avec les attributs nécessaires:
• Nom du projet;
• Domain du projet
• Type "Google Maps Activity",
• Le nom de l'activité.
• Pour se connecter au "Google Maps server" il faut créer une clé API qui
autorisera l'accès à la "map".
• Le lien est disponible dans le fichier google_maps_api.xml pour activer une
console et créer un projet sur le serveur. Au retour une clé est générée qui est
insérée dans le même fichier à une place indiquée.
• Le fichier [Link] doit afficher la permission pour
accéder aux coordonnées GPS
<uses-permission android:name="[Link].ACCESS_FINE_LOCATION" />
Android : Ajouter une "map" (2)
• Le code Java généré à la création du projet

Coordonnées GPS
à préciser :
Latitude et Longitude
Réseau

TCP
Développement d'applications mobiles IvMad, 2011-2019 29

Android : Modèle Client-Serveur


• Routage et passerelle
Android : Modèle Client-Serveur
• Échange d'informations entre le client et le serveur
Développement d'applications mobiles IvMad, 2011-2019 31

Android : La Socket
• La Socket (connecteurs réseau) représente une interface de
programmation pour les communications entre processus.
• Il existe généralement quatre types de sockets :
• Une socket datagram permet une communication bidirectionnelle qui n'est
pas séquencée. Un processus utilisant ce type de Socket peut recevoir les
données dans un ordre différent de l'ordre de départ.
• C'est le protocole UDP.
• Une socket stream permet une communication bidirectionnelle, sûre,
séquencée et un flux de données sans duplication pouvant entraîner une
fragmentation des paquets transmis.
• Il s'agit du protocole TCP.
• Une socket raw
• Une socket sequenced packet.
Android : Le rôle des Sockets
• Connexion à une machine distante
• Envoie et/ou Réception de données
• Fermeture d'une connexion
• Attachement à un port
• Acceptation d'une demande de connexion à un port local
• Un numéro allant de 1 à 65535 est attribué à un port
• Les ports de 1 à 1023 sont réservés aux services:
• FTP (21), HTTP (80), SMTP (25), HTTPS (443)
• Attente de demandes de connexion
Développement d'applications mobiles IvMad, 2011-2019 33

Android : Le mode connecté (TCP)


• Les étapes côté Serveur:
• Instancier la classe ServerSocket et l’instruire à écouter sur un port
supérieur à 1024.
• Accepter les connexions par la méthode accept() et créer un objet
Socket pour référencer la nouvelle connexion.
• Passer la nouvelle connexion au programme/méthode approprié.
• Fermer la connexion par la méthode close().
• Les étapes côté Client:
• Se connecter au service approprié en instanciant la classe Socket et
en lui passant comme paramètres l’adresse du Serveur et le port
écouté.
• Lorsque l’échange est terminé fermer la connexion par la méthode
close().
Développement d'applications mobiles IvMad, 2011-2019 34

Android : Le mode connecté (TCP)


• Le Client et le Serveur en mode connecté
Développement d'applications mobiles IvMad, 2011-2019 35

Android : StrictMode pour TCP


• 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ée si l'accès réseau est demandé 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:
[Link] policy = new StrictMode.
[Link]().permitAll().build();
[Link](policy);
Développement d'applications mobiles IvMad, 2011-2019 36

Android : Connexion TCP


Résoudre l'adresse IP locale
Développement d'applications mobiles IvMad, 2011-2019 37

Android : client-side TCP socket


• Le fichier [Link] contient la description des ressources et
les autorisations d'accès au réseau Internet L'autorisation
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="[Link] d'accéder au réseau
package="[Link]" et configurée dans le
android:versionCode="1"
android:versionName="1.0" >
Manifest de
<uses-sdk android:minSdkVersion="15" /> l'application
<uses-permission android:name="[Link]" />
<uses-permission android:name="[Link].ACCESS_NETWORK_STATE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ClientTCPAndroidActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="[Link]" />
<category android:name="[Link]" />
</intent-filter>
</activity>
</application>
</manifest>
Développement d'applications mobiles IvMad, 2011-2019 38

Android : Connexion TCP (client)


Le serveur TCP reçoit le message du client TCP Android
Développement d'applications mobiles IvMad, 2011-2019 39

Android : server-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

Le serveur TCP est


installé sur le port
1234 à l'adresse IP:
[Link]
Développement d'applications mobiles IvMad, 2011-2019 40

Android : Server TCP


Le serveur TCP sur Android
Développement d'applications mobiles IvMad, 2011-2019 41

Android : Client TCP

Il est à prévoir la
description de
l'interface graphique
de cette activité est
définie dans le fichier
XML
activity_tclclient_co
nnection_main.xml
Android : Connexion réseau
• Avant de procéder à une connexion réseau, il faut s'assurer que cette
connexion est disponible. Un Smartphone ou tablette peuvent être
hors réseau ou connexion Wifi désactivée.
• Cette disponibilité est testée par 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 = [Link]();
// Si le réseau est indisponible networkInfo = null et la
// méthode retourne false, sinon true.
if (networkInfo != null && [Link]()) {
return true;
}
return false;
}
Android : Connexion HTTP
• HttpURLConnection avec URL sont des classes disponibles depuis Java
SE 2.0 standard.
• C'est un client léger d'usage général basé HTTP et approprié pour la
plupart des applications Android.
try {
URL url = new URL("[Link]
if (isNetworkAvailable()) {
[Link](getApplicationContext(),
"Réseau disponible!", Toast.LENGTH_LONG).show();
HttpURLConnection con = (HttpURLConnection) [Link]();
readStream([Link]());
} else {
[Link](getApplicationContext(),
"Réseau indisponible!", Toast.LENGTH_LONG).show();
}
} catch (Exception e) { [Link](); }
Développement d'applications mobiles IvMad, 2011-2019 44

Android : Connexion HTTP


• Lecture du Stream d'entrée dont la connexion est effectuée par
HttpURLConnection et URL.
private void readStream(InputStream in)
{ BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(in));
String line = "", str = "";
while ((line = [Link]()) != null)
{ str += line;
}
[Link](getApplicationContext(),str,Toast.LENGTH_LONG).show();
} catch (IOException e) { [Link]();
} finally {
if (reader != null) { [Link](); }
}
}
Développement d'applications mobiles IvMad, 2011-2019 45

Android : Connexion HTTP


<uses-permission
android:name="[Link]" />
<uses-permission
android:name="[Link].ACCESS_NETWORK_STATE" />

Le contenu de l'adresse:
[Link]
en format brut
(le fichier [Link])
Le flux Entrée/Sortie
Les fichiers
Développement mobile pour Android IvMad, 2011-2019 47

Android : Les flux E/ S


Tout ce qu’il faut ByteArrayInputStream BufferedInputStream
p•our lire
FileInputStream DataInputStream

InputStream FilterInputStream LineNumberInputStream

PipedInputStream InputStreamReader

SequenceInputStream

Object File StringBufferInputStream

Accès en R/W et
RandomAccessFile
positionnement

ByteArrayOutputStream
OutputStream BufferedOutputStream
FileOutputStream
OutputStreamWriter
FilterOutputStream
Tout ce qu’il faut PrintStream
PipedOutputStream
pour écrire
Développement mobile pour Android IvMad, 2011-2019 48

Android : Les méthodes des fichiers


Développement mobile pour Android IvMad, 2011-2019 49

Android : Les méthodes des fichiers


Développement mobile pour Android IvMad, 2011-2019 50

Android : Ecrire dans un fichier


Android : Lire dans un fichier
public String ReadData(String nFichier)
{ FileInputStream fIn = null;
InputStreamReader isr = null;
char[] inputBuffer = new char[2550];
String data = null;
try {
fIn = getApplicationContext().openFileInput(nFichier);
isr = new InputStreamReader(fIn);
[Link](inputBuffer);
data = new String(inputBuffer);
} catch (Exception e) {
[Link](); // l'exception sur le flux d'erreur standard
}
return data;
}

Vous aimerez peut-être aussi