Passer au contenu principal
Ce document fait partie du scénario d’architecture Mobile + API et explique comment mettre en œuvre l’application mobile avec Android. Veuillez vous référer au scénario pour obtenir des informations sur la solution mise en œuvre.

1. Configurer l’application

Exemple de projet

Pour commencer, téléchargez un exemple de projet spécifique à ce tutoriel. Télécharger Fork sur Github Exigences Système
  • Android Studio 2.3
  • Trousse SDK pour Android 25
  • Emulateur - Nexus 5X - Android 6.0
Afficher les exigences

Définir les dépendances

Pour cette mise en œuvre, nous utiliserons les dépendances suivantes au sein du fichier build.gradle de l’application :
  • Auth0.Android: ce package permet l’intégration avec Auth0 pour l’authentification des utilisateurs.
  • OkHttp: ce package fournit une application HTTP pour effectuer des requêtes à l’API Node.JS.
  • JWTDecode.Android : ce package aidera à décoder les .
  • AppCompat: ce package nous permet d’utiliser le gadget logiciel de la barre d’outils pour la navigation dans nos activités.

Mise à jour du manifeste

Open the application’s AndroidManifest.xml and add the internet permission:
Nous mettrons également à jour les détails de l’application afin d’utiliser le gadget logiciel.

Définir les valeurs de configuration

Définissez votre ID client Auth0, votre domaine Auth0 et l’URL de l’API dans la ressource strings.xml située dans /res/values/strings.xml.
Pour cette mise en œuvre, créez des répertoires pour les activités, les modèles et les utilitaires dans le package d’application.
  • activities/: ce package contiendra LoginActivity.java, TimeSheetActivity.java, FormActivity.java, et UserActivity.java.
  • models/: ce package contiendra les modèles de données TimeSheet.java et User.java.
  • utils/: ce package contiendra UserProfileManager.java, TimeSheetAdapter.java, et ImageTask.java

2. Autoriser L’utilisateur

Mise à jour du manifeste

Open the app’s AndroidManifest.xml and add the LoginActivity:

Créer l’activité de connexion

La LoginActivity traite l’autorisation de l’utilisateur et correspond à l’écran initial que les utilisateurs voient. Nous allons créer une méthode login() pour initialiser un WebAuthProvider et lancer l’authentification. Assurez-vous de fournir le bon schéma, la bonne et la bonne permission au WebAuthProvider. Pour cette mise en œuvre, nous utiliserons :
  • scheme: demo
  • audience: https://api.exampleco.com/timesheets (l’API Node.JS)
  • response_type: code
  • permission : create:timesheets read:timesheets openid profile email offline_access. Ces permissions nous permettront d’envoyer POST et GET à l’API Node.JS, ainsi que de récupérer le profil utilisateur et un jeton d’actualisation.
In the login() method, upon successful authentication we’ll redirect the user to the TimeSheetActivity.

Stocker les identifiants

Nous utiliserons le CredentialsManager de la bibliothèque Auth0.Android et SharedPreferences pour stocker les identifiants reçus après la connexion. Nous pouvons créer le CredentialsManager avant d’initialiser le WebAuthProvider dans la méthode login(). La transmission d’un AuthenticationAPIClient au CredentialsManager lui permet d’actualiser les jetons d’accès s’ils ont expiré.
Mettez maintenant à jour la méthode login() pour que les identifiants soient stockés via le CredentialsManager après une authentification réussie.

3. Obtenez le profil utilisateur

Créer le modèle utilisateur

Créer un modèle simple d’utilisateur qui sera utilisé par UserProfileManager et UserActivity.

Stocker le profil utilisateur

Pour gérer le stockage des informations relatives au profil de l’utilisateur, nous allons créer une classe de gestionnaire, UserProfileManager. Le UserProfileManager utilisera SharedPref​erences pour stocker les données.
Mettez ensuite à jour la méthode login() dans LoginActivity pour récupérer le jeton d’ID et obtenir le profil de utilisateur à partir du jeton avec la bibliothèque JWTDecode.Android. Stockez ensuite le profil utilisateur avec UserProfileManager.

4. Afficher les éléments de l’interface utilisateur de manière conditionnelle en fonction de la permission

Pour déterminer si un utilisateur a les autorisations requises pour effectuer certaines actions, nous pouvons examiner la permission scope qui a été accordée à l’utilisateur au cours du processus d’authentification. La permission scope contiendra une chaîne avec toutes les permissions accordées à un utilisateur, de sorte que pour déterminer si une permission particulière a été accordée, il suffit de regarder si la chaîne des permissions contient la sous-chaîne de cette permission particulière.

Stocker la permission

Tout d’abord, nous pouvons mettre à jour la classe User pour stocker les permissions accordées, puis fournir une méthode d’aide, hasScope(), qui peut être utilisée pour déterminer si les permissions accordées contiennent une permission donnée.
N’oubliez pas non plus de mettre à jour le UserProfileManager afin de stocker le champ supplémentaire :
Mettez ensuite à jour la LoginActivity pour transmettre la permission scope afin qu’elle puisse être stockée dans l’objet User :

Affichage du menu d’approbation basé sur la permission

Nous pouvons désormais afficher certains éléments de l’interface utilisateur en fonction de la permission accordée à l’utilisateur. Par exemple, nous avons un élément du menu d’approbation qui ne doit être visible que par les utilisateurs qui ont reçu la permission approve:timesheets. Vous pouvez voir ci-dessous le code de la classe BaseActivity qui vérifie si un utilisateur dispose de la permission approve:timesheets et qui, en fonction de cela, définit la visibilité de l’élément de menu qui affiche l’activité d’approbation.

5. Appeler l’API

Mise à jour du manifeste

Open the app’s AndroidManifest.xml and add the TimeSheetActivity:

Créer les modèles d’activité des feuilles de temps

Créez ensuite timesheet_activity.xml, le modèle de TimeSheetsActivity :
Le gadget logiciel ListView contiendra des entrées individuelles représentées par le modèle item_entry.xml :
Pour la barre d’outils de navigation de l’activité TimeSheetActivity, nous créerons la ressource de menu timesheet_action_menu.xml (/res/menu/​) :

Créer le modèle de feuille de temps

Créez un modèle pour travailler avec les données des feuilles de temps dans nos affichages :

Créer l’adaptateur de feuille de temps

Le TimeSheetAdapter est une classe utilitaire qui prend un tableau d’entrées de feuilles de temps et les applique au ListView de TimeSheetActivity.

Créer l’activité Feuille de temps

La TimeSheetActivity affiche les entrées de la feuille de temps de l’utilisateur connecté qui sont stockées sur le serveur.
  • @string/api_url est définie sur http://10.0.2.2:8080/timesheets de manière à ce que l’émulateur Android puisse se connecter à l’API Node.JS s’exécutant sur http://localhost:8080.
  • La méthode callAPI() récupère les feuilles de temps à partir de l’API Node.JS.
  • La méthode processResults() prend la réponse JSON de callAPI() et la convertit en objets TimeSheet.
  • Les méthodes onCreateOptionsMenu() et onOptionsItemSelected() gèrent la fonctionnalité de navigation du gadget logiciel de la barre d’outils.

6. Afficher le profil utilisateur

Pour afficher le profil de l’utilisateur connecté, nous allons créer UserActivity, un modèle user_activity.xml correspondant et le fichier user_action_menu.xml pour la navigation dans la barre d’outils. L’écran affiche le nom de l’utilisateur, son courriel et sa photo de profil.

Mise à jour du manifeste

Open the app’s AndroidManifest.xml and add the UserActivity:

Créer les modèles d’activité de l’utilisateur

Next create user_activity.xml, the layout for the UserActivity, with an ImageView for the profile picture and TextViews for the user’s name and email.
Créez le fichier user_actions_menu.xml pour la barre d’outils UserActivity:

Chargez l’image du profil à partir de URL

Afin de charger la photo du profil de l’utilisateur à partir de l’URL, créez une tâche qui étend AsyncTask et s’exécute en arrière-plan.

Créer l’activité de l’utilisateur

Dans la méthode onCreate() nous allons récupérer les informations de l’utilisateur dans le UserProfileManager et définir les valeurs affichées. Comme précédemment, les méthodes onCreateOptionsMenu() et onOptionsItemSelected() gèrent la fonctionnalité de navigation du gadget logiciel de la barre d’outils.

7. Formulaire pour les nouvelles feuilles de temps

Créez ensuite la FormActivityet le modèle pour gérer la création de nouvelles entrées dans la feuille de temps.

Mise à jour du manifeste

Open the app’s AndroidManifest.xml and add the FormActivity:

Créer les modèles d’activité du formulaire

Créez le modèle form_activity.xml avec EditText​ pour le nom du projet et les heures travaillées, et un DatePicker pour le jour travaillé.
Créez le fichier form_actions_menu.xml pour la barre d’outils FormActivity:

Créer l’activité du formulaire

  • @string/api_url est définie sur http://10.0.2.2:8080/timesheets de manière à ce que l’émulateur Android puisse se connecter à l’API Node.JS s’exécutant sur http://localhost:8080.
  • La méthode onCreate() initialise le formulaire et collecte les données pour la méthode postAPI() lorsque l’on appuie sur le bouton de soumission.
  • La méthode postAPI() enverra les données de l’utilisateur extraites du formulaire à l’API Node.JS au format JSON.
  • La méthode clearForm() vide les formulaires de saisie.
  • Les méthodes onCreateOptionsMenu() et onOptionsItemSelected() gèrent la fonctionnalité de navigation du gadget logiciel de la barre d’outils.

Tester l’application

Avant de continuer, assurez-vous que vous avez mis en œuvre l’API Node.JS.
  1. Start the API by navigating to the API’s directory in your terminal and entering the node server command.
  2. Ouvrez l’application mobile dans Android Studio et appuyez sur le bouton Exécuter.
  3. Sélectionnez l’appareil virtuel Nexus 5X API 23.
  4. Une fois que l’émulateur a chargé l’application mobile, vous pouvez vous connecter en tant qu’utilisateur, puis créer et afficher des entrées de feuilles de temps à partir de l’API Node.JS en cours d’exécution.
C’est fini! Vous avez terminé!