Fournisseur de contenu Android pour Gmail

L'application Gmail pour Android inclut un fournisseur de contenu que les développeurs tiers peuvent utiliser pour récupérer des informations sur les libellés, telles que le nom et le nombre de pages non lues, et pour rester à jour à mesure que ces informations changent. Par exemple, une application ou un widget peut afficher le nombre de messages non lus dans la boîte de réception d'un compte spécifique.

Avant d'utiliser ce fournisseur de contenu, appelez la méthode GmailContract.canReadLabels(Context) pour déterminer si la version de l'application Gmail de l'utilisateur est compatible avec ces requêtes.

Trouver un compte Gmail valide pour envoyer une requête

Une application doit d'abord trouver l'adresse e-mail d'un compte Gmail valide pour rechercher des informations sur les libellés. Avec l'autorisation GET_ACCOUNTS, AccountManager peut renvoyer les informations suivantes:

// Get the account list, and pick the first one
final String ACCOUNT_TYPE_GOOGLE = "com.google";
final String[] FEATURES_MAIL = {
        "service_mail"
};
AccountManager.get(this).getAccountsByTypeAndFeatures(ACCOUNT_TYPE_GOOGLE, FEATURES_MAIL,
        new AccountManagerCallback() {
            @Override
            public void run(AccountManagerFuture future) {
                Account[] accounts = null;
                try {
                    accounts = future.getResult();
                    if (accounts != null && accounts.length > 0) {
                        String selectedAccount = accounts[0].name;
                        queryLabels(selectedAccount);
                    }

                } catch (OperationCanceledException oce) {
                    // TODO: handle exception
                } catch (IOException ioe) {
                    // TODO: handle exception
                } catch (AuthenticatorException ae) {
                    // TODO: handle exception
                }
            }
        }, null /* handler */);

Interroger le fournisseur de contenu

Après avoir sélectionné une adresse e-mail, vous pouvez obtenir un URI ContentProvider à interroger. Nous avons fourni une classe simple appelée GmailContract.java pour construire l'URI et définir les colonnes renvoyées.

Une application peut interroger cet URI directement ou, mieux encore, utiliser un CursorLoader pour obtenir un curseur contenant les informations de tous les libellés d'un compte:

Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);

Avec les données dans ce curseur, vous pouvez ensuite conserver la valeur de l'URI dans la colonne GmailContract.Labels.URI pour interroger et surveiller les modifications sur une seule étiquette.

La valeur NAME des étiquettes prédéfinies peut varier en fonction des paramètres régionaux. Par conséquent, n'utilisez pas GmailContract.Labels.NAME. À la place, vous pouvez identifier de manière programmatique des libellés prédéfinis tels que "Boîte de réception", "Messages envoyés" ou "Brouillons" à l'aide de la valeur de chaîne de la colonne GmailContract.Labels.CANONICAL_NAME:

// loop through the cursor and find the Inbox
if (labelsCursor != null) {
    final String inboxCanonicalName = GmailContract.Labels.LabelCanonicalName.CANONICAL_NAME_INBOX;
    final int canonicalNameIndex = labelsCursor.getColumnIndexOrThrow(GmailContract.Labels.CANONICAL_NAME);
    while (labelsCursor.moveToNext()) {
        if (inboxCanonicalName.equals(labelsCursor.getString(canonicalNameIndex))) {
            // this row corresponds to the Inbox
        }
    }
}

Pour en savoir plus, consultez Principes de base des fournisseurs de contenu.

Consulter un exemple

Pour voir un exemple de ce fournisseur de contenu en action, téléchargez une application exemple.