📡 Gestion du rĂ©seau


Note 📝: Cette fiche vous permet de comprendre et d'avoir une rapide rĂ©fĂ©rence sur l'utilisation du rĂ©seau sur Android.

AccĂ©der au rĂ©seau âšĄïž

Votre application devra la plupart du temps accéder au réseau pour récupérer des données provenant d'une ou plusieurs API (web service). Il existe des centaines de maniÚres de gérer cela sur Android.

Mais dans tous les cas vous devrez :

  • GĂ©rer les permissions d'accĂšs Ă  internet
  • Lancer vos requĂȘtes rĂ©seau sur un fil d'exĂ©cution (thread) diffĂ©rent
  • Comprendre le protocole HTTP

Mais avant d'accĂ©der au rĂ©seau. Les PERMISSIONS đŸ„

Les permissions

Sur un smartphone, il est possible de faire beaucoup de choses, il fut un temps au dĂ©but des smartphones, et encore il y a peu, oĂč globalement une app pouvait avoir accĂšs Ă  tout un tas de capteurs du mobile sans trop s'inquiĂ©ter.

Aujourd'hui c'est différent, notamment à cause d'abus de développeurs peu scrupuleux. Des abus d'accÚs à la vie privée de l'utilisateur (accÚs au micro, caméra, liste de contact etc.), mais aussi des abus d'utilisations de capteurs qui peuvent amoindrir la durée de vie de la batterie, abuser du réseau et provoquer des factures salées, envoyer des SMS malveillants depuis le smartphone de n'importe qui, etc.

Les systÚmes Android et iOS ont mis en place les permissions, qui sont des gardes fous permettant à l'utilisateur de gérer ce qui se passe sur son mobile. Et aux développeur de ne pas abuser de l'appareil mobile.

Les permissions sur Android sont un point assez sensible, autant du point de vue utilisateur que du point de vue développeur. Ne négligez pas ce point, cela peut faire la différence entre une app qui a du succÚs à une app que tout le monde va désinstaller

Un peu de lecture : https://developer.android.com/guide/topics/permissions/overview

Et pour information : La loooooooongue liste des permissions

En tant qu'utilisateur 🧑

  • Vous voulez avoir le contrĂŽle sur votre appareil, et sur les applications que vous installez dessus.
  • Vous voulez savoir quand une app utilise ou va utiliser un capteur particulier et pourquoi ? Est-ce que c'est pour une raison valable ou non ?
  • Vous ne voulez pas non plus ĂȘtre pris d'assaut par des dizaines de demande de permissions au dĂ©marrage d'une application.

En tant que dĂ©veloppeur đŸ§‘â€đŸ’»

  • Vous devez en tant que dĂ©veloppeur faire en sorte que les permissions d'accĂšs soient justifiĂ©es auprĂšs de l'utilisateur. (Ceux qui ont lu ce point, bah on vous remercie, parce que c'est super long Ă  Ă©crire un cours alors ca fait plaisir que vous soyez attentif. 🍬)
  • Vous devez faire en sorte que si l'utilisateur refuse certaines permissions, votre application continue de fonctionner le plus possible.
  • Vous devez gĂ©rer exhaustivement les diffĂ©rents cas possibles liĂ©s Ă  l'accord des permissions.
Note 📝 Par exemple, si l'utilisateur vous donne accĂšs au micro mais pas Ă  la camĂ©ra, ou qu'il dĂ©cide de dĂ©sactiver la permission de localisation entre deux dĂ©marrages de votre application. Cela ne doit pas crĂ©er de bug ou de comportement inattendu.


Ca c'est les cas simples

Sur Android

Les permissions peuvent ĂȘtre implicites ou explicites. C'est Google et plus gĂ©nĂ©ralement Android qui dĂ©fini comment les permissions doivent ĂȘtre appliquĂ©es selon leur types.

Permissions Explicites

Les permissions de localisations sont explicites. On demande Ă  l'utilisateur de confirmer via une popup in-app s'il veut bien partager sa position actuelle.

Question 1 👉 : DĂ©crivez le code Ă  utiliser pour afficher une demande explicite de permission Ă  l'utilisateur. CrĂ©ez une application simple qui demande l'accĂšs explicitement aux fichiers de l'appareil. Faites valider par l'enseignant
Permissions implicites

Les permissions d'accÚs à internet sont implicites, l'utilisateur les a d'office acceptées quand il a décidé d'installer votre application. Il existe d'autres permissions qui sont implicites.

Retour au réseau

Pour accéder au réseau, vous avez de la chance c'est une permission implicite. C'est à dire qu'elle ne donne pas lieu à une demande visuelle bloquante à l'utilisateur.
Elle est acceptĂ©e automatiquement Ă  partir du moment oĂč l'utilisateur installe l'application sur son mobile.

Pour ajouter la permission d'accÚs au réseau vous devez modifier le fichier AndroidManifest.xml de votre projet.

<!-- AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- other permissions go here -->

    <application ...>
        ...
    </application>
</manifest>

Par contre sur les derniĂšres versions d'Android, il n'est plus possible par dĂ©faut d'appeler des services web non sĂ©curisĂ©s (en http), Google recommande de toujours passer par des services https oĂč la communication est encryptĂ©.

Il faudra également rajouter dans le manifeste que vous souhaitez appeler des URL non sécurisées explicitement (à des fins de développement uniquement par exemple :wink: :wink:)

<!-- AndroidManifest.xml -->
    ...
    <application
        ...
        android:usesCleartextTraffic="true"
        ...
    />

Faire une requĂȘte vers un web service

Nous allons utiliser l'API Rick&Morty une simple API sans authentification pour les prochains exemples.

Et nous allons utiliser une biliothĂšque facilitant la crĂ©ation et l'exĂ©cution de requĂȘte rĂ©seau : OkHtttp. Il en existe beaucoup, mais c'est une des plus connues et utilisĂ©es, elle est Ă©galement recommandĂ©e par Google.

  1. Commencez par créer un projet Android simple (API >= 22) avec une activity type Empty.
  2. Ajoutez dans vos dépendances Gradle la bibliothÚque OkHttp (je vous laisse chercher)
  3. En suivant la documentation de OkHttp & de l'API, lancez une requĂȘte depuis l'Activity principale permettant de rĂ©cuperer la liste des personnages de la sĂ©rie
Question 2 👉 Une erreur a du survenir, faites valider votre appel de requĂȘte par l'enseignant. Ou si vous avez compris l'erreur, corrigez la et faites valider. Expliquez pourquoi cette erreur est survenue ?
Question 3 👉 Lancez maintenant une requĂȘte pour rĂ©cuperer un personnage en particulier. Faites valider.

👉 Meh, c'est relou ces histoires de threads ! 👈

Asynchronicité et Threads

Pourquoi ces erreurs ?

Sur mobile, vous travaillez avec des appareils ayant une puissance moindre, malgré ce qu'on vous vend avec les publicités des constructeurs, un smartphone risque d'avoir du mal à tenir constamment les 60 images par seconde lors de l'affichage, du chargement ou du traitement de données complexes.

Aussi l'expérience utilisateur sur mobile est primordial et il faut en tant que développeur, tout faire pour conserver les 60 IPS.

Il est possible de dĂ©lĂ©guer le traitement non liĂ© Ă  l'interface sur des fils d'exĂ©cutions  secondaires. Permettant de conserver une fluiditĂ© maximum en exploitant les diffĂ©rents cƓurs physiques et logiques du processeur.

GĂ©nĂ©ralement on appelle cela du threading, oĂč l'on va chercher Ă  exploiter le plus efficacement possible le processeur.

Sur Android

Sur Android et sur la JVM en général, il y a plusieurs maniÚres de faire cela, soit en utilisant des structures spécifiques créées par le framework ou la bibliothÚque que vous utilisez.

  • Sur Android il existe les AsyncTask qui sont trĂšs simples Ă  comprendre mais plutĂŽt lourdes Ă  Ă©crire. Voir ce guide sur les AsyncTask pour en apprendre plus.
  • Vous pouvez aussi avec Kotlin utiliser les coroutines qui  vont devenir la norme trĂšs rapidement. La syntaxe y est plus courte Ă  Ă©crire et les coroutines sont trĂšs efficaces.
  • Idem, pour en apprendre plus la doc de Kotlin est assez claire et vous permet d'expĂ©rimenter rapidement le concept.
  • Sur okHttp il existe l'interface Call qui est la maniĂšre dont les crĂ©ateurs d'okHttp ont dĂ©cidĂ© de vous laisser gĂ©rer les appels sur des thread background.

Faire une requĂȘte, c'est cool, utiliser les donnĂ©es c'est mieux.

Les données de l'API vous sont retournées dans le format JSON, jusqu'à présent vous avez simplement récupérer les données sous forme de chaine de caractÚres sans pouvoir les exploiter.

L'idĂ©al serait mĂȘme d'avoir le retour de l'API sous forme d'un objet Kotlin utilisable dans votre application. Pour cela nous allons effectuer une dĂ©sĂ©rialisation de la donnĂ©e reçue vers un objet Kotlin.

Des objets Kotlin

L'outil qui va nous permettre de faire ces opérations est appelé un content negociator, il en existe beaucoup, ici nous choisirons celui recommandé par OkHttp.

Question 4 👉 Lancez une requĂȘte pour rĂ©cuperer un personnage, et le parser dans une instance de data class Character. Faites valider par l'enseignant. Quel Content negociator avez vous utilisĂ© ?
Indice 📝: La bibilothĂšque OkHttp respectant les principes SOLID, ne fait qu'une chose : faire des requĂȘtes HTTP, c'est un Client HTTP. Il nous faut une autre bibliothĂšque permettant de dĂ©serialiser les donnĂ©es. Lisez les Recipes de la doc OkHttp 🎓
Question 5 👉 Faites une requĂȘte pour rĂ©cuperer une liste de personnages, et dĂ©sĂ©rialiser le tout dans des objets Kotlin. Faites valider.
Outils 🛠: Utilisez QuickType pour facilement gĂ©nĂ©rer des data class Kotlin depuis une structure JSON

Fiou !

Bien joué, pour le moment vous avez simplement "lu" des informations envoyées par un web service. Mais dans le futur vous aurez à également "envoyer" des informations via HTTP ou d'autres protocoles (Socket, Web Socket, etc.).

okHttp est que le dĂ©but de l'aventure, en effet pour utiliser des API consĂ©quentes, crĂ©er soit mĂȘme chaque requĂȘte est une mauvaise idĂ©e. C'est gĂ©nĂ©rateur d'erreurs, cela devient rapidement illisible et peu maintenable.

Maintenant pensez à combiner : ViewModel + LiveData + Données du réseau, pour avoir une architecture toujours plus propre.

🔗 Continuer le cours principal âžĄïž