Die Gmail App für Android umfasst einen Inhaltsanbieter, mit dem Entwickler Labelinformationen wie Name und ungelesene Nachrichten abrufen und bei Änderungen dieser Informationen auf dem Laufenden bleiben können. Beispielsweise kann in einer App oder in einem Widget die Anzahl der ungelesenen Nachrichten im Posteingang eines bestimmten Kontos angezeigt werden.
Bevor Sie diesen Contentanbieter verwenden, rufen Sie die Methode GmailContract.canReadLabels(Context)
auf, um festzustellen, ob die Version der Gmail App des Nutzers diese Abfragen unterstützt.
Gültiges Gmail-Konto zum Abfragen finden
Eine Anwendung muss zuerst die E-Mail-Adresse eines gültigen Gmail-Kontos finden, um Labelinformationen abzufragen. Mit der Berechtigung GET_ACCOUNTS
kann AccountManager
diese 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
Mit einer ausgewählten E-Mail-Adresse können Sie dann einen ContentProvider
-URI für die Abfrage abrufen. Wir haben eine einfache Klasse mit dem Namen GmailContract.java
bereitgestellt, um den URI zu erstellen und die zurückgegebenen Spalten zu definieren.
Eine Anwendung kann diesen URI direkt abfragen oder – noch besser – CursorLoader
verwenden, um einen Cursor mit Informationen für alle Labels eines Kontos zu erhalten:
Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);
Mit den Daten in diesem Cursor können Sie dann den URI-Wert in der Spalte GmailContract.Labels.URI
beibehalten, um Änderungen an einem einzelnen Label abzufragen und zu beobachten.
Der Wert NAME
für vordefinierte Labels kann je nach Sprache variieren. Verwenden Sie daher nicht GmailContract.Labels.NAME
. Stattdessen können Sie vordefinierte Labels wie Posteingang, Gesendet oder Entwürfe mithilfe des Stringwerts in der Spalte GmailContract.Labels.CANONICAL_NAME
programmatisch 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 Grundlagen des Contentanbieters.
Beispiel ansehen
Hier können Sie eine Beispielanwendung herunterladen, um ein Beispiel für diesen Inhaltsanbieter in Aktion zu sehen.