Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Kotlin
  3. Android : les éléments avancés
Extrait - Kotlin Les fondamentaux du développement d'applications Android
Extraits du livre
Kotlin Les fondamentaux du développement d'applications Android Revenir à la page d'achat du livre

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:...