Provider di contenuti Android per Gmail

L'app Gmail per Android include un fornitore di contenuti che gli sviluppatori di terze parti possono utilizzare per recuperare le informazioni sulle etichette, ad esempio il nome e il numero dei messaggi da leggere, e di tenersi aggiornati man mano che queste informazioni cambiano. Ad esempio, un'app o un widget potrebbe visualizzare il numero dei messaggi non letti della casella di posta di un account specifico.

Prima di utilizzare questo fornitore di contenuti, chiama il metodo GmailContract.canReadLabels(Context) per determinare se la versione dell'app Gmail dell'utente supporta queste query.

Trova un account Gmail valido su cui eseguire query

Un'app deve prima trovare l'indirizzo email di un account Gmail valido per eseguire query sulle informazioni sulle etichette. Con l'autorizzazione GET_ACCOUNTS, AccountManager può restituire queste informazioni:

// 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 */);

Invia una query al fornitore di contenuti

Con un indirizzo email selezionato, puoi ottenere un URI ContentProvider su cui eseguire una query. Abbiamo fornito una semplice classe denominata GmailContract.java per creare l'URI e definire le colonne restituite.

Un'app può eseguire query su questo URI direttamente o, meglio ancora, utilizzare un CursorLoader per ottenere un cursore con le informazioni su tutte le etichette di un account:

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

Con i dati in questo cursore, puoi quindi mantenere il valore URI nella colonna GmailContract.Labels.URI per eseguire query e verificare le modifiche su una singola etichetta.

Il valore NAME per le etichette predefinite può variare in base alle impostazioni internazionali, quindi non utilizzare GmailContract.Labels.NAME. Puoi invece identificare in modo programmatico le etichette predefinite come Posta in arrivo, Inviati o Bozze utilizzando il valore Stringa nella colonna 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
        }
    }
}

Per ulteriore assistenza, leggi le nozioni di base sul fornitore di contenuti

Esamina un esempio

Per vedere un esempio in azione di questo fornitore di contenuti, scarica un'app di esempio.