Android-Inhaltsanbieter für Gmail

Die Gmail-App für Android umfasst einen Inhaltsanbieter, über den Drittanbieter-Entwickler Labelinformationen wie Name und Anzahl der ungelesenen Nachrichten abrufen und bei Änderungen der Informationen auf dem neuesten Stand bleiben können. Beispielsweise kann eine App oder ein Widget die Anzahl der ungelesenen E-Mails 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.

Ein gültiges Gmail-Konto für die Abfrage finden

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 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

Bei ausgewählter E-Mail-Adresse können Sie dann einen ContentProvider-URI für die Abfrage 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 noch besser CursorLoader verwenden, um einen Cursor mit Informationen für alle 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 dann den URI-Wert in der Spalte GmailContract.Labels.URI beibehalten, um ein einzelnes Label abzufragen und auf Änderungen zu achten.

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“ programmatisch anhand 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 zu Contentanbietern.

Beispiel ansehen

Wenn Sie ein Beispiel für diesen Inhaltsanbieter in Aktion sehen möchten, laden Sie eine Beispiel-App herunter.