Android : les éléments avancés
Création et utilisation d’un content provider
1. Présentation
Un content provider (fournisseur de contenu) permet de partager des données d’une application entre différentes applications. L’intérêt d’utiliser un content provider pour partager des données est multiple :
-
Sécurité : permet aux applications d’accéder à des données en lecture et écriture via des fonctions spécifiques. Ces fonctions peuvent empêcher des actions dangereuses lors de modifications et peuvent contrôler les informations à fournir.
-
Productivité : toutes les fonctions de partage de données ont un fonctionnement commun et s’utilisent de la même manière, permettant une meilleure gestion du code.
Généralement, un content provider manipule les données d’une base de données.
2. Structure
Un content provider est une classe héritant de la classe ContentProvider. Cette classe contient au moins les fonctions suivantes :
Fonction |
Description |
getType() |
Cette fonction permet de fournir un type MIME pour décrire les données traitées par le content provider. |
onCreate() |
Cette fonction s’exécute au moment de la création du content provider. |
query() |
Cette fonction permet de renvoyer à l’utilisateur du content provider des données dans un objet de type Cursor. |
insert() |
Cette fonction permet d’insérer des données via le content provider. |
update() |
Cette fonction permet de mettre à jour des données via le content provider. |
delete() |
Cette fonction permet de supprimer des données via le content provider. |
3. Identification
Pour utiliser un content provider, il est nécessaire de connaître son identifiant. Cet identifiant est nommé URI.
L’URI contient généralement le nom de la classe contenant le content provider :
Exemple d’URI
fr.acos.contentproviderwithkotlin.MonContentProvider
Si un content provider offre la possibilité d’exploiter différents types de données, son URI peut ressembler à ceci :
Exemple d’URI vers des données de type Personne
fr.acos.contentproviderwithkotlin.MonContentProvider/Personne
Cette URI indique que le content provider fr.acos.contentproviderwithkotlin.MonContentProvider...
Utilisation de données JSON
1. Présentation
JSON (JavaScript Object Notation) permet de stocker des données de manière structurée tout comme peut le faire le XML, à la différence qu’un fichier JSON est plus léger qu’un fichier XML avec une même quantité de données. C’est la raison pour laquelle JSON prend largement la place du XML dans les échanges de données et notamment dans la communication avec des web services.
2. Formats
Des données JSON peuvent arriver sous deux formats :
-
objet JSON : ensemble de couples nom/valeur non ordonnés
-
tableau JSON : ensemble de valeurs ordonnées
Les valeurs peuvent être :
-
des valeurs scalaires
-
des objets JSON
-
des tableaux JSON
Exemple d’un tableau JSON
[ "Bleu", "Blanc", "Rouge" ]
Exemple d’un objet JSON
{
"nom": "Rob",
"prénom": "Pierre",
"plats_preferes": [
{ "nom": "Pâtes à la crème", "nombre_ingredients": 2 } ,
{ "nom": "Omelette", " nombre_ingredients ": 1 }
]
}
3. Transformer des données...
Utilisation de services distants
1. Présentation
Il est fréquent de vouloir accéder à des services distants (web service), sur Internet, pour récupérer certaines informations. Dans ce chapitre, il est présenté comment envoyer une requête de demande d’informations à un service distant et comment récupérer la réponse provenant de ce service.
2. Permission
La permission suivante doit être définie dans le fichier AndroidManifest.xml :
<uses-permission android:name="android.permission.INTERNET" />
Cette permission permet d’accéder à internet.
3. Consommer un web service
Pour consommer un web service, il suffit de créer un objet de type URL qui attend en paramètre l’URL du web service, puis d’utiliser la fonction readText() pour lire la réponse du web service. Il est obligatoire de créer un nouveau thread pour consommer un web service afin de ne pas bloquer l’interface de l’application.
Syntaxe
val reponse = URL("<url_web_service>").readText()
Le paramètre url_web_service est le lien qui représente l’adresse HTTP du service distant.
Exemple de consommation d’un web service
Thread(
{
val result = URL("https://api.chucknorris.io/jokes/
random").readText()
Log.i("XXX","Retour : $result");
}
).start()
Dans cet exemple, une requête est envoyée au service distant situé à l’adresse : https://api.chucknorris.io/jokes/random. La réponse du service distant est enregistrée dans la variable result. La réponse est renvoyée sous forme de JSON.
4. Démonstration
Dans cette démonstration, il va être présenté une application avec un bouton. Lors d’un clic sur le bouton, un appel à un service distant est fait. Le résultat est récupéré...
Les WebViews
1. Présentation
Une WebView permet d’afficher une page web au sein d’une application. Le code des pages web (HTML, CSS et JS) peut être stocké sur des sites distants ou bien en local.
Les étapes pour définir une WebView dans une application sont les suivantes :
-
Déclarer la WebView dans le layout de l’IHM.
-
Charger du contenu dans la WebView.
2. Déclaration dans l’interface
Voici comment définir une WebView dans un fichier d’interface. Les trois attributs permettent simplement de définir l’identifiant et la taille de la WebView.
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="fr.acos.webviewwebdistantwithkotlin.MainActivity">
<WebView
android:id="@+id/ma_webview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</android.support.constraint.ConstraintLayout>
3. Charger une page web dans une WebView
La fonction loadUrl() de la classe WebView permet de charger une page web. La page web peut être locale ou bien distante. Les deux sont présentées dans les points ci-dessous.
a. Accès à des pages web distantes
Présentation
Pour accéder à des pages web distantes, il suffit de connaître l’adresse HTTP de la ressource à afficher et déclarer dans le manifeste la permission permettant d’accéder à Internet.
Permission
La permission suivante doit être définie dans le fichier AndroidManifest.xml :
<uses-permission android:name="android.permission.INTERNET" />
Usage
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...
Les récepteurs d’événement
1. Présentation
Un Broadcast Receiver (récepteur d’événement) est un composant qui s’abonne à un ou plusieurs événements. Le système achemine automatiquement les événements vers les Broadcast Receiver qui se sont abonnées à ce type d’événement. Quand un Broadcast Receiver capte un événement, il exécute un traitement sur le thread principal.
Les événements sont envoyés par le système d’exploitation Android ou par les applications.
Un événement est représenté par un objet de type Intent.
Ce chapitre présente :
-
la création d’un Broadcast Receiver,
-
l’abonnement d’un Broadcast Receiver à des événements,
-
la diffusion d’événements.
2. Création d’un Broadcast Receiver
Pour créer un BroadCast Receiver, il suffit de faire un clic droit sur un package. Puis choisir : New > Other > Broadcast Receiver, puis définir un nom de classe.
Ci-dessous, la classe générée par Android Studio avec des commentaires :
Classe MyReceiver
package fr.acos.broadcastreceiverwithkotlin.broadcastreceivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
/**
* Classe représentant le Broadcast Receiver
*/
class MyReceiver : BroadcastReceiver() {
/**
* Fonction exécutée lors de la réception d'un événement.
* @param context Contexte de l'application.
* @param Intent représentant l'événement receptionné.
*/
override fun onReceive(context:...