L'app Gmail per Android include un fornitore di contenuti che gli sviluppatori di terze parti possono utilizzare per recuperare informazioni sulle etichette, come il nome e il numero di messaggi da leggere, e rimanere aggiornati con l'evoluzione delle informazioni. Ad esempio, in un'app o in un widget potrebbe essere visualizzato il numero dei messaggi da leggere nella posta in arrivo 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 per la query
Per poter eseguire query sulle informazioni relative alle etichette, un'app deve prima trovare l'indirizzo email di un account Gmail valido. 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 */);
Esecuzione di query sul fornitore di contenuti
Con un indirizzo email selezionato, puoi ottenere un URI
ContentProvider
su cui eseguire query. Abbiamo fornito una semplice classe chiamata GmailContract.java
per costruire l'URI e definire le colonne restituite.
Un'app può eseguire query direttamente su questo URI, o ancora meglio, tramite CursorLoader
per ottenere un cursore con informazioni per 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 mantenere il valore URI nella colonna GmailContract.Labels.URI
per eseguire query e osservare le modifiche su una singola etichetta.
Il valore NAME
per le etichette predefinite può variare a seconda delle impostazioni internazionali, quindi non utilizzare GmailContract.Labels.NAME
. Puoi invece identificare in modo programmatico le etichette predefinite come Posta in arrivo, Inviate o Bozze utilizzando il valore String 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 ulteriori informazioni, leggi la pagina Nozioni di base sui fornitori di contenuti
Esamina un esempio
Per avere un esempio del funzionamento di questo provider di contenuti, scarica un'app di esempio.