Android-Inhaltsanbieter für Gmail

Die Gmail App für Android enthält einen Content Anbieter , mit dem Drittanbieter-Entwickler Labelinformationen wie Name und Anzahl der ungelesenen Nachrichten abrufen und sich über Änderungen dieser Informationen auf dem Laufenden halten können. So könnte eine App oder ein Widget beispielsweise die Anzahl der ungelesenen Nachrichten im Posteingang eines bestimmten Kontos anzeigen.

Bevor Sie diesen Contentanbieter verwenden, rufen Sie die GmailContract.canReadLabels(Context) Methode auf, um zu ermitteln, ob die Gmail App-Version des Nutzers diese Abfragen unterstützt.

Gültiges Gmail-Konto für Abfragen suchen

Eine App muss zuerst die E-Mail-Adresse eines gültigen Gmail-Kontos finden, um Labelinformationen abzufragen. Mit der GET_ACCOUNTS Berechtigung 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

Nachdem Sie eine E-Mail-Adresse ausgewählt haben, können Sie einen ContentProvider URI abrufen, um Abfragen auszuführen. Wir haben eine Klasse namens GmailContract bereitgestellt, mit der Sie den URI erstellen und die zurückgegebenen Spalten definieren können. Eine App kann diesen URI direkt abfragen.

Mit den Daten im Cursor können Sie den URI-Wert in der GmailContract.Labels.URI Spalte speichern, um Abfragen auszuführen und Änderungen an einem einzelnen Label zu beobachten.

Der Wert NAME 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 mithilfe des Stringwerts in der GmailContract.Labels.CANONICAL_NAME Spalte identifizieren:

// Query for all labels and find the Inbox.
try (Cursor labelsCursor = getContentResolver().query(
        GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null)) {
    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 ein Beispiel für diesen Contentanbieter in Aktion sehen möchten, laden Sie eine Beispiel App herunter.