Die Android Gmail App enthält einen Content-Provider, über den Drittentwickler Labelinformationen wie Name und Anzahl der ungelesenen Nachrichten abrufen und sich über Änderungen dieser Informationen auf dem Laufenden halten können. Beispielsweise könnte eine App oder ein Widget die Anzahl der ungelesenen Nachrichten im Posteingang eines bestimmten Kontos anzeigen.
Bevor Sie diesen Contentanbieter verwenden, rufen Sie die Methode GmailContract.canReadLabels(Context)
auf, um zu ermitteln, ob die Version der Gmail App des Nutzers diese Anfragen unterstützt.
Gültiges Gmail-Konto für die Anfrage finden
Eine App muss zuerst die E‑Mail-Adresse eines gültigen Gmail-Kontos finden, um Labelinformationen abzufragen. Mit der Berechtigung GET_ACCOUNTS
kann die AccountManager
folgende Informationen zurückgeben:
// 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 */);
Contentanbieter abfragen
Wenn Sie eine E-Mail-Adresse ausgewählt haben, können Sie einen ContentProvider
-URI für Abfragen abrufen. Wir haben eine einfache Klasse namens GmailContract.java
bereitgestellt, um den URI zu erstellen und die zurückgegebenen Spalten zu definieren.
Eine App kann diesen URI direkt abfragen oder besser noch einen CursorLoader
verwenden, um einen Cursor mit Informationen zu allen Labels in einem Konto abzurufen:
Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);
Mit den Daten in diesem Cursor können Sie den URI-Wert in der Spalte GmailContract.Labels.URI
speichern, um Änderungen an einem einzelnen Label abzufragen und zu beobachten.
Der NAME
-Wert für vordefinierte Labels kann je nach Gebietsschema variieren. Verwenden Sie daher nicht GmailContract.Labels.NAME
. Stattdessen können Sie vordefinierte Labels wie „Posteingang“, „Gesendet“ oder „Entwürfe“ programmatisch anhand des String-Werts in der Spalte GmailContract.Labels.CANONICAL_NAME
identifizieren:
// 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
}
}
}
Weitere Informationen finden Sie unter Contentanbieter – Grundlagen.
Beispiel ansehen
Wenn Sie ein Beispiel für diesen Contentanbieter in Aktion sehen möchten, laden Sie eine Beispiel-App herunter.