Die Gmail App für Android umfasst einen Contentanbieter, mit dem Drittanbieter-Entwickler Labelinformationen wie Name und Anzahl der ungelesenen Labels abrufen und bei Änderungen dieser Informationen auf dem Laufenden bleiben können. Beispielsweise könnte eine App oder ein Widget die Anzahl der ungelesenen Nachrichten im Posteingang eines bestimmten Kontos anzeigen.
Bevor Sie diesen Inhaltsanbieter 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 für die Abfrage suchen
Eine Anwendung muss zuerst die E-Mail-Adresse eines gültigen Gmail-Kontos finden, um Labelinformationen abzufragen. Mit der Berechtigung GET_ACCOUNTS
kann der AccountManager
die folgenden 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
Nachdem Sie eine E-Mail-Adresse ausgewählt haben, können Sie 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 App kann diesen URI direkt abfragen. Noch besser ist es, einen CursorLoader
zu verwenden, um einen Cursor mit Informationen zu allen Labels in einem Konto zu erhalten:
Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);
Wenn sich die Daten in diesem Cursor befinden, können Sie den URI-Wert in der Spalte GmailContract.Labels.URI
beibehalten, um ein einzelnes Label abzufragen und auf Änderungen zu prüfen.
Der Wert NAME
für vordefinierte Labels kann je nach Sprache variieren. Verwenden Sie daher GmailContract.Labels.NAME
nicht. Stattdessen können Sie vordefinierte Labels wie „Posteingang“, „Gesendet“ oder „Entwürfe“ programmatisch mithilfe des Stringwerts 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 Grundlagen von Contentanbietern.
Beispiel ansehen
Wenn Sie sich ein Beispiel für diesen Contentanbieter in der Praxis ansehen möchten, laden Sie eine Beispiel-App herunter.