Utilisation du fournisseur de contenu du calendrier

Android 4.0 (API de niveau 14) a introduit une API prise en charge pour accéder au fournisseur de contenu du calendrier. L'API de calendrier vous permet d'insérer, d'afficher et de modifier la base de données complète du calendrier, offrant ainsi un accès aux calendriers, événements, participants et événements.

A l'instar du fournisseur de contenu de contrat de contacts, le fournisseur de contenu d'agenda est conçu pour prendre en charge plusieurs comptes synchronisés. Par conséquent, vous pouvez choisir de lire à partir d'applications de calendrier et de comptes existants et d'y contribuer; développer un fournisseur de calendrier alternatif en créant un adaptateur de synchronisation de calendrier; ou créer une application de calendrier alternative.

 
Interroger le calendrier

Le fournisseur de calendrier requiert que vous incluiez l'autorisation READ_CALENDAR uses-permission dans votre manifeste d'application:

  1. < uses-permission android:name="android.permission.READ_CALENDAR"/ >

Les appareils Android exécutant Android 6.0 Marshmallow (API niveau 23) nécessitent également l’octroi de l’autorisation d’exécution correspondante:

  1. int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR);

Utilisez le résolveur de contenu pour interroger les tables du fournisseur de calendrier à l'aide de leur constante statique CONTENT_URI. Chaque table est exposée à partir de la classe CalendarContract, y compris:

Calendriers - L'application Calendrier peut afficher plusieurs calendriers associés à plusieurs comptes. Ce tableau contient chaque calendrier pouvant être affiché, ainsi que des détails tels que le nom d’affichage, le fuseau horaire et la couleur du calendrier.
Evénements: le tableau Evénements inclut une entrée pour chaque événement de calendrier planifié, y compris le nom, la description, l'emplacement et les heures de début et de fin.
Instances: chaque événement a une ou (dans le cas d'événements récurrents) plusieurs instances. La table Instances est remplie avec les entrées générées par le contenu de la table Evénements et inclut une référence à l'événement qui l'a généré.
Participants: chaque entrée de la table des participants représente un seul participant d'un événement donné. Chaque participant peut inclure un nom, une adresse électronique et un statut de participation, et s’ils sont des invités facultatifs ou obligatoires.
Rappels - Les rappels d’événements sont représentés dans le tableau Rappels, chaque rangée représentant


Chaque classe inclut ses noms de colonne en tant que propriétés statiques.

La liste 10-25 interroge la table des événements pour chaque événement, créant ainsi un tableau de chaînes contenant le nom et l’identifiant unique de chaque événement.

 

LISTING 10-25 : Interroger la table des événements

  1. // Create a projection that limits the result Cursor
  2. // to the required columns.
  3. String[] projection = {
  4. CalendarContract.Events._ID,CalendarContract.Events.TITLE
  5. } ;
  6. // Get a Cursor over the Events Provider.
  7. Cursor cursor = getContentResolver().query(CalendarContract.Events.CONTENT_URI, projection, null, null, null);
  8. // Get the index of the columns.
  9. int nameIdx = cursor.getColumnIndexOrThrow(CalendarContract.Events.TITLE);
  10. int idIdx = cursor. getColumnIndexOrThrow(CalendarContract.Events._ID);
  11. // Initialize the result set.
  12. String[] result = new String[cursor.getCount()];
  13. // Iterate over the result Cursor.
  14. while(cursor.moveToNext()) {
  15. // Extract the name.
  16. String name = cursor.getString(nameIdx);
  17. // Extract the unique ID.
  18. String id = cursor.getString(idIdx);
  19. result[cursor.getPosition()] = name + " (" + id + ")"; }
  20. // Close the Cursor. cursor.close();


Création d'entrées de calendrier à l'aide d'intentions 

Le fournisseur de contenu du calendrier comprend un mécanisme basé sur l'intention qui vous permet d'effectuer des actions courantes sans avoir besoin d'autorisations spéciales en utilisant l'interface utilisateur de l'application Calendrier. En utilisant Intents, vous pouvez ouvrir l’application Calendrier à une heure précise, afficher les détails de l’événement et insérer un new event.

REMARQUE

Au moment de la rédaction de ce document, la documentation Android décrit également la prise en charge de la modification d'entrées d'agenda à l'aide de Intents. Malheureusement, pour le moment, ce mécanisme ne fonctionne pas comme décrit. Pour modifier des entrées d'agenda, vous pouvez soit interagir directement avec le fournisseur de contenu, soit afficher l'entrée et encourager l'utilisateur à modifier lui-même l'événement.

À l'instar de l'API Contacts, l'utilisation de Intents est la meilleure approche pour manipuler les entrées d'agenda et doit être utilisée de préférence à une manipulation directe des tables sous-jacentes, dans la mesure du possible. À l'aide de l'action Intent.ACTION_INSERT, en spécifiant l'URI CalendarContract.Events.CONTENT_, vous pouvez ajouter de nouveaux événements à un calendrier existant sans nécessiter d'autorisations spéciales.

Votre intention peut inclure des extras qui définissent chacun des attributs de l'événement, y compris le titre, l'heure de début et de fin, l'emplacement et la description, comme indiqué dans le listing 10-26. Une fois déclenché, l’intention sera reçue par l’application Calendrier, qui créera une nouvelle entrée pré-remplie avec les données fournies.

 

LISTING 10-26 : Insertion d'un nouvel événement d'agenda à l'aide d'une intention

  1. // Create a new insertion Intent.
  2. Intent intent = new Intent(Intent.ACTION_INSERT,CalendarContract.Events.CONTENT_URI);
  3. // Add the calendar event details
  4. intent.putExtra(CalendarContract.Events.TITLE, "Book Launch!");
  5. intent.putExtra(CalendarContract.Events.DESCRIPTION,"Professional Android Release!"); intent.putExtra(CalendarContract.Events.EVENT_LOCATION, "Wrox.com");
  6. Calendar startTime = Calendar.getInstance();
  7. startTime.set(2018, 6, 19, 0, 30);
  8. intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startTime.getTimeInMillis());
  9. intent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true);
  10. // Use the Calendar app to add the new event. startActivity(intent);

 

Pour afficher un événement d'agenda, vous devez d'abord connaître son ID de ligne. Pour le trouver, vous devez interroger le fournisseur de contenu des événements, comme décrit précédemment dans cette section. Lorsque vous avez l'ID de l'événement que vous souhaitez afficher, créez une nouvelle intention à l'aide de l'action Intent .ACTION_VIEW et d'un URI qui ajoute l'ID de ligne de l'événement à la fin de CONTENT_URI de la table des événements, comme indiqué dans le listing 10-27.

LISTING 10-27 : Affichage d'un événement de calendrier à l'aide d'une intention

  1. // Create a URI addressing a specific event by its row ID.
  2. // Use it to create a new edit Intent. long rowID = 760;
  3. Uri uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, rowID);
  4. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  5. // Use the Calendar app to view the calendar entry.
  6. startActivity(intent);

 

Pour afficher une date et une heure spécifiques, l'URI doit correspondre au contenu du formulaire: //com.android .calendar / time / [millisecondes depuis l'époque], comme indiqué dans le Listing 10-28.

LISTING 10-28 : Affichage d'une heure sur le calendrier à l'aide d'une intention

  1. // Create a URI that specifies a particular time to view.
  2. Calendar startTime = Calendar.getInstance();
  3. startTime.set(2012, 2, 13, 0, 30);
  4. Uri uri = Uri.parse("content://com.android.calendar/time/"+ String.valueOf(startTime.getTimeInMillis()));
  5. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  6. // Use the Calendar app to view the time. startActivity(intent);


Ajout De Recherche À Votre Application

 Parcourir le contenu de votre application par le biais de la recherche constitue un moyen simple et puissant d’améliorer la découverte de votre contenu et de renforcer l’engagement des utilisateurs. La vitesse est primordiale sur les appareils mobiles, et la recherche aide les utilisateurs à trouver rapidement le contenu dont ils ont besoin dans votre application. Android comprend un cadre qui vous aide à mettre en œuvre une expérience de recherche cohérente avec le système et d’autres applications dans votre application. Vous pouvez fournir des fonctionnalités de recherche pour votre application de plusieurs manières, mais la meilleure solution consiste à utiliser la vue de recherche, incluse en tant qu'action dans la barre des applications, comme indiqué dans son contenu.

forme développée à la figure 10-3. FIGURE 10-3

Il est possible d’ajouter la vue de recherche n’importe où dans votre Mise en page d'activité, même si la barre d'applications est de loin l'emplacement le plus courant. Une vue de recherche peut être configurée pour afficher les suggestions de recherche au fur et à mesure de la frappe, ce qui constitue un mécanisme puissant pour améliorer la réactivité de votre application. Avant de pouvoir activer une vue de recherche dans votre application, vous devez définir ce qui est recherché et comment afficher les résultats.


Définition des métadonnées de votre recherche

La première étape de l’utilisation des fonctions de recherche du système consiste à créer un fichier XML interrogeable définissant les paramètres qui seront utilisés par la vue de recherche.

Créez une nouvelle ressource XML interrogeable dans le dossier res / xml de votre projet. Comme indiqué dans le Listing 10-29, vous devez spécifier l'attribut android: label (généralement le nom de votre application) et un attribut android: hint pour aider les utilisateurs à comprendre ce qu'ils peuvent rechercher. L'indice est typiquement la forme de «Rechercher [type de contenu ou nom de produit]». Notez que l’indicateur doit être une référence à une ressource chaîne. Si vous utilisez une constante de type Chaîne, celle-ci ne sera pas affichée.

 

LISTING 10-29: Définition des métadonnées de recherche d'application

  1. < ?xml version="1.0"encoding="utf-8"? >
  2. <searchable
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:label="@string/app_name"android:hint="@string/search_hint">
  5. < /searchable >

 Dans la section "Fourniture de suggestions de recherche à l'aide d'un fournisseur de contenu", plus loin dans ce chapitre, vous apprendrez à modifier votre configuration pouvant faire l'objet d'une recherche pour fournir des suggestions de recherche au fur et à mesure dans le cadre de recherche de votre application.