SlideShare une entreprise Scribd logo
1  sur  88
Télécharger pour lire hors ligne
19/01/2021 Adil JEGHAL 1
Programmation Mobile:
Android
Pr. Adil JEGHAL
adil.jeghal@usmba.ac.ma
19/01/2021 Adil JEGHAL 2
Introduction
Objectif du Cours
Comprendre l’architecture du système Android
Comprendre l’organisation d’une application Android
Développer et déployer des applications natives Android
19/01/2021 Adil JEGHAL 3
Introduction
Pré requis
Programmation Orienté Objet
JAVA
XML
19/01/2021 Adil JEGHAL 4
Introduction
Un périphérique mobile c'est quoi ?
Un écran très petit
Pas de clavier/souris
Pas de disque dur
Fonctionne sur batterie
Moyens de communication variés
 L’interface graphique devra être la
plus simple possible
 Mémoire allouée à une application
est de l’ordre de quelques mégabytes
 une seule application peut être
visible à la fois
19/01/2021 Adil JEGHAL 5
Introduction
Android: c’est quoi?
Un système d'exploitation open source pour Smartphones, et terminaux
mobiles
Conçu par Android, une startup rachetée par Google, et annoncé
officiellement le 5 novembre 2007
C’est aujourd’hui le système d’exploitation mobile le plus utilisé à travers le
monde
19/01/2021 Adil JEGHAL 6
Introduction
Historique des versions
19/01/2021 Adil JEGHAL 7
Plateforme Android
Le système d’exploitation Android est basé sur Linux. Au plus bas niveau de ce
système se trouve un noyau Linux destiné à la gestion du matériel comme :
Drivers de ces terminaux,
La gestion de la mémoire,
La gestion des processus
L’accès au réseau
…
19/01/2021 Adil JEGHAL 8
Plateforme Android
Architecture de la plateforme
Produit final, ce que
l’utilisateur voit, ce qui
lui permet d’interagir
avec le système
Interface permettant
aux développeurs de
dialoguer avec les
librairies basiques
d’Android
Middleware ecrit en
C++, Librairies natives
de Android manipulant
le materiel
La machine virtuelle
d’Android
Ensemble de classe
utilisés par la machine
virtuelle
Noyau Linux pour la
gestion et la
configuration du
materiel
19/01/2021 Adil JEGHAL 9
Le kit de développement Android
Les kits de développement
 Google fournit, en plus du système d’exploitation, un kit de développement Java (SDK) comprenant:
• des API (interfaces de programmation) ;
• des exemples de code ;
• de la documentation ;
• des outils – parmi lesquels un émulateur – permettant de couvrir quasiment toutes les étapes du
cycle de développement d’une application.
 Google fournit le NDK (Native Developper Kit) pour développer des applications en C/C++
 L'ADK (Accessory Development Kit) permet de développer des applications pour des extensions
électroniques
 Le SDK Android est disponible gratuitement sur le site de Google
19/01/2021 Adil JEGHAL 10
Les Applications Android
Composants d’une application
 Activités
 Services
 Fournisseurs de contenus
 Gadgets
 Objets Intent
 Récepteurs d’Intents
 Notifications
19/01/2021 Adil JEGHAL 11
Les Applications Android
Quelques concepts importants
 Les vues:
• Ce sont des éléments de l’interface graphique que l’utilisateur voit et sur lesquels il pourra agir.
• Les vues contiennent des composants, organisés selon diverses mises en page (les uns à la suite des autres, en
grille…)
 Les contrôles:
• Représentent un sous-ensembles de vues, par exemple: boutons, champs de saisie, case à cocher, etc.
• Ils ont besoin d’accéder aux textes et aux images qu’ils affichent (à partir des fichiers ressources de l’application)
 Les activités:
• Ce sont des écrans structurés par un ensemble de vues et de contrôles composant leur interface de façon logique.
• Une activité est composée d’une hiérarchie de vues contenant elles-mêmes d’autres vues.
• Une application comportant plusieurs écrans, possédera donc autant d’activités.
19/01/2021 Adil JEGHAL 12
Les Applications Android
Quelques concepts importants
 Le fichier de configuration - AndroidManifest.xml :
C’est un fichier indispensable à chaque application qui décrit entre autres :
• le point d’entrée de votre application (quel code doit être exécuté au démarrage de l’application) ;
• quels composants constituent ce programme ;
• les permissions nécessaires à l’exécution du programme (accès à Internet, accès à l’appareil photo...).
19/01/2021 Adil JEGHAL 13
Les Applications Android
Composants applicatifs
Activité
•Standard de
l'application sous
Android
•Possède une IHM
•Toutes les activités
dérivent de la classe
mère Activity
Service
•Composant qui fonctionne en
tâche de fond, de manière
invisible.
•Principales utilisations: tâches
de fond, répétitives, qui n'ont
pas besoin d'interaction directe
avec l'utilisateur
(téléchargement, mise à jour,
Web service, etc.)
Broadcast Receiver
•Réagit en fonction des
messages diffusés par le
système Android
•Le système de gestion de
l'énergie diffuse l'état de la
batterie
•Les classes d'application
héritent de la classe
BroadcastReceiver
Fournisseur de contenus
•Propose des contenus à
l'ensemble des activités et
services
•Demande le plus de lignes de
code, permet le partage des
données entre toutes les
applications
19/01/2021 Adil JEGHAL 14
Les Applications Android
Eléments d’interaction
Objet Intent
•Permet aux
applications de
fournir ou demander
des services ou des
données.
•La transmission se fait
à travers tout le
système et peut cibler
précisément une
activité ou un
service.
Récepteur d’intentions
•Permet à une application
d’être à l’écoute des autres afin
de répondre aux objets Intent
qui lui sont destinés et qui sont
envoyés par d’autres
composants applicatifs.
Filtre d’intentions
•Lorsqu'un objet Intent ne
mentionne pas explicitement
un composant cible, les filtres
des applications
cibles sont comparés à l’objet
Intent.
Notifications
•Signale une
information à
l’utilisateur sans
interrompre ses
actions en cours.
19/01/2021 Adil JEGHAL 15
Les Applications Android
Permissions
 Certaines opérations sont réalisables à condition d’en obtenir la permission.
 Ces actions sont de plusieurs formes :
• Opérations pouvant entraîner un surcoût (connexion, échange de données, envoi de SMS parexemple)
• Utilisation de données personnelles (accès à vos contacts, à votre compte Google…)
• Accès au matériel du téléphone (écriture sur la carte mémoire...).
 L’utilisation de permissions doit être déclarée dans le fichier de configuration de l’application.
 À l’installation de l’application, l’utilisateur disposera d’un récapitulatif de toutes les permissions demandées
19/01/2021 Adil JEGHAL 16
Les Applications Android
Cycle de vie d’une application
 Les applications Android réagissent à des changements d’états imposés par le système (démarrage, pause, reprise, arrêt).
• Elles n’ont aucun contrôle direct sur leur propre cycle de vie.
• C’est le système qui peut mettre en pause ou arrêter une activité, si nécessaire.
 Chaque application fonctionne dans son propre processus.
• Le système Android est responsable de la création et de la destruction des processus et gère ses ressources avec
comme objectifs: la sécurité, la disponibilité et la réactivité de l’appareil.
• Un processus peut être tué à n’importe quel moment, sans son consentement, pour libérer des ressources nécessaires
à d’autres applications.
 La priorité du processus donnée par le système détermine leur ordre d’arrêt
• La priorité de l’application est déterminée par son composant le plus prioritaire (une application possédant un
fournisseur de contenu a par exemple plus de priorité qu’une application qui en est dépourvue).
• Deux applications de même priorité seront départagées par le temps qu’elles auront passé à une priorité plus faible.
19/01/2021 Adil JEGHAL 17
Les Activités Android
Définition
 Une activité peut être assimilée à un écran qu’une application propose à son utilisateur.
• Pour chaque écran de votre application, vous devrez donc créer une activité.
 La transition entre deux écrans correspond au lancement d’une activité ou au retour vers une activité placée en arrière-
plan.
 Une activité comprend 2 volets :
• La logique de l’activité et la gestion du cycle de vie de l’activité qui sont implémentés en Java, dans une classe héritant
de Activity;
• L’interface utilisateur, qui pourra être définie soit dans le code de l’activité, soit, de façon plus générale, dans un fichier
XML placé dans les ressources de l’application.
19/01/2021 Adil JEGHAL 18
Les Activités Android
Code minimal pour créer une activité
import android.app.Activity;
import android.os.Bundle;
public class ActiviteSimple extends Activity {
/**
* Méthode appelée à la création de l’activité
* @param savedInstanceState permet de restaurer l’état
* de l’interface utilisateur
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
19/01/2021 Adil JEGHAL 19
Les Activités Android
Cycle de vie d’une activité
19/01/2021 Adil JEGHAL 20
Les Activités Android
Cycle de vie d’une activité
19/01/2021 Adil JEGHAL 21
Les Activités Android
Squelette d’une activité
import android.app.Activity;
import android.os.Bundle;
public final class TemplateActivity extends Activity {
/*Appelée lorsque l’activité est créée. Permet de restaurer l’état de l’interface
utilisateur *grâce au paramètre savedInstanceState.*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Placez votre code ici
}
/*Appelée lorsque que l’activité a fini son cycle de vie. C’est ici que nous placerons
notre *code de libération de mémoire, fermeture de fichiers et autres opérations de
"nettoyage".*/
@Override
public void onDestroy(){
// Placez votre code ici
super.onDestroy();
}
19/01/2021 Adil JEGHAL 22
Les Activités Android
Squelette d’une activité
/*Appelée lorsque l’activité démarre. Permet d’initialiser les contrôles.*/
@Override
public void onStart(){
super.onStart();
// Placez votre code ici
}
/*Appelée lorsque l’activité passe en arrière plan. Libérez les écouteurs, arrêtez les
*threads, votre activité peut disparaître de la mémoire.*/
@Override
public void onStop(){
// Placez votre code ici
super.onStop(); }
/*Appelée lorsque l’activité sort de son état de veille.*/
@Override
public void onRestart(){
super.onRestart();
//Placez votre code ici}
19/01/2021 Adil JEGHAL 23
Les Activités Android
Squelette d’une activité
/*Appelée lorsque que l’activité est suspendue. Stoppez les actions qui consomment des
*ressources. L’activité va passer en arrière-plan.*/
@Override
public void onPause(){
//Placez votre code ici
super.onPause();
}
/*Appelée après le démarrage ou une pause. Relancez les opérations arrêtées (threads).
*Mettez à jour l’application et vérifiez vos écouteurs.*/
@Override
public void onResume(){
super.onResume();
// Placez votre code ici
}
19/01/2021 Adil JEGHAL 24
Les Activités Android
Squelette d’une activité
/*Appelée lorsque l’ activité termine son cycle visible. Sauvez les données importantes.*/
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//Placez votre code ici, sans quoi l’activité aura perdu son état lors de son
réveil
super.onSaveInstanceState(savedInstanceState);
}
/*Appelée après onCreate. Les données sont rechargées et l’interface utilisateur est
*restaurée dans le bon état.*/
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//Placez votre code ici
}
}
19/01/2021 Adil JEGHAL 25
Les Activités Android
Squelette d’une activité
19/01/2021 Adil JEGHAL 26
Les Activités Android
Méthodes correspondant au cycle de vie
Les méthodes onXxx sont appelées au cours du cycle de vie. Si elles sont surchargées elles doivent faire appel à leur
homologue de la classe supérieure (super.onXxx).
 onCreate(Bundle) appelée à la création. Le paramètre permet de récupérer un état sauvegardé lors de l'arrêt de l'activité
(si on a fait une sauvegarde)
 onPause() appelée quand l'activité n'est plus en premier plan
 onDestroy() appelée quand l'activité se termine
 onStart() appelée quand l'activité démarre
 onRestart() appelée quand l'activité redémarre
 onStop() appelée quand l'activité n'est plus visible
 onResume() appelée quand l'activité vient en premier plan
 finish() permet de terminer une activité
19/01/2021 Adil JEGHAL 27
Les Activités Android
Méthodes relatives à l'interface
 setContentView(int) permet de créer l'interface depuis un fichier XML, le paramètre désigne ce fichier par son identifiant
 findViewById(int) récupération d'un élément d'interface (renvoie un objet de classe View) , le paramètre désigne cet
élément par son identifiant (normalement défini dans la classe R)
 showDialog(int) ouverture d'une fenêtre de dialogue. Le paramètre désigne la fenêtre de dialogue par son identifiant
 showDialog(int, Bundle) ouverture d'une fenêtre de dialogue. Le 1er paramètre désigne la fenêtre de dialogue par son
identifiant, le second permet de lui passer des paramètres
 dismissDialog(int) fermeture d'une fenêtre de dialogue désignée par son identifiant
 onCreateDialog(int, Bundle) appelée lors de l'ouverture d'une fenêtre de dialogue. Le 1er paramètre est l'identifiant de la
fenêtre de dialogue, le second est celui qui avait été passé lors de l'appel de showDialog
 onPrepareDialog(int, Bundle) appelée lors de l'activation d'une fenêtre de dialogue déjà ouverte. Le 1er paramètre est
l'identifiant de la fenêtre de dialogue, le second est celui qui avait été passé lors de l'appel de showDialog
 getCurrentFocus() renvoie l'élément de l'interface (objet de classe View) ayant actuellement le focus
19/01/2021 Adil JEGHAL 28
Les Activités Android
Méthodes relatives aux menus et menus contextuels
 onCreateOptionsMenu(Menu) appelée lorsqu'un menu de l'activité est affiché. Le paramètre est le menu affiché.
 onOptionsItemSelected(MenuItem) appelée lors d'un choix dans un menu de l'activité. Le paramètre est le choix
effectué.
 onOptionsMenuClosed(Menu) appelée lors de la fermeture d'un menu de l'activité. Le paramètre est le menu fermé.
 registerForContextMenu(View) associe un menu contextuel à l'élément passé en paramètre
 unregisterForContextMenu(View) supprime l'association du menu contextuel à l'élément passé en paramètre
 onCreateContextMenu(ContextMenu, View, ContextMenu.ContextMenuInfo) appelée lorsqu'un menu contextuel est
affiché. Le 1er paramètre est ce menu contextuel, le 2ème est l'élément d'interface auquel il est associé, le dernier donne
des informations sur le contenu de l'élément d'interface qui a causé l'apparition du menu contextuel
 onContextItemSelected(MenuItem) appelée lors d'un choix dans un menu contextuel. Le paramètre est le choix effectué.
 onContextMenuClosed(ContextMenu) appelée lors de la fermeture d'un menu contextuel. Le paramètre est le menu
fermé.
19/01/2021 Adil JEGHAL 29
Les Activités Android
Méthodes relatives à l'environnement et aux ressources
 getResources() renvoie un objet de classe Resources permettant l'accès aux ressources de l'application (voir plus loin la
classe Resources)
 onUserInteraction() appelée à chaque interaction de l'utilisateur (clavier, trackball, touché)
 onBackPressed() appelée lorsque l'utilisateur appuie la touche de retour arrière du téléphone
 onLowMemory() appelée lorsque le niveau de batterie devient faible
 getFilesDir() renvoie un objet de classe File représentant le chemin où sont placés les fichiers propres à l'application
 openFileInput(String) renvoie un objet de classe FileInputStream correspondant à un flux de lecture connecté au fichier
dont le nom est passé en paramètre.
 openFileOutput(String, int) renvoie un objet de classe FileOutputStream correspondant à un flux d'écriture connecté au
fichier dont le nom est passé en premier paramètre. Le second paramètre est le mode d'ouverture qui peut être :
MODE_PRIVATE (mode normal), MODE_APPEND (ajout à un fichier existant), MODE_WORLD_READABLE et
MODE_WORLD_WRITEABLE (pour les droits d'accès). On peut cumuler plusieurs attributs par |
19/01/2021 Adil JEGHAL 30
Les Activités Android
Méthodes de lancement d'activités et de services
 startActivity(Intent) Lance une autre activité, le paramètre désigne l'activité ou les propriétés permettant à Android de
l'identifier.
 startActivityForResult(Intent, int) Lance une autre activité dont on attend un retour, le 1er paramètre désigne l'activité
ou les propriétés permettant à Android de l'identifier, le second paramètre est un numéro associé à cette activité qui
permettra d'en identifier la réponse.
 startNextMatchingActivity(Intent) Utilisé pour demander à Android de lancer une autre activité lorsque celle proposée
précédemment n'a pas donné satisfaction. Le paramètre correspond à celui qui a donné un résultat infructueux.
 finishActivity(int) Termine une activité dont on attendait un retour, le paramètre est le numéro associé à cette activité
lors de son lancement
19/01/2021 Adil JEGHAL 31
Les Activités Android
Méthodes de lancement d'activités et de services
 startService(Intent) Lance un service, le paramètre désigne le service ou les propriétés permettant à Android de
l'identifier
 stopService(Intent) Arrête un service, le paramètre désigne le service ou les propriétés permettant à Android de
l'identifier
 getIntent() renvoie l'objet de classe Intent associé à l'activité lors de son lancement
 setResult(int) Utilisé par l'activitée appelée pour renvoyer un code de résultat à l'activité appelante
 setResult(int, Intent) comme la précédente, le paramètre supplémentaire est un Intent contenant les valeurs de retour
qui sera également renvoyé.
 onActivityResult(int, int, Intent) cette méthode de l'activité appelante est exécutée lorsqu'une activité lancée se termine,
le 1er paramètre est le numéro associé à cette activité lors de son lancement, le deuxième est le code de retour de cette
activité, le dernier est l'Intent de retour de cette activité
19/01/2021 Adil JEGHAL 32
Manifeste
Une application est décrite par un fichier XML appelé AndroidManifest. Ce fichier permet d'indiquer :
 Le SDK utilisé par une balise uses-sdk
 Les permissions : une balise uses-permission par autorisation demandée
 Les activités de l'application : une balise activity pour chaque activité contenant chacune une ou plusieurs balises
intent-filter
 Les services de l'application : une balise service pour chaque service contenant chacune une ou plusieurs balises
intent-filter
 les écouteurs d'intentions diffusées : une balise receiver pour chaque écouteur contenant chacune une ou plusieurs
balises intent-filter
 Les fournisseurs de contenu : une balise provider pour chaque activité
 Les bibliothèques utilisées : une balise uses-library pour chaque bibliothèque
19/01/2021 Adil JEGHAL 33
Manifeste
Chaque activité constituant une application doit être décrite par une balise <activity>. La balise minimale de l'activité
principale est de la forme :
Activités
 name qui désigne la classe de l'activité
 label qui désigne le nom sous lequel elle apparaîtra sur le terminal
 icon qui désigne l'icône à afficher sur le terminal
19/01/2021 Adil JEGHAL 34
Manifeste
La balise <intent-filter> permet d'indiquer ce que fait l'activité (on parle d'intension). Elle sera utilisée par Android pour
rechercher une activité pouvant répondre à une spécification donnée (cette spécification lui sera fournie dans un objet de
classe Intent). La forme générale de la balise <intent-filter> est la suivante:
Activités
 Action qui indique le type d’action effectuée par l'activité (par exemple affichage, édition …)
 Category qui indique la catégorie d’action (par exemple CATEGORY_BROWSABLE indique une activité qui peut être
appelée par un navigateur)
 Data qui indique le type de données transmises à l’activité lancée ou le type de réponse attendu ainsi que le protocole
(http, content, file …)
<intent-filter>
<action android:name=“nom_d_action_1“ />
<category android:name=“nom_de_categorie_1“ />
<data android:mimeType=“nom_de_type_mime“
android:scheme=“protocole://hote:port/chemin“ />
</intent-filter>
19/01/2021 Adil JEGHAL 35
Manifeste
Activités
 Actions
• android.intent.action.VIEW affichage de données
• android.intent.action.EDIT affichage de données pour édition par l’utilisateur
• android.intent.action.MAIN activité principale d’une application
• android.intent.action.CALL appel téléphonique
• android.intent.action.WEB_SEARCH recherche sur le WEB
 Catégories
• android.intent.category.LAUNCHER activité proposée au lancement par Android
• android.intent.category.DEFAULT activité pouvant être lancée explicitement
• android.intent.category.BROWSABLE peut afficher une information désignée par un lien
• android.intent.category.TAB activité associée dans un onglet d’interface (TabHost)
19/01/2021 Adil JEGHAL 36
Manifeste
Permissions
Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses-
permission>. Les principales permissions sont :
Géolocalisation (GPS)
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
Accès aux données personnelles
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS" />
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS" />
19/01/2021 Adil JEGHAL 37
Manifeste
Permissions
Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses-
permission>. Les principales permissions sont :
Modification de paramètres
<uses-permission android:name="android.permission.SET_ORIENTATION" />
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
Téléphonie
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
Audio
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
19/01/2021 Adil JEGHAL 38
Manifeste
Permissions
Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses-
permission>. Les principales permissions sont :
Envoi et réception de SMS/MMS
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
19/01/2021 Adil JEGHAL 39
Manifeste
Permissions
Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses-
permission>. Les principales permissions sont :
Réseau
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Access au matériel
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
19/01/2021 Adil JEGHAL 40
Les Activités Android
19/01/2021 Adil JEGHAL 41
Les Activités Android
Exercice 1
Ecrire une application pour découvrir manuellement le cycle de vie d’une activité
19/01/2021 Adil JEGHAL 42
Ressources
Le répertoire res contient toutes les ressources qui seront mises dans le fichier application (apk). Il est constitué de sous
répertoires :
 drawable-hdpi (images en haute définition)
 drawable-ldpi (images en basse définition)
 drawable-mdpi (images en moyenne définition)
 layout (description en XML des interfaces)
 values (définitions en XML de valeurs : chaînes, tableaux, valeurs numériques …)
 anim (description en XML d’animations)
 menu (description en XML de menus pour l’application)
 xml (fichiers XML utilisés directement par l’application)
 raw (tous les autres types de ressources : fichiers texte, vidéo, son …)
Répertoires des ressources
19/01/2021 Adil JEGHAL 43
Ressources
Classe de référencement des ressources:
Android Studio (Eclipse) explore les fichiers contenus dans les sous-répertoires de res et génère une classe (appelée R)
dans laquelle un identifiant est créé pour chacun des éléments trouvés :
• Fichiers (images, textes ..) placés dans drawable-xxxx , raw et xml
• Eléments d'interface définis dans les fichiers placés dans layout et menu
• Valeurs définies dans les fichiers placés dans values
• Animations définies dans les fichiers placés dans anim
On pourra ensuite, dans la plupart des méthodes, désigner ces ressources par leur identifiant dans cette classe R sous la
forme : R.type.nom.
Classe R
19/01/2021 Adil JEGHAL 44
Ressources
Référencement d’une ressource dans un fichier XML
On référence une resource dans un fichier XML par :
"@[paquetage:]type/identificateur"
Par exemple : @string/machaine fait référence à une chaîne décrite dans un fichier XML placé dans le répertoire
res/values (le nom de ce fichier n'a aucune importance) et définie par :
<string name="machaine">contenu de cette chaine</string>
Utilisation de ressources
19/01/2021 Adil JEGHAL 45
Ressources
Récupération d’une ressource dans le code (la classe Resources)
Dans le code les ressources sont désignées par leur identifiant dans la classe R de la forme : R.type.nom. Certaines
méthodes acceptent cette désignation comme paramètre pour accéder à la ressource.
On obtient une instance de la classe Resources par la méthode getResources() de l’activité. On accède ensuite aux
ressources grâce aux méthodes de cet objet qui acceptent en paramètre un identifiant de la forme R.type.nom, ces
méthodes sont :
• boolean getBoolean(int) renvoie le booléen désigné
• int getInteger(int) renvoie l'entier désigné
• int[] getIntArray(int) renvoie le tableau d'entiers désigné
• etc.
Par exemple : String titre = getResources().getString(R.string.texte_titre); permet de récupérer la chaîne définie dans un
fichier XML par : <string name="texte_titre">…..</string>
Utilisation de ressources
19/01/2021 Adil JEGHAL 46
Uri
Pour créer une Uri faisant référence à une ressource sur Internet :
Uri ressource = Uri.parse("http://domaine.sous_doamine/chemin/nom_du_fichier");
Ressource sur Internet
Les Uri sont un moyen utilisé pour désigner des ressources que ce soit sur Internet ou localement
Pour créer une Uri faisant référence à une ressource embarquée :
Uri ressource = Uri.parse("android.resource://nom_du_paquetage_de_l_activité/" + R.chemin.app1);
Ressource locale
19/01/2021 Adil JEGHAL 47
Interfaces
La mise en place d’une interface peut se faire de deux façons:
• Par description de l’interface dans un fichiers XML
• Par programme
Les fichiers XML qui décrivent une interface sont placés dans le répertoire res/layout.
Ils sont référencés par R.layout.nom_du_fichierXML.
Les activités peuvent utiliser la méthode setContentView(R.layout.nom_du_fichierXML) pour
mettre en place l'interface décrite par un tel fichier.
19/01/2021 Adil JEGHAL 48
Interfaces
Propriétés des interfaces
Lorsque l'on indique des unités dans les fichiers XML elles peuvent l'être de plusieurs façons :
 en pixels (faire suivre la valeur de px)
 relativement à la taille de la fonte de caractères (faire suivre la valeur de sp)
 en millimètres (faire suivre la valeur de mm)
 en pouces (faire suivre la valeur de in)
 en points = 1/72 pouce (faire suivre la valeur de pt)
 en pixels à densité indépendante valent 1 pixel pour un écran de 160 dpi (faire suivre la valeur de dp)
Les unités
19/01/2021 Adil JEGHAL 49
Interfaces
Elles sont définies par un code hexadécimal indiquant la transparence et les composantes (RVB) sous la forme
"#AARRVVBB" où :
 AA est la transparence (00 totalement transparent). Si le code de couleur ne comporte que 3 composantes
AA est considéré comme FF c'est-à-dire que #44FA8B est équivalent à #FF44FA8B
 RR VV et BB sont, respectivement, les composantes rouge, verte et bleue
Les couleurs
Propriétés des interfaces
19/01/2021 Adil JEGHAL 50
Interfaces
Propriétés positionnables en XLM
Un identifiant peut être associé à chaque élément décrit dans un fichier XML, cet identifiant permet d'accéder à
l'objet créé dans le code. Les éléments ne devant pas être accédés dans le code peuvent ne pas avoir d'identifiant.
android:id="@+id/monident" permettra de retrouver cet élément par findViewById(R.id.monident).
Identifiant
android:clickable="b" (où b vaut true ou false).
android:longClickable="b" (où b vaut true ou false)
Evénements
19/01/2021 Adil JEGHAL 51
Interfaces
Propriétés positionnables en XLM
android:visibility="x" (les valeurs possibles pour x sont : visible, invisible ou gone)
Avec invisible la place est conservée, avec gone la place n'est pas conservée.
Visibilité
android:background="couleur" pour définir une couleur
android:background="@drawable/monimage" pour utiliser une image. L'image est placée dans res/drawable-
xxxx/ et s'appelle monimage.t (où t est png, jpg, ou gif).
Fond
19/01/2021 Adil JEGHAL 52
Interfaces
Propriétés positionnables en XLM
android:minHeight="unité" définit la hauteur minimale si possible
android:minWidth="unité" définit la largeur minimale si possible
android:paddingBottom="unité" marge interne en bas
android:paddingLeft="unité" marge interne à gauche
android:paddingRight="unité" marge interne à droite
android:paddingTop="unité" marge interne en haut
Taille et marges internes
19/01/2021 Adil JEGHAL 53
Interfaces
Propriétés positionnables en XLM
android:fadeScrollbars="b" où b vaut true ou false selon que l'on souhaite que les ascenseurs disparaissent ou pas
lorsqu'ils ne sont pas utilisés.
android:scrollbarDefaultDelayBeforeFade="x" où x est un entier qui définit le délai (en ms) avant que les
ascenseurs non utilisés ne disparaissent
android:scrollbarFadeDuration="x" où x est un entier qui définit la durée d'effacement des ascenseurs (en ms)
Ascenseurs
19/01/2021 Adil JEGHAL 54
Interfaces
Méthodes de la classe View
View(Context) le paramètre est généralement l'activité elle-même
Construction
setLayoutParams(ViewGroup.LayoutParams) permet de définir le placement des objets dans la vue. Le paramètre
de cette méthode est généralement new ViewGroup.LayoutParams(l, h) où l définit la largeur et h la hauteur. Les
valeurs pour l et h peuvent être exprimées en pixels ou prendre les valeurs :
ViewGroup.LayoutParams.WRAP_CONTENT pour adapter la taille au contenu
ViewGroup.LayoutParams.FILL_PARENT pour adapter la taille à la place disponible.
Placement
19/01/2021 Adil JEGHAL 55
Interfaces
Méthodes de la classe View
bringToFront() met la vue en premier plan
getLeft() renvoie la position en pixels de la gauche de la vue
getTop() renvoie la position en pixels du haut de la vue
getRight() renvoie la position en pixels de la droite de la vue
getBottom() renvoie la position en pixels du bas de la vue
Position
19/01/2021 Adil JEGHAL 56
Interfaces
Méthodes de la classe View
getWidth()renvoie la largeur de la vue en pixels
getHeight()renvoie la hauteur de la vue en pixels
setPadding(int, int, int, int) définit les marges (en pixels). Les paramètres sont, dans l'ordre : gauche, haut, droite, bas.
getPaddingLeft()renvoie la marge gauche (en pixels).
getPaddingTop()renvoie la marge haute (en pixels).
getPaddingRight()renvoie la marge droite (en pixels).
getPaddingBottom()renvoie la marge basse (en pixels)
Taille et marges internes
19/01/2021 Adil JEGHAL 57
Interfaces
Méthodes de la classe View
setBackgroundColor(int) définit la couleur du fond
setBackgroundDrawable(Drawable) définit une image de fond
setBackgroundResource(int) définit le fond à partir d'un identificateur de ressource
Fond
requestLayout() provoque un rafraichissement des positions des éléments de la vue
invalidate() provoque un rafraichissement de la vue
Rafraichissement
19/01/2021 Adil JEGHAL 58
Interfaces
Méthodes de la classe View
setOnClickListener(OnClickListener) associe un écouteur d'événements aux clics sur la vue
setOnLongClickListener(OnLongClickListener) associe un écouteur d'événements aux clics longs sur la vue
setOnKeyListener(OnKeyListener) associe un écouteur d'événements aux actions clavier sur la vue
setOnTouchListener(OnTouchListener) associe un écouteur d'événements aux touchés sur la vue
Evenements
isFocusable() renvoie true si la vue peut prendre le focus
setFocusable(boolean) fait ou pas prendre le focus à la vue
isFocusableInTouchMode()renvoie true si la vue peut prendre le focus lorsqu'elle est touchée
setFocusableInTouchMode(boolean) autorise ou non la vue a prendre le focus lorsqu'elle est touchée
Focus
19/01/2021 Adil JEGHAL 59
Interfaces
Méthodes de la classe ViewGroup
ViewGroup(Context) le paramètre est généralement l'activité elle-même
Construction
addView(View) ajoute un élément au groupe
getChildCount() renvoie le nombre d'éléments du groupe
getFocusedChild() renvoie l'élément qui a actuellement le focus (objet de classe View)
removeView(View) enlève un élément du groupe
removeAllViews() enlève tous les éléments du groupe
Eléments du groupe
setPadding(int, int, int, int) définit les marges (en pixels). Les paramètres sont, dans l'ordre : gauche, haut, droite,
bas.
Marges
19/01/2021 Adil JEGHAL 60
TP 2
19/01/2021 Adil JEGHAL 61
19/01/2021 Adil JEGHAL 62
Intents
Les Intents permettent de gérer l'envoi et la réception de messages afin de faire coopérer les
applications. Le but des Intents est de déléguer une action à un autre composant, une autre application
ou une autre activité de l'application courante.
Un objet Intent contient les information suivantes:
• le nom du composant ciblé (facultatif)
• l'action à réaliser, sous forme de chaine de caractères
• les données: contenu MIME et URI
• des données supplémentaires sous forme de paires clef/valeur
• une catégorie pour cibler un type d'application
• des drapeaux (informations supplémentaires)
On peut envoyer des Intents informatifs pour faire passer des messages. Mais on peut aussi envoyer des
Intents servant à lancer une nouvelle activité
19/01/2021 Adil JEGHAL 63
Intents
Intent login = new Intent(getApplicationContext(), GiveLogin.class);
startActivity(login);
Intents pour une nouvelle activité
S'il s'agit de passer la main à une autre application, on donne au constructeur de l'Intent les données et
l'URI cible: l'OS est chargé de trouver une application pouvant répondre à l'Intent.
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Uri telnumber = Uri.parse("tel:0666145265");
Intent call = new Intent(Intent.ACTION_DIAL, telnumber);
startActivity(call);
}});
19/01/2021 Adil JEGHAL 64
Intents
Intent callactivity2 = new Intent(getApplicationContext(), Activity2.class);
callactivity2.putExtra("login", "jfl");
startActivity(callactivity2);
Ajouter des informations
Les Intent permettent de transporter des informations à destination de l'activité cible. On appelle ces
informations des Extra: les méthodes permettant de les manipuler sont getExtra et putExtra. Lorsqu'on
prépare un Intent et que l'on souhaite ajouter une information de type "clef -> valeur" on procède ainsi:
Bundle extras = getIntent().getExtras();
String s = new String(extras.getString("login"));
Du côté de l'activité recevant l'Intent, on récupère l'information de la manière suivante:
19/01/2021 Adil JEGHAL 65
Intents
Intent broadcast = new Intent("andro.jf.broadcast");
broadcast.putExtra("extra", "test");
sendBroadcast(broadcast);
Broadcaster des informations
Il est aussi possible d'utiliser un objet Intent pour broadcaster un message à but informatif. Ainsi, toutes
les applications pourront capturer ce message et récupérer l'information.
Bundle extra = intent.getExtras();
String val = extra.getString("extra");
La méthode putExtra permet d'enregistrer une paire clef/valeur dans l'Intent. On peut récupérer les
données à l'aide de la méthode getExtras dans l'objet Bundle qui est dans l'Intent:
19/01/2021 Adil JEGHAL 66
Persistance des données
Android fournit plusieurs méthodes pour faire persister les données applicatives:
 la persistance des données de l'activité (cf Le SDK Android)
La persistance des données des activités est géré par l'objet Bundle qui permet de restaurer les View qui possède un
id.
 un mécanisme de sauvegarde clé/valeur, utilisé pour les fichiers de préférences (appelé préférences
partagées)
 des entrées sorties de type fichier
 une base de donnée basé sur SQLite
Différentes persistances
19/01/2021 Adil JEGHAL 67
Persistance des données
La classe SharedPreferences permet de gérer des paires de clé/valeurs associées à une activité. On
récupère un tel objet par l'appel à getPreferences:
Préférences partagées
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
String nom = prefs.getString("login", null);
Long nom = prefs.getLong("taille", null);
La méthode getPreferences(int) appelle en fait getPreferences(String, int) à partir du nom de la classe de
l'activité courante. Le mode MODE_PRIVATE restreint l'accès au fichier créé à l'application. Les modes
d'accès MODE_WORLD_READABLE et MODE_WORLD_WRITABLE permettent aux autres applications de
lire/écrire ce fichier.
19/01/2021 Adil JEGHAL 68
Persistance des données
Une activité spécifique a été programmée pour réaliser un écran d'édition de préférences. Il s'agit de
PreferenceActivity. A partir d'une description XML des préférences, la classe permet d'afficher un écran
composé de modificateurs pour chaque type de préférences déclarées.
Voici un exemple de déclarations de préférences XML, à stocker dans res/xml/preferences.xml
Préférences partagées: Représentation XML d'un menu de préférences
19/01/2021 Adil JEGHAL 69
Persistance des données
Pour afficher l'écran d'édition des préférences correspondant à sa description XML, il faut créer une
nouvelle activité qui hérite de PreferenceActivity et simplement appeler la méthode
addPreferencesFromResource en donnant l'id de la description XML.
Pour lancer cette activité, on crée un bouton et un Intent correspondant.
Préférences partagées: Activité d'édition de préférences
19/01/2021 Adil JEGHAL 70
Persistance des données
Les attributs suivants sont utiles:
 android:title: La string apparaissant comme nom de la préférence
 android:summary: Une phrase permettant d'expliciter la préférence
 android:key: La clef pour l'enregistrement de la préférence
Pour accéder aux valeurs des préférences, on utiliser la méthode getDefaultSharedPreferences sur la
classe PreferenceManager. C'est la clef spécifiée par l'attribut android:key qui est utilisée pour récupérer
la valeur choisie par l'utilisateur.
Préférences partagées: Attributs des préférences
19/01/2021 Adil JEGHAL 71
Persistance des données
Une case à cocher se fait à l'aide de CheckBoxPreference:
Un champs texte est saisi via EditTextPreference:
Préférences partagées: toggle et texte
19/01/2021 Adil JEGHAL 72
Persistance des données
Il est aussi possible d'écraser des préférences par le code, par exemple si une action fait changer le paramétrage de
l'application ou si l'on reçoit le paramétrage par le réseau.
L'écriture de préférences est plus complexe: elle passe au travers d'un éditeur qui doit réaliser un commit des
modifications
Préférences partagées: Ecriture de préférences
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putString("login", "jf");
editor.commit();
19/01/2021 Adil JEGHAL 73
Persistance des données
Lecture/écriture de données dans un fichier, dans l’espace de stockage interne associé à l’application
 API pour création/écriture/lecture
 Données privées
 Non visible par l’utilisateur
 Destruction à la suppression de l’application
Stockage interne
19/01/2021 Adil JEGHAL 74
Persistance des données
Création et écriture dans un fichier
• L’appel à openFileOutput sur l’activité ou le contexte retourne une référence sur le flux d’écriture dans le fichier
(créé si inexistant)
cf. FileOutputStream
Lecture dans un fichier
• L’appel à openFileInput sur l’activité ou le contexte retourne une référence sur le flux de lecture dans le fichier
cf. FileInputStream
• L’appel à openRawInput(resId sur l’activité ou le contexte retourne une référence sur le flux de lecture dans le
fichier en lecture seule
Stockage interne
19/01/2021 Adil JEGHAL 75
Persistance des données
Stockage interne
OutputStreamWriter out = new OutputStreamWriter(
openFileOutput(FIILE_NAME, MODE));
InputStream inputStream = openFileInput(FIILE_NAME);
BufferedReader reader = new BufferedReader(new
InputStreamReader(inputStream));
19/01/2021 Adil JEGHAL 76
Persistance des données
SQLite
 Exercice 1: (Gestion des utilisateurs )
 Exercice 2 (Gestion de bibliothèque )
19/01/2021 Adil JEGHAL 77
Connectivité
Téléphonie
Réseau
Bluetooth
Localisation
Capteurs
Caméra
19/01/2021 Adil JEGHAL 78
Connectivité
Téléphonie
Les fonctions de téléphonie sont relativement simples à utiliser. Elles permettent de récupérer l'état de la
fonction de téléphonie (appel en cours, appel entrant, ...), d'être notifié lors d'un changement d'état, de passer
des appels et de gérer l'envoi et réception de SMS.
L'état de la téléphonie est géré par la classe TelephonyManager qui permet de récupérer le nom de
l'opérateur, du téléphone, et l'état du téléphone. Pour lire ces informations, il est nécessaire de disposer de la
permission android.permission.CALL_PHONE.
TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
int etat = tel.getCallState();
if (etat == TelephonyManager.CALL_STATE_IDLE)
// RAS
if (etat == TelephonyManager.CALL_STATE_RINGING)
// Le téléphone sonne
19/01/2021 Adil JEGHAL 79
Connectivité
Téléphonie
Il est aussi possible d'être notifié d'un changement d'état en utilisant un écouteur:
public class Ecouteur extends PhoneStateListener {
public void onCallStateChanged(int etat, String numero) {
super.onCallStateChanaged(etat, numero)
if (etat == TelephonyManager.CALL_STATE_OFFHOOK)
// Le téléphone est utilisé
}
19/01/2021 Adil JEGHAL 80
Connectivité
Téléphonie: Passer un appel
Cette action étant réalisée avec un Intent (attention aux permission)
Uri telnumber = Uri.parse("tel:0666666666");
Intent call = new Intent(Intent.ACTION_CALL, telnumber);
startActivity(call);
Les applications qui peuvent passer des appels doivent filtrer ce type d'Intent pour pouvoir être invoquée
lorsque l'Intent est lancé
<receiver android:name=".ClasseGerantLAppel">
<intent-filter>
<action android:name="Intent.ACTION_CALL"/>
</intent-filter>
</receiver>
19/01/2021 Adil JEGHAL 81
Connectivité
Téléphonie: Envoyer et recevoir des SMS
Si la permission android.permission.SEND_SMS est disponible, il est possible d'envoyer des SMS au travers de
SmsManager:
SmsManager manager = SmsManager.getDeault();
manager.sendTextMessage(" 0666666666 ", null, “Salut !", null, null);
Inversement, il est possible de créer un filtre d'Intent pour recevoir un SMS qui sera géré par un broadcast
receiver. L'action à préciser dans le filtre d'Intent du receveur est android.provider.Telephony.SMS_RECEIVED:
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
19/01/2021 Adil JEGHAL 82
Connectivité
Téléphonie: Envoyer et recevoir des SMS
public final class MyBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if
(intent.getAction().equals(android.provider.Telephony.SMS_RECEIVED))
{
String val = extra.getString("extra");
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i=0; i < pdus.length; i++)
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}}}
19/01/2021 Adil JEGHAL 83
Connectivité
Réseau
Le réseau peut être disponible ou indisponible, suivant que le téléphone utilise une connexion Wifi, 3G,
bluetooth, etc. Si la permission android.permission;ACCESS_NETWORK_STATE est déclarée, la classe NetworkInfo
(depuis ConnectivityManager) permet de lire l'état de la connexion réseau parmi les constantes de la classe
State: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED, SUSPENDED, UNKNOWN.
ConnectivityManager manager =
(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo net = manager.getActiveNetworkInfo();
if (net.getState().compareTo(State.CONNECTED)
// Connecté
• ConnectivityManager.TYPE_MOBILE: connexion mobile
• ConnectivityManager.TYPE_WIFI: wifi
19/01/2021 Adil JEGHAL 84
Connectivité
Réseau
Le basculement entre les types de connexion est possible si la permission WRITE_SECURE_SETTINGS est
disponible. On utilise alors la méthode setNetworkPreference sur l'objet ConnectivityManager pour lui donner
l'entier correspondant au type de connexion voulu. Par exemple:
manager.setNetworkPreference(ConnectivityManager.TYPE_WIFI);
L'accès au réseau wifi est gérable depuis une application, ce qui permet d'allumer ou de couper le wifi. L'objet
WifiManager permet de réaliser cela.
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (!wifi.isWifiEnabled())
wifi.setWifiEnabled(true);
19/01/2021 Adil JEGHAL 85
Connectivité
Bluetooth
Le bluetooth se gère au travers de principalement 3 classes:
• BluetoothAdapter: similaire au WifiManager, cette classe permet de gérer les autres appareils bluetooth et
d'initier les communications avec ceux-ci.
• BluetoothDevice: objet représentant l'appareil distant.
• BluetoothSocket et BluetoothServerSocket: gère une connexion établie.
Pour pouvoir utiliser les fonctionnalités bluetooth, il faut activer les permissions android.permission.BLUETOOTH
et android.permission.BLUETOOTH_ADMIN pour pouvoir chercher des appareils ou changer la configuration
bluetooth du téléphone.
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
if (!bluetooth.isEnabled())
{Intent launchBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(launchBluetooth);}
19/01/2021 Adil JEGHAL 86
Connectivité
Bluetooth: S'associer en bluetooth
Pour pouvoir associer deux appareils en bluetooth, il faut que l'un d'eux soit accessible aux autres appareils. Pour
cela, l'utilisateur doit autoriser le mode "découverte". L'application doit donc le demander explicitement via un
Intent:
Intent discoveryMode = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoveryMode.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 60);
startActivity(discoveryMode);
19/01/2021 Adil JEGHAL 87
Connectivité
Bluetooth: S'associer en bluetooth
A l'inverse, si un appareil externe diffuse une annonce de découverte, il faut capturer les intents recus en
broadcast dans le mobile:
public final class BluetoothBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice appareil = null;
if (action.equals(BluetoothDevice.ACTION_FOUND))
appareil = (BluetoothDevice)intent.getParcelableExtra(
BluetoothDevice.EXTRA_DEVICE);
}
}
19/01/2021 Adil JEGHAL 88
Connectivité
Bluetooth: S'associer en bluetooth
Enfin les appareils associés se parcourent à l'aide d'un Set<BluetoothDevice>:
Set<BluetoothDevice> s = bluetooth.getBondedDevices();
for (BluetoothDevice ap : s)
Toast.makeText(getApplicationContext(), "" + ap.getName(),
Toast.LENGTH_LONG).show();

Contenu connexe

Similaire à cours.pdf

01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)TECOS
 
Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016Hadina RIMTIC
 
cours-android.pdf
cours-android.pdfcours-android.pdf
cours-android.pdfmed_univ78
 
chapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdfchapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdfolfaharrabi2
 
Ch1. Développement mobile
Ch1. Développement mobileCh1. Développement mobile
Ch1. Développement mobileHaifa Chorfi
 
Chapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-androidChapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-androidSalah Gharbi
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contactJasmine Conseil
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contactJasmine Conseil
 
Android pour les debutants
Android pour les debutantsAndroid pour les debutants
Android pour les debutantsAmira Hakim
 
Présentation et Initiative pour le développement Android
Présentation et Initiative pour le développement AndroidPrésentation et Initiative pour le développement Android
Présentation et Initiative pour le développement Androidyounes ben tlili
 
Ateliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceAteliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceKorteby Farouk
 

Similaire à cours.pdf (20)

01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)01 programmation mobile - android - (introduction)
01 programmation mobile - android - (introduction)
 
Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016Android workshop - Bootcamp du Mauriapp Challenge 2016
Android workshop - Bootcamp du Mauriapp Challenge 2016
 
cours-android.pdf
cours-android.pdfcours-android.pdf
cours-android.pdf
 
Architecture android
Architecture androidArchitecture android
Architecture android
 
chapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdfchapitre-1-introduction-plateforme-android (2).pdf
chapitre-1-introduction-plateforme-android (2).pdf
 
Ch1. Développement mobile
Ch1. Développement mobileCh1. Développement mobile
Ch1. Développement mobile
 
Chapitre 4 sem
Chapitre 4 semChapitre 4 sem
Chapitre 4 sem
 
Chapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-androidChapitre 1-introduction-plateforme-android
Chapitre 1-introduction-plateforme-android
 
android.pdf
android.pdfandroid.pdf
android.pdf
 
Android
AndroidAndroid
Android
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
 
Android Studio, premier contact
Android Studio, premier contactAndroid Studio, premier contact
Android Studio, premier contact
 
Chap android
Chap androidChap android
Chap android
 
Développement Sous Android
Développement Sous AndroidDéveloppement Sous Android
Développement Sous Android
 
Cours android
Cours androidCours android
Cours android
 
Cours Android
Cours AndroidCours Android
Cours Android
 
INF355_Lecon1.pdf
INF355_Lecon1.pdfINF355_Lecon1.pdf
INF355_Lecon1.pdf
 
Android pour les debutants
Android pour les debutantsAndroid pour les debutants
Android pour les debutants
 
Présentation et Initiative pour le développement Android
Présentation et Initiative pour le développement AndroidPrésentation et Initiative pour le développement Android
Présentation et Initiative pour le développement Android
 
Ateliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceAteliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open source
 

Plus de merazgaammar2

presentation pour nouvrlle technologie.ppt
presentation pour nouvrlle technologie.pptpresentation pour nouvrlle technologie.ppt
presentation pour nouvrlle technologie.pptmerazgaammar2
 
chapitres 3 technologies de communication de l'IoT partie II.pptx
chapitres  3 technologies de communication de l'IoT partie II.pptxchapitres  3 technologies de communication de l'IoT partie II.pptx
chapitres 3 technologies de communication de l'IoT partie II.pptxmerazgaammar2
 
Deploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfDeploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfmerazgaammar2
 
cours-transmission-serie.pdf
cours-transmission-serie.pdfcours-transmission-serie.pdf
cours-transmission-serie.pdfmerazgaammar2
 

Plus de merazgaammar2 (7)

presentation pour nouvrlle technologie.ppt
presentation pour nouvrlle technologie.pptpresentation pour nouvrlle technologie.ppt
presentation pour nouvrlle technologie.ppt
 
chapitres 3 technologies de communication de l'IoT partie II.pptx
chapitres  3 technologies de communication de l'IoT partie II.pptxchapitres  3 technologies de communication de l'IoT partie II.pptx
chapitres 3 technologies de communication de l'IoT partie II.pptx
 
TP7_Master.pdf
TP7_Master.pdfTP7_Master.pdf
TP7_Master.pdf
 
TP7_Master.pdf
TP7_Master.pdfTP7_Master.pdf
TP7_Master.pdf
 
TP_Semaine2.pdf
TP_Semaine2.pdfTP_Semaine2.pdf
TP_Semaine2.pdf
 
Deploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdfDeploiement_Lora_exo.pdf
Deploiement_Lora_exo.pdf
 
cours-transmission-serie.pdf
cours-transmission-serie.pdfcours-transmission-serie.pdf
cours-transmission-serie.pdf
 

cours.pdf

  • 1. 19/01/2021 Adil JEGHAL 1 Programmation Mobile: Android Pr. Adil JEGHAL adil.jeghal@usmba.ac.ma
  • 2. 19/01/2021 Adil JEGHAL 2 Introduction Objectif du Cours Comprendre l’architecture du système Android Comprendre l’organisation d’une application Android Développer et déployer des applications natives Android
  • 3. 19/01/2021 Adil JEGHAL 3 Introduction Pré requis Programmation Orienté Objet JAVA XML
  • 4. 19/01/2021 Adil JEGHAL 4 Introduction Un périphérique mobile c'est quoi ? Un écran très petit Pas de clavier/souris Pas de disque dur Fonctionne sur batterie Moyens de communication variés  L’interface graphique devra être la plus simple possible  Mémoire allouée à une application est de l’ordre de quelques mégabytes  une seule application peut être visible à la fois
  • 5. 19/01/2021 Adil JEGHAL 5 Introduction Android: c’est quoi? Un système d'exploitation open source pour Smartphones, et terminaux mobiles Conçu par Android, une startup rachetée par Google, et annoncé officiellement le 5 novembre 2007 C’est aujourd’hui le système d’exploitation mobile le plus utilisé à travers le monde
  • 6. 19/01/2021 Adil JEGHAL 6 Introduction Historique des versions
  • 7. 19/01/2021 Adil JEGHAL 7 Plateforme Android Le système d’exploitation Android est basé sur Linux. Au plus bas niveau de ce système se trouve un noyau Linux destiné à la gestion du matériel comme : Drivers de ces terminaux, La gestion de la mémoire, La gestion des processus L’accès au réseau …
  • 8. 19/01/2021 Adil JEGHAL 8 Plateforme Android Architecture de la plateforme Produit final, ce que l’utilisateur voit, ce qui lui permet d’interagir avec le système Interface permettant aux développeurs de dialoguer avec les librairies basiques d’Android Middleware ecrit en C++, Librairies natives de Android manipulant le materiel La machine virtuelle d’Android Ensemble de classe utilisés par la machine virtuelle Noyau Linux pour la gestion et la configuration du materiel
  • 9. 19/01/2021 Adil JEGHAL 9 Le kit de développement Android Les kits de développement  Google fournit, en plus du système d’exploitation, un kit de développement Java (SDK) comprenant: • des API (interfaces de programmation) ; • des exemples de code ; • de la documentation ; • des outils – parmi lesquels un émulateur – permettant de couvrir quasiment toutes les étapes du cycle de développement d’une application.  Google fournit le NDK (Native Developper Kit) pour développer des applications en C/C++  L'ADK (Accessory Development Kit) permet de développer des applications pour des extensions électroniques  Le SDK Android est disponible gratuitement sur le site de Google
  • 10. 19/01/2021 Adil JEGHAL 10 Les Applications Android Composants d’une application  Activités  Services  Fournisseurs de contenus  Gadgets  Objets Intent  Récepteurs d’Intents  Notifications
  • 11. 19/01/2021 Adil JEGHAL 11 Les Applications Android Quelques concepts importants  Les vues: • Ce sont des éléments de l’interface graphique que l’utilisateur voit et sur lesquels il pourra agir. • Les vues contiennent des composants, organisés selon diverses mises en page (les uns à la suite des autres, en grille…)  Les contrôles: • Représentent un sous-ensembles de vues, par exemple: boutons, champs de saisie, case à cocher, etc. • Ils ont besoin d’accéder aux textes et aux images qu’ils affichent (à partir des fichiers ressources de l’application)  Les activités: • Ce sont des écrans structurés par un ensemble de vues et de contrôles composant leur interface de façon logique. • Une activité est composée d’une hiérarchie de vues contenant elles-mêmes d’autres vues. • Une application comportant plusieurs écrans, possédera donc autant d’activités.
  • 12. 19/01/2021 Adil JEGHAL 12 Les Applications Android Quelques concepts importants  Le fichier de configuration - AndroidManifest.xml : C’est un fichier indispensable à chaque application qui décrit entre autres : • le point d’entrée de votre application (quel code doit être exécuté au démarrage de l’application) ; • quels composants constituent ce programme ; • les permissions nécessaires à l’exécution du programme (accès à Internet, accès à l’appareil photo...).
  • 13. 19/01/2021 Adil JEGHAL 13 Les Applications Android Composants applicatifs Activité •Standard de l'application sous Android •Possède une IHM •Toutes les activités dérivent de la classe mère Activity Service •Composant qui fonctionne en tâche de fond, de manière invisible. •Principales utilisations: tâches de fond, répétitives, qui n'ont pas besoin d'interaction directe avec l'utilisateur (téléchargement, mise à jour, Web service, etc.) Broadcast Receiver •Réagit en fonction des messages diffusés par le système Android •Le système de gestion de l'énergie diffuse l'état de la batterie •Les classes d'application héritent de la classe BroadcastReceiver Fournisseur de contenus •Propose des contenus à l'ensemble des activités et services •Demande le plus de lignes de code, permet le partage des données entre toutes les applications
  • 14. 19/01/2021 Adil JEGHAL 14 Les Applications Android Eléments d’interaction Objet Intent •Permet aux applications de fournir ou demander des services ou des données. •La transmission se fait à travers tout le système et peut cibler précisément une activité ou un service. Récepteur d’intentions •Permet à une application d’être à l’écoute des autres afin de répondre aux objets Intent qui lui sont destinés et qui sont envoyés par d’autres composants applicatifs. Filtre d’intentions •Lorsqu'un objet Intent ne mentionne pas explicitement un composant cible, les filtres des applications cibles sont comparés à l’objet Intent. Notifications •Signale une information à l’utilisateur sans interrompre ses actions en cours.
  • 15. 19/01/2021 Adil JEGHAL 15 Les Applications Android Permissions  Certaines opérations sont réalisables à condition d’en obtenir la permission.  Ces actions sont de plusieurs formes : • Opérations pouvant entraîner un surcoût (connexion, échange de données, envoi de SMS parexemple) • Utilisation de données personnelles (accès à vos contacts, à votre compte Google…) • Accès au matériel du téléphone (écriture sur la carte mémoire...).  L’utilisation de permissions doit être déclarée dans le fichier de configuration de l’application.  À l’installation de l’application, l’utilisateur disposera d’un récapitulatif de toutes les permissions demandées
  • 16. 19/01/2021 Adil JEGHAL 16 Les Applications Android Cycle de vie d’une application  Les applications Android réagissent à des changements d’états imposés par le système (démarrage, pause, reprise, arrêt). • Elles n’ont aucun contrôle direct sur leur propre cycle de vie. • C’est le système qui peut mettre en pause ou arrêter une activité, si nécessaire.  Chaque application fonctionne dans son propre processus. • Le système Android est responsable de la création et de la destruction des processus et gère ses ressources avec comme objectifs: la sécurité, la disponibilité et la réactivité de l’appareil. • Un processus peut être tué à n’importe quel moment, sans son consentement, pour libérer des ressources nécessaires à d’autres applications.  La priorité du processus donnée par le système détermine leur ordre d’arrêt • La priorité de l’application est déterminée par son composant le plus prioritaire (une application possédant un fournisseur de contenu a par exemple plus de priorité qu’une application qui en est dépourvue). • Deux applications de même priorité seront départagées par le temps qu’elles auront passé à une priorité plus faible.
  • 17. 19/01/2021 Adil JEGHAL 17 Les Activités Android Définition  Une activité peut être assimilée à un écran qu’une application propose à son utilisateur. • Pour chaque écran de votre application, vous devrez donc créer une activité.  La transition entre deux écrans correspond au lancement d’une activité ou au retour vers une activité placée en arrière- plan.  Une activité comprend 2 volets : • La logique de l’activité et la gestion du cycle de vie de l’activité qui sont implémentés en Java, dans une classe héritant de Activity; • L’interface utilisateur, qui pourra être définie soit dans le code de l’activité, soit, de façon plus générale, dans un fichier XML placé dans les ressources de l’application.
  • 18. 19/01/2021 Adil JEGHAL 18 Les Activités Android Code minimal pour créer une activité import android.app.Activity; import android.os.Bundle; public class ActiviteSimple extends Activity { /** * Méthode appelée à la création de l’activité * @param savedInstanceState permet de restaurer l’état * de l’interface utilisateur */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
  • 19. 19/01/2021 Adil JEGHAL 19 Les Activités Android Cycle de vie d’une activité
  • 20. 19/01/2021 Adil JEGHAL 20 Les Activités Android Cycle de vie d’une activité
  • 21. 19/01/2021 Adil JEGHAL 21 Les Activités Android Squelette d’une activité import android.app.Activity; import android.os.Bundle; public final class TemplateActivity extends Activity { /*Appelée lorsque l’activité est créée. Permet de restaurer l’état de l’interface utilisateur *grâce au paramètre savedInstanceState.*/ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Placez votre code ici } /*Appelée lorsque que l’activité a fini son cycle de vie. C’est ici que nous placerons notre *code de libération de mémoire, fermeture de fichiers et autres opérations de "nettoyage".*/ @Override public void onDestroy(){ // Placez votre code ici super.onDestroy(); }
  • 22. 19/01/2021 Adil JEGHAL 22 Les Activités Android Squelette d’une activité /*Appelée lorsque l’activité démarre. Permet d’initialiser les contrôles.*/ @Override public void onStart(){ super.onStart(); // Placez votre code ici } /*Appelée lorsque l’activité passe en arrière plan. Libérez les écouteurs, arrêtez les *threads, votre activité peut disparaître de la mémoire.*/ @Override public void onStop(){ // Placez votre code ici super.onStop(); } /*Appelée lorsque l’activité sort de son état de veille.*/ @Override public void onRestart(){ super.onRestart(); //Placez votre code ici}
  • 23. 19/01/2021 Adil JEGHAL 23 Les Activités Android Squelette d’une activité /*Appelée lorsque que l’activité est suspendue. Stoppez les actions qui consomment des *ressources. L’activité va passer en arrière-plan.*/ @Override public void onPause(){ //Placez votre code ici super.onPause(); } /*Appelée après le démarrage ou une pause. Relancez les opérations arrêtées (threads). *Mettez à jour l’application et vérifiez vos écouteurs.*/ @Override public void onResume(){ super.onResume(); // Placez votre code ici }
  • 24. 19/01/2021 Adil JEGHAL 24 Les Activités Android Squelette d’une activité /*Appelée lorsque l’ activité termine son cycle visible. Sauvez les données importantes.*/ @Override public void onSaveInstanceState(Bundle savedInstanceState) { //Placez votre code ici, sans quoi l’activité aura perdu son état lors de son réveil super.onSaveInstanceState(savedInstanceState); } /*Appelée après onCreate. Les données sont rechargées et l’interface utilisateur est *restaurée dans le bon état.*/ @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); //Placez votre code ici } }
  • 25. 19/01/2021 Adil JEGHAL 25 Les Activités Android Squelette d’une activité
  • 26. 19/01/2021 Adil JEGHAL 26 Les Activités Android Méthodes correspondant au cycle de vie Les méthodes onXxx sont appelées au cours du cycle de vie. Si elles sont surchargées elles doivent faire appel à leur homologue de la classe supérieure (super.onXxx).  onCreate(Bundle) appelée à la création. Le paramètre permet de récupérer un état sauvegardé lors de l'arrêt de l'activité (si on a fait une sauvegarde)  onPause() appelée quand l'activité n'est plus en premier plan  onDestroy() appelée quand l'activité se termine  onStart() appelée quand l'activité démarre  onRestart() appelée quand l'activité redémarre  onStop() appelée quand l'activité n'est plus visible  onResume() appelée quand l'activité vient en premier plan  finish() permet de terminer une activité
  • 27. 19/01/2021 Adil JEGHAL 27 Les Activités Android Méthodes relatives à l'interface  setContentView(int) permet de créer l'interface depuis un fichier XML, le paramètre désigne ce fichier par son identifiant  findViewById(int) récupération d'un élément d'interface (renvoie un objet de classe View) , le paramètre désigne cet élément par son identifiant (normalement défini dans la classe R)  showDialog(int) ouverture d'une fenêtre de dialogue. Le paramètre désigne la fenêtre de dialogue par son identifiant  showDialog(int, Bundle) ouverture d'une fenêtre de dialogue. Le 1er paramètre désigne la fenêtre de dialogue par son identifiant, le second permet de lui passer des paramètres  dismissDialog(int) fermeture d'une fenêtre de dialogue désignée par son identifiant  onCreateDialog(int, Bundle) appelée lors de l'ouverture d'une fenêtre de dialogue. Le 1er paramètre est l'identifiant de la fenêtre de dialogue, le second est celui qui avait été passé lors de l'appel de showDialog  onPrepareDialog(int, Bundle) appelée lors de l'activation d'une fenêtre de dialogue déjà ouverte. Le 1er paramètre est l'identifiant de la fenêtre de dialogue, le second est celui qui avait été passé lors de l'appel de showDialog  getCurrentFocus() renvoie l'élément de l'interface (objet de classe View) ayant actuellement le focus
  • 28. 19/01/2021 Adil JEGHAL 28 Les Activités Android Méthodes relatives aux menus et menus contextuels  onCreateOptionsMenu(Menu) appelée lorsqu'un menu de l'activité est affiché. Le paramètre est le menu affiché.  onOptionsItemSelected(MenuItem) appelée lors d'un choix dans un menu de l'activité. Le paramètre est le choix effectué.  onOptionsMenuClosed(Menu) appelée lors de la fermeture d'un menu de l'activité. Le paramètre est le menu fermé.  registerForContextMenu(View) associe un menu contextuel à l'élément passé en paramètre  unregisterForContextMenu(View) supprime l'association du menu contextuel à l'élément passé en paramètre  onCreateContextMenu(ContextMenu, View, ContextMenu.ContextMenuInfo) appelée lorsqu'un menu contextuel est affiché. Le 1er paramètre est ce menu contextuel, le 2ème est l'élément d'interface auquel il est associé, le dernier donne des informations sur le contenu de l'élément d'interface qui a causé l'apparition du menu contextuel  onContextItemSelected(MenuItem) appelée lors d'un choix dans un menu contextuel. Le paramètre est le choix effectué.  onContextMenuClosed(ContextMenu) appelée lors de la fermeture d'un menu contextuel. Le paramètre est le menu fermé.
  • 29. 19/01/2021 Adil JEGHAL 29 Les Activités Android Méthodes relatives à l'environnement et aux ressources  getResources() renvoie un objet de classe Resources permettant l'accès aux ressources de l'application (voir plus loin la classe Resources)  onUserInteraction() appelée à chaque interaction de l'utilisateur (clavier, trackball, touché)  onBackPressed() appelée lorsque l'utilisateur appuie la touche de retour arrière du téléphone  onLowMemory() appelée lorsque le niveau de batterie devient faible  getFilesDir() renvoie un objet de classe File représentant le chemin où sont placés les fichiers propres à l'application  openFileInput(String) renvoie un objet de classe FileInputStream correspondant à un flux de lecture connecté au fichier dont le nom est passé en paramètre.  openFileOutput(String, int) renvoie un objet de classe FileOutputStream correspondant à un flux d'écriture connecté au fichier dont le nom est passé en premier paramètre. Le second paramètre est le mode d'ouverture qui peut être : MODE_PRIVATE (mode normal), MODE_APPEND (ajout à un fichier existant), MODE_WORLD_READABLE et MODE_WORLD_WRITEABLE (pour les droits d'accès). On peut cumuler plusieurs attributs par |
  • 30. 19/01/2021 Adil JEGHAL 30 Les Activités Android Méthodes de lancement d'activités et de services  startActivity(Intent) Lance une autre activité, le paramètre désigne l'activité ou les propriétés permettant à Android de l'identifier.  startActivityForResult(Intent, int) Lance une autre activité dont on attend un retour, le 1er paramètre désigne l'activité ou les propriétés permettant à Android de l'identifier, le second paramètre est un numéro associé à cette activité qui permettra d'en identifier la réponse.  startNextMatchingActivity(Intent) Utilisé pour demander à Android de lancer une autre activité lorsque celle proposée précédemment n'a pas donné satisfaction. Le paramètre correspond à celui qui a donné un résultat infructueux.  finishActivity(int) Termine une activité dont on attendait un retour, le paramètre est le numéro associé à cette activité lors de son lancement
  • 31. 19/01/2021 Adil JEGHAL 31 Les Activités Android Méthodes de lancement d'activités et de services  startService(Intent) Lance un service, le paramètre désigne le service ou les propriétés permettant à Android de l'identifier  stopService(Intent) Arrête un service, le paramètre désigne le service ou les propriétés permettant à Android de l'identifier  getIntent() renvoie l'objet de classe Intent associé à l'activité lors de son lancement  setResult(int) Utilisé par l'activitée appelée pour renvoyer un code de résultat à l'activité appelante  setResult(int, Intent) comme la précédente, le paramètre supplémentaire est un Intent contenant les valeurs de retour qui sera également renvoyé.  onActivityResult(int, int, Intent) cette méthode de l'activité appelante est exécutée lorsqu'une activité lancée se termine, le 1er paramètre est le numéro associé à cette activité lors de son lancement, le deuxième est le code de retour de cette activité, le dernier est l'Intent de retour de cette activité
  • 32. 19/01/2021 Adil JEGHAL 32 Manifeste Une application est décrite par un fichier XML appelé AndroidManifest. Ce fichier permet d'indiquer :  Le SDK utilisé par une balise uses-sdk  Les permissions : une balise uses-permission par autorisation demandée  Les activités de l'application : une balise activity pour chaque activité contenant chacune une ou plusieurs balises intent-filter  Les services de l'application : une balise service pour chaque service contenant chacune une ou plusieurs balises intent-filter  les écouteurs d'intentions diffusées : une balise receiver pour chaque écouteur contenant chacune une ou plusieurs balises intent-filter  Les fournisseurs de contenu : une balise provider pour chaque activité  Les bibliothèques utilisées : une balise uses-library pour chaque bibliothèque
  • 33. 19/01/2021 Adil JEGHAL 33 Manifeste Chaque activité constituant une application doit être décrite par une balise <activity>. La balise minimale de l'activité principale est de la forme : Activités  name qui désigne la classe de l'activité  label qui désigne le nom sous lequel elle apparaîtra sur le terminal  icon qui désigne l'icône à afficher sur le terminal
  • 34. 19/01/2021 Adil JEGHAL 34 Manifeste La balise <intent-filter> permet d'indiquer ce que fait l'activité (on parle d'intension). Elle sera utilisée par Android pour rechercher une activité pouvant répondre à une spécification donnée (cette spécification lui sera fournie dans un objet de classe Intent). La forme générale de la balise <intent-filter> est la suivante: Activités  Action qui indique le type d’action effectuée par l'activité (par exemple affichage, édition …)  Category qui indique la catégorie d’action (par exemple CATEGORY_BROWSABLE indique une activité qui peut être appelée par un navigateur)  Data qui indique le type de données transmises à l’activité lancée ou le type de réponse attendu ainsi que le protocole (http, content, file …) <intent-filter> <action android:name=“nom_d_action_1“ /> <category android:name=“nom_de_categorie_1“ /> <data android:mimeType=“nom_de_type_mime“ android:scheme=“protocole://hote:port/chemin“ /> </intent-filter>
  • 35. 19/01/2021 Adil JEGHAL 35 Manifeste Activités  Actions • android.intent.action.VIEW affichage de données • android.intent.action.EDIT affichage de données pour édition par l’utilisateur • android.intent.action.MAIN activité principale d’une application • android.intent.action.CALL appel téléphonique • android.intent.action.WEB_SEARCH recherche sur le WEB  Catégories • android.intent.category.LAUNCHER activité proposée au lancement par Android • android.intent.category.DEFAULT activité pouvant être lancée explicitement • android.intent.category.BROWSABLE peut afficher une information désignée par un lien • android.intent.category.TAB activité associée dans un onglet d’interface (TabHost)
  • 36. 19/01/2021 Adil JEGHAL 36 Manifeste Permissions Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses- permission>. Les principales permissions sont : Géolocalisation (GPS) <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> Accès aux données personnelles <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS" /> <uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS" />
  • 37. 19/01/2021 Adil JEGHAL 37 Manifeste Permissions Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses- permission>. Les principales permissions sont : Modification de paramètres <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.SET_TIME_ZONE" /> <uses-permission android:name="android.permission.SET_WALLPAPER" /> Téléphonie <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CALL_PRIVILEGED" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> Audio <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  • 38. 19/01/2021 Adil JEGHAL 38 Manifeste Permissions Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses- permission>. Les principales permissions sont : Envoi et réception de SMS/MMS <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_MMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" />
  • 39. 19/01/2021 Adil JEGHAL 39 Manifeste Permissions Pour autoriser une application à accéder à certaines ressources il faut lui en donner l'autorisation par une balise <uses- permission>. Les principales permissions sont : Réseau <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> Access au matériel <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.BATTERY_STATS" />
  • 40. 19/01/2021 Adil JEGHAL 40 Les Activités Android
  • 41. 19/01/2021 Adil JEGHAL 41 Les Activités Android Exercice 1 Ecrire une application pour découvrir manuellement le cycle de vie d’une activité
  • 42. 19/01/2021 Adil JEGHAL 42 Ressources Le répertoire res contient toutes les ressources qui seront mises dans le fichier application (apk). Il est constitué de sous répertoires :  drawable-hdpi (images en haute définition)  drawable-ldpi (images en basse définition)  drawable-mdpi (images en moyenne définition)  layout (description en XML des interfaces)  values (définitions en XML de valeurs : chaînes, tableaux, valeurs numériques …)  anim (description en XML d’animations)  menu (description en XML de menus pour l’application)  xml (fichiers XML utilisés directement par l’application)  raw (tous les autres types de ressources : fichiers texte, vidéo, son …) Répertoires des ressources
  • 43. 19/01/2021 Adil JEGHAL 43 Ressources Classe de référencement des ressources: Android Studio (Eclipse) explore les fichiers contenus dans les sous-répertoires de res et génère une classe (appelée R) dans laquelle un identifiant est créé pour chacun des éléments trouvés : • Fichiers (images, textes ..) placés dans drawable-xxxx , raw et xml • Eléments d'interface définis dans les fichiers placés dans layout et menu • Valeurs définies dans les fichiers placés dans values • Animations définies dans les fichiers placés dans anim On pourra ensuite, dans la plupart des méthodes, désigner ces ressources par leur identifiant dans cette classe R sous la forme : R.type.nom. Classe R
  • 44. 19/01/2021 Adil JEGHAL 44 Ressources Référencement d’une ressource dans un fichier XML On référence une resource dans un fichier XML par : "@[paquetage:]type/identificateur" Par exemple : @string/machaine fait référence à une chaîne décrite dans un fichier XML placé dans le répertoire res/values (le nom de ce fichier n'a aucune importance) et définie par : <string name="machaine">contenu de cette chaine</string> Utilisation de ressources
  • 45. 19/01/2021 Adil JEGHAL 45 Ressources Récupération d’une ressource dans le code (la classe Resources) Dans le code les ressources sont désignées par leur identifiant dans la classe R de la forme : R.type.nom. Certaines méthodes acceptent cette désignation comme paramètre pour accéder à la ressource. On obtient une instance de la classe Resources par la méthode getResources() de l’activité. On accède ensuite aux ressources grâce aux méthodes de cet objet qui acceptent en paramètre un identifiant de la forme R.type.nom, ces méthodes sont : • boolean getBoolean(int) renvoie le booléen désigné • int getInteger(int) renvoie l'entier désigné • int[] getIntArray(int) renvoie le tableau d'entiers désigné • etc. Par exemple : String titre = getResources().getString(R.string.texte_titre); permet de récupérer la chaîne définie dans un fichier XML par : <string name="texte_titre">…..</string> Utilisation de ressources
  • 46. 19/01/2021 Adil JEGHAL 46 Uri Pour créer une Uri faisant référence à une ressource sur Internet : Uri ressource = Uri.parse("http://domaine.sous_doamine/chemin/nom_du_fichier"); Ressource sur Internet Les Uri sont un moyen utilisé pour désigner des ressources que ce soit sur Internet ou localement Pour créer une Uri faisant référence à une ressource embarquée : Uri ressource = Uri.parse("android.resource://nom_du_paquetage_de_l_activité/" + R.chemin.app1); Ressource locale
  • 47. 19/01/2021 Adil JEGHAL 47 Interfaces La mise en place d’une interface peut se faire de deux façons: • Par description de l’interface dans un fichiers XML • Par programme Les fichiers XML qui décrivent une interface sont placés dans le répertoire res/layout. Ils sont référencés par R.layout.nom_du_fichierXML. Les activités peuvent utiliser la méthode setContentView(R.layout.nom_du_fichierXML) pour mettre en place l'interface décrite par un tel fichier.
  • 48. 19/01/2021 Adil JEGHAL 48 Interfaces Propriétés des interfaces Lorsque l'on indique des unités dans les fichiers XML elles peuvent l'être de plusieurs façons :  en pixels (faire suivre la valeur de px)  relativement à la taille de la fonte de caractères (faire suivre la valeur de sp)  en millimètres (faire suivre la valeur de mm)  en pouces (faire suivre la valeur de in)  en points = 1/72 pouce (faire suivre la valeur de pt)  en pixels à densité indépendante valent 1 pixel pour un écran de 160 dpi (faire suivre la valeur de dp) Les unités
  • 49. 19/01/2021 Adil JEGHAL 49 Interfaces Elles sont définies par un code hexadécimal indiquant la transparence et les composantes (RVB) sous la forme "#AARRVVBB" où :  AA est la transparence (00 totalement transparent). Si le code de couleur ne comporte que 3 composantes AA est considéré comme FF c'est-à-dire que #44FA8B est équivalent à #FF44FA8B  RR VV et BB sont, respectivement, les composantes rouge, verte et bleue Les couleurs Propriétés des interfaces
  • 50. 19/01/2021 Adil JEGHAL 50 Interfaces Propriétés positionnables en XLM Un identifiant peut être associé à chaque élément décrit dans un fichier XML, cet identifiant permet d'accéder à l'objet créé dans le code. Les éléments ne devant pas être accédés dans le code peuvent ne pas avoir d'identifiant. android:id="@+id/monident" permettra de retrouver cet élément par findViewById(R.id.monident). Identifiant android:clickable="b" (où b vaut true ou false). android:longClickable="b" (où b vaut true ou false) Evénements
  • 51. 19/01/2021 Adil JEGHAL 51 Interfaces Propriétés positionnables en XLM android:visibility="x" (les valeurs possibles pour x sont : visible, invisible ou gone) Avec invisible la place est conservée, avec gone la place n'est pas conservée. Visibilité android:background="couleur" pour définir une couleur android:background="@drawable/monimage" pour utiliser une image. L'image est placée dans res/drawable- xxxx/ et s'appelle monimage.t (où t est png, jpg, ou gif). Fond
  • 52. 19/01/2021 Adil JEGHAL 52 Interfaces Propriétés positionnables en XLM android:minHeight="unité" définit la hauteur minimale si possible android:minWidth="unité" définit la largeur minimale si possible android:paddingBottom="unité" marge interne en bas android:paddingLeft="unité" marge interne à gauche android:paddingRight="unité" marge interne à droite android:paddingTop="unité" marge interne en haut Taille et marges internes
  • 53. 19/01/2021 Adil JEGHAL 53 Interfaces Propriétés positionnables en XLM android:fadeScrollbars="b" où b vaut true ou false selon que l'on souhaite que les ascenseurs disparaissent ou pas lorsqu'ils ne sont pas utilisés. android:scrollbarDefaultDelayBeforeFade="x" où x est un entier qui définit le délai (en ms) avant que les ascenseurs non utilisés ne disparaissent android:scrollbarFadeDuration="x" où x est un entier qui définit la durée d'effacement des ascenseurs (en ms) Ascenseurs
  • 54. 19/01/2021 Adil JEGHAL 54 Interfaces Méthodes de la classe View View(Context) le paramètre est généralement l'activité elle-même Construction setLayoutParams(ViewGroup.LayoutParams) permet de définir le placement des objets dans la vue. Le paramètre de cette méthode est généralement new ViewGroup.LayoutParams(l, h) où l définit la largeur et h la hauteur. Les valeurs pour l et h peuvent être exprimées en pixels ou prendre les valeurs : ViewGroup.LayoutParams.WRAP_CONTENT pour adapter la taille au contenu ViewGroup.LayoutParams.FILL_PARENT pour adapter la taille à la place disponible. Placement
  • 55. 19/01/2021 Adil JEGHAL 55 Interfaces Méthodes de la classe View bringToFront() met la vue en premier plan getLeft() renvoie la position en pixels de la gauche de la vue getTop() renvoie la position en pixels du haut de la vue getRight() renvoie la position en pixels de la droite de la vue getBottom() renvoie la position en pixels du bas de la vue Position
  • 56. 19/01/2021 Adil JEGHAL 56 Interfaces Méthodes de la classe View getWidth()renvoie la largeur de la vue en pixels getHeight()renvoie la hauteur de la vue en pixels setPadding(int, int, int, int) définit les marges (en pixels). Les paramètres sont, dans l'ordre : gauche, haut, droite, bas. getPaddingLeft()renvoie la marge gauche (en pixels). getPaddingTop()renvoie la marge haute (en pixels). getPaddingRight()renvoie la marge droite (en pixels). getPaddingBottom()renvoie la marge basse (en pixels) Taille et marges internes
  • 57. 19/01/2021 Adil JEGHAL 57 Interfaces Méthodes de la classe View setBackgroundColor(int) définit la couleur du fond setBackgroundDrawable(Drawable) définit une image de fond setBackgroundResource(int) définit le fond à partir d'un identificateur de ressource Fond requestLayout() provoque un rafraichissement des positions des éléments de la vue invalidate() provoque un rafraichissement de la vue Rafraichissement
  • 58. 19/01/2021 Adil JEGHAL 58 Interfaces Méthodes de la classe View setOnClickListener(OnClickListener) associe un écouteur d'événements aux clics sur la vue setOnLongClickListener(OnLongClickListener) associe un écouteur d'événements aux clics longs sur la vue setOnKeyListener(OnKeyListener) associe un écouteur d'événements aux actions clavier sur la vue setOnTouchListener(OnTouchListener) associe un écouteur d'événements aux touchés sur la vue Evenements isFocusable() renvoie true si la vue peut prendre le focus setFocusable(boolean) fait ou pas prendre le focus à la vue isFocusableInTouchMode()renvoie true si la vue peut prendre le focus lorsqu'elle est touchée setFocusableInTouchMode(boolean) autorise ou non la vue a prendre le focus lorsqu'elle est touchée Focus
  • 59. 19/01/2021 Adil JEGHAL 59 Interfaces Méthodes de la classe ViewGroup ViewGroup(Context) le paramètre est généralement l'activité elle-même Construction addView(View) ajoute un élément au groupe getChildCount() renvoie le nombre d'éléments du groupe getFocusedChild() renvoie l'élément qui a actuellement le focus (objet de classe View) removeView(View) enlève un élément du groupe removeAllViews() enlève tous les éléments du groupe Eléments du groupe setPadding(int, int, int, int) définit les marges (en pixels). Les paramètres sont, dans l'ordre : gauche, haut, droite, bas. Marges
  • 62. 19/01/2021 Adil JEGHAL 62 Intents Les Intents permettent de gérer l'envoi et la réception de messages afin de faire coopérer les applications. Le but des Intents est de déléguer une action à un autre composant, une autre application ou une autre activité de l'application courante. Un objet Intent contient les information suivantes: • le nom du composant ciblé (facultatif) • l'action à réaliser, sous forme de chaine de caractères • les données: contenu MIME et URI • des données supplémentaires sous forme de paires clef/valeur • une catégorie pour cibler un type d'application • des drapeaux (informations supplémentaires) On peut envoyer des Intents informatifs pour faire passer des messages. Mais on peut aussi envoyer des Intents servant à lancer une nouvelle activité
  • 63. 19/01/2021 Adil JEGHAL 63 Intents Intent login = new Intent(getApplicationContext(), GiveLogin.class); startActivity(login); Intents pour une nouvelle activité S'il s'agit de passer la main à une autre application, on donne au constructeur de l'Intent les données et l'URI cible: l'OS est chargé de trouver une application pouvant répondre à l'Intent. Button b = (Button)findViewById(R.id.Button01); b.setOnClickListener(new OnClickListener() { public void onClick(View v) { Uri telnumber = Uri.parse("tel:0666145265"); Intent call = new Intent(Intent.ACTION_DIAL, telnumber); startActivity(call); }});
  • 64. 19/01/2021 Adil JEGHAL 64 Intents Intent callactivity2 = new Intent(getApplicationContext(), Activity2.class); callactivity2.putExtra("login", "jfl"); startActivity(callactivity2); Ajouter des informations Les Intent permettent de transporter des informations à destination de l'activité cible. On appelle ces informations des Extra: les méthodes permettant de les manipuler sont getExtra et putExtra. Lorsqu'on prépare un Intent et que l'on souhaite ajouter une information de type "clef -> valeur" on procède ainsi: Bundle extras = getIntent().getExtras(); String s = new String(extras.getString("login")); Du côté de l'activité recevant l'Intent, on récupère l'information de la manière suivante:
  • 65. 19/01/2021 Adil JEGHAL 65 Intents Intent broadcast = new Intent("andro.jf.broadcast"); broadcast.putExtra("extra", "test"); sendBroadcast(broadcast); Broadcaster des informations Il est aussi possible d'utiliser un objet Intent pour broadcaster un message à but informatif. Ainsi, toutes les applications pourront capturer ce message et récupérer l'information. Bundle extra = intent.getExtras(); String val = extra.getString("extra"); La méthode putExtra permet d'enregistrer une paire clef/valeur dans l'Intent. On peut récupérer les données à l'aide de la méthode getExtras dans l'objet Bundle qui est dans l'Intent:
  • 66. 19/01/2021 Adil JEGHAL 66 Persistance des données Android fournit plusieurs méthodes pour faire persister les données applicatives:  la persistance des données de l'activité (cf Le SDK Android) La persistance des données des activités est géré par l'objet Bundle qui permet de restaurer les View qui possède un id.  un mécanisme de sauvegarde clé/valeur, utilisé pour les fichiers de préférences (appelé préférences partagées)  des entrées sorties de type fichier  une base de donnée basé sur SQLite Différentes persistances
  • 67. 19/01/2021 Adil JEGHAL 67 Persistance des données La classe SharedPreferences permet de gérer des paires de clé/valeurs associées à une activité. On récupère un tel objet par l'appel à getPreferences: Préférences partagées SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE); String nom = prefs.getString("login", null); Long nom = prefs.getLong("taille", null); La méthode getPreferences(int) appelle en fait getPreferences(String, int) à partir du nom de la classe de l'activité courante. Le mode MODE_PRIVATE restreint l'accès au fichier créé à l'application. Les modes d'accès MODE_WORLD_READABLE et MODE_WORLD_WRITABLE permettent aux autres applications de lire/écrire ce fichier.
  • 68. 19/01/2021 Adil JEGHAL 68 Persistance des données Une activité spécifique a été programmée pour réaliser un écran d'édition de préférences. Il s'agit de PreferenceActivity. A partir d'une description XML des préférences, la classe permet d'afficher un écran composé de modificateurs pour chaque type de préférences déclarées. Voici un exemple de déclarations de préférences XML, à stocker dans res/xml/preferences.xml Préférences partagées: Représentation XML d'un menu de préférences
  • 69. 19/01/2021 Adil JEGHAL 69 Persistance des données Pour afficher l'écran d'édition des préférences correspondant à sa description XML, il faut créer une nouvelle activité qui hérite de PreferenceActivity et simplement appeler la méthode addPreferencesFromResource en donnant l'id de la description XML. Pour lancer cette activité, on crée un bouton et un Intent correspondant. Préférences partagées: Activité d'édition de préférences
  • 70. 19/01/2021 Adil JEGHAL 70 Persistance des données Les attributs suivants sont utiles:  android:title: La string apparaissant comme nom de la préférence  android:summary: Une phrase permettant d'expliciter la préférence  android:key: La clef pour l'enregistrement de la préférence Pour accéder aux valeurs des préférences, on utiliser la méthode getDefaultSharedPreferences sur la classe PreferenceManager. C'est la clef spécifiée par l'attribut android:key qui est utilisée pour récupérer la valeur choisie par l'utilisateur. Préférences partagées: Attributs des préférences
  • 71. 19/01/2021 Adil JEGHAL 71 Persistance des données Une case à cocher se fait à l'aide de CheckBoxPreference: Un champs texte est saisi via EditTextPreference: Préférences partagées: toggle et texte
  • 72. 19/01/2021 Adil JEGHAL 72 Persistance des données Il est aussi possible d'écraser des préférences par le code, par exemple si une action fait changer le paramétrage de l'application ou si l'on reçoit le paramétrage par le réseau. L'écriture de préférences est plus complexe: elle passe au travers d'un éditeur qui doit réaliser un commit des modifications Préférences partagées: Ecriture de préférences SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE); Editor editor = prefs.edit(); editor.putString("login", "jf"); editor.commit();
  • 73. 19/01/2021 Adil JEGHAL 73 Persistance des données Lecture/écriture de données dans un fichier, dans l’espace de stockage interne associé à l’application  API pour création/écriture/lecture  Données privées  Non visible par l’utilisateur  Destruction à la suppression de l’application Stockage interne
  • 74. 19/01/2021 Adil JEGHAL 74 Persistance des données Création et écriture dans un fichier • L’appel à openFileOutput sur l’activité ou le contexte retourne une référence sur le flux d’écriture dans le fichier (créé si inexistant) cf. FileOutputStream Lecture dans un fichier • L’appel à openFileInput sur l’activité ou le contexte retourne une référence sur le flux de lecture dans le fichier cf. FileInputStream • L’appel à openRawInput(resId sur l’activité ou le contexte retourne une référence sur le flux de lecture dans le fichier en lecture seule Stockage interne
  • 75. 19/01/2021 Adil JEGHAL 75 Persistance des données Stockage interne OutputStreamWriter out = new OutputStreamWriter( openFileOutput(FIILE_NAME, MODE)); InputStream inputStream = openFileInput(FIILE_NAME); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  • 76. 19/01/2021 Adil JEGHAL 76 Persistance des données SQLite  Exercice 1: (Gestion des utilisateurs )  Exercice 2 (Gestion de bibliothèque )
  • 77. 19/01/2021 Adil JEGHAL 77 Connectivité Téléphonie Réseau Bluetooth Localisation Capteurs Caméra
  • 78. 19/01/2021 Adil JEGHAL 78 Connectivité Téléphonie Les fonctions de téléphonie sont relativement simples à utiliser. Elles permettent de récupérer l'état de la fonction de téléphonie (appel en cours, appel entrant, ...), d'être notifié lors d'un changement d'état, de passer des appels et de gérer l'envoi et réception de SMS. L'état de la téléphonie est géré par la classe TelephonyManager qui permet de récupérer le nom de l'opérateur, du téléphone, et l'état du téléphone. Pour lire ces informations, il est nécessaire de disposer de la permission android.permission.CALL_PHONE. TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); int etat = tel.getCallState(); if (etat == TelephonyManager.CALL_STATE_IDLE) // RAS if (etat == TelephonyManager.CALL_STATE_RINGING) // Le téléphone sonne
  • 79. 19/01/2021 Adil JEGHAL 79 Connectivité Téléphonie Il est aussi possible d'être notifié d'un changement d'état en utilisant un écouteur: public class Ecouteur extends PhoneStateListener { public void onCallStateChanged(int etat, String numero) { super.onCallStateChanaged(etat, numero) if (etat == TelephonyManager.CALL_STATE_OFFHOOK) // Le téléphone est utilisé }
  • 80. 19/01/2021 Adil JEGHAL 80 Connectivité Téléphonie: Passer un appel Cette action étant réalisée avec un Intent (attention aux permission) Uri telnumber = Uri.parse("tel:0666666666"); Intent call = new Intent(Intent.ACTION_CALL, telnumber); startActivity(call); Les applications qui peuvent passer des appels doivent filtrer ce type d'Intent pour pouvoir être invoquée lorsque l'Intent est lancé <receiver android:name=".ClasseGerantLAppel"> <intent-filter> <action android:name="Intent.ACTION_CALL"/> </intent-filter> </receiver>
  • 81. 19/01/2021 Adil JEGHAL 81 Connectivité Téléphonie: Envoyer et recevoir des SMS Si la permission android.permission.SEND_SMS est disponible, il est possible d'envoyer des SMS au travers de SmsManager: SmsManager manager = SmsManager.getDeault(); manager.sendTextMessage(" 0666666666 ", null, “Salut !", null, null); Inversement, il est possible de créer un filtre d'Intent pour recevoir un SMS qui sera géré par un broadcast receiver. L'action à préciser dans le filtre d'Intent du receveur est android.provider.Telephony.SMS_RECEIVED: <receiver android:name=".SMSBroadcastReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
  • 82. 19/01/2021 Adil JEGHAL 82 Connectivité Téléphonie: Envoyer et recevoir des SMS public final class MyBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(android.provider.Telephony.SMS_RECEIVED)) { String val = extra.getString("extra"); Object[] pdus = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i=0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); }}}
  • 83. 19/01/2021 Adil JEGHAL 83 Connectivité Réseau Le réseau peut être disponible ou indisponible, suivant que le téléphone utilise une connexion Wifi, 3G, bluetooth, etc. Si la permission android.permission;ACCESS_NETWORK_STATE est déclarée, la classe NetworkInfo (depuis ConnectivityManager) permet de lire l'état de la connexion réseau parmi les constantes de la classe State: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED, SUSPENDED, UNKNOWN. ConnectivityManager manager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); NetworkInfo net = manager.getActiveNetworkInfo(); if (net.getState().compareTo(State.CONNECTED) // Connecté • ConnectivityManager.TYPE_MOBILE: connexion mobile • ConnectivityManager.TYPE_WIFI: wifi
  • 84. 19/01/2021 Adil JEGHAL 84 Connectivité Réseau Le basculement entre les types de connexion est possible si la permission WRITE_SECURE_SETTINGS est disponible. On utilise alors la méthode setNetworkPreference sur l'objet ConnectivityManager pour lui donner l'entier correspondant au type de connexion voulu. Par exemple: manager.setNetworkPreference(ConnectivityManager.TYPE_WIFI); L'accès au réseau wifi est gérable depuis une application, ce qui permet d'allumer ou de couper le wifi. L'objet WifiManager permet de réaliser cela. WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); if (!wifi.isWifiEnabled()) wifi.setWifiEnabled(true);
  • 85. 19/01/2021 Adil JEGHAL 85 Connectivité Bluetooth Le bluetooth se gère au travers de principalement 3 classes: • BluetoothAdapter: similaire au WifiManager, cette classe permet de gérer les autres appareils bluetooth et d'initier les communications avec ceux-ci. • BluetoothDevice: objet représentant l'appareil distant. • BluetoothSocket et BluetoothServerSocket: gère une connexion établie. Pour pouvoir utiliser les fonctionnalités bluetooth, il faut activer les permissions android.permission.BLUETOOTH et android.permission.BLUETOOTH_ADMIN pour pouvoir chercher des appareils ou changer la configuration bluetooth du téléphone. BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); if (!bluetooth.isEnabled()) {Intent launchBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(launchBluetooth);}
  • 86. 19/01/2021 Adil JEGHAL 86 Connectivité Bluetooth: S'associer en bluetooth Pour pouvoir associer deux appareils en bluetooth, il faut que l'un d'eux soit accessible aux autres appareils. Pour cela, l'utilisateur doit autoriser le mode "découverte". L'application doit donc le demander explicitement via un Intent: Intent discoveryMode = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoveryMode.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 60); startActivity(discoveryMode);
  • 87. 19/01/2021 Adil JEGHAL 87 Connectivité Bluetooth: S'associer en bluetooth A l'inverse, si un appareil externe diffuse une annonce de découverte, il faut capturer les intents recus en broadcast dans le mobile: public final class BluetoothBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); BluetoothDevice appareil = null; if (action.equals(BluetoothDevice.ACTION_FOUND)) appareil = (BluetoothDevice)intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE); } }
  • 88. 19/01/2021 Adil JEGHAL 88 Connectivité Bluetooth: S'associer en bluetooth Enfin les appareils associés se parcourent à l'aide d'un Set<BluetoothDevice>: Set<BluetoothDevice> s = bluetooth.getBondedDevices(); for (BluetoothDevice ap : s) Toast.makeText(getApplicationContext(), "" + ap.getName(), Toast.LENGTH_LONG).show();