IHM Android : Création avec XML
IHM Android : Création avec XML
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
[Link]
Autorisations
pour accéder
au réseau
Interface graphique avec XML IvMad, 2011-2019 11
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
Xml_String_Main_Activity.xml
Ouzayr
res/values/[Link]
Application Android et XML
Ouzayr
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
• 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
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
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
RelativeLayout : TextView,
EditText, …
<Spinner android:id="@+id/contenu"
/res/layout
Interface graphique avec XML IvMad, 2011-2019 45
• 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)
/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
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
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
Version allégée
avec accord ou refus
de la permission
Développement d'applications mobiles IvMad, 2011-2019 11
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
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
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 : 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
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
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
PipedInputStream InputStreamReader
SequenceInputStream
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