L'app Gmail per Android include un content provider che gli sviluppatori di terze parti possono utilizzare per recuperare le informazioni sulle etichette, come il nome e il conto delle email non lette, e rimanere aggiornati man mano che queste informazioni cambiano. Ad esempio, un'app o un widget potrebbe mostrare il numero di messaggi non letti della 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.
Trovare un account Gmail valido per eseguire una 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 le seguenti 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 */);
Esegui una query sul fornitore di contenuti
Dopo aver selezionato un indirizzo email, puoi ottenere un URI ContentProvider
su cui eseguire query. Abbiamo fornito una semplice classe chiamata
GmailContract.java
per creare l'URI e definire le colonne restituite.
Un'app può eseguire query direttamente su questo URI o, meglio ancora, utilizzare un
CursorLoader
per ottenere un cursore con le 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 dell'URI nella colonna GmailContract.Labels.URI
per eseguire query e monitorare le modifiche in una singola etichetta.
Il valore NAME
per le etichette predefinite può variare in base alle impostazioni internazionali, quindi non
utilizzare GmailContract.Labels.NAME
. In alternativa, puoi identificare programmaticamente 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, consulta Nozioni di base per i fornitori di contenuti
Esamina un esempio
Per vedere un esempio di questo fornitore di contenuti in azione, scarica un'app di esempio.