Dostawca treści na Androida w Gmailu

Aplikacja Gmail na Androida zawiera dostawcę treści, którego programiści zewnętrzni mogą używać do pobierania informacji o etykietach (takich jak nazwa czy liczba nieprzeczytanych wiadomości) i na bieżąco je aktualizować. Na przykład aplikacja lub widżet może wyświetlać liczbę nieprzeczytanych wiadomości w skrzynce odbiorczej na danym koncie.

Przed użyciem tego dostawcy treści wywołaj metodę GmailContract.canReadLabels(Context), aby określić, czy wersja aplikacji Gmail użytkownika obsługuje te zapytania.

Znajdowanie prawidłowego konta Gmail do wysyłania zapytań

Aplikacja musi najpierw znaleźć adres e-mail prawidłowego konta Gmail w celu wyszukania informacji o etykietach. Mając uprawnienia GET_ACCOUNTS, AccountManager może zwracać te informacje:

// 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 */);

Zapytanie do dostawcy treści

Po wybraniu adresu e-mail możesz uzyskać identyfikator URI ContentProvider, z którym chcesz wysłać zapytanie. Udostępniliśmy prostą klasę o nazwie GmailContract.java, która pozwala utworzyć identyfikator URI i zdefiniować zwracane kolumny.

Aplikacja może przesłać zapytanie bezpośrednio do tego identyfikatora URI (lub jeszcze użyć narzędzia CursorLoader), aby uzyskać kursor z informacjami o wszystkich etykietach na koncie:

Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);

Po zebraniu danych z tego kursora możesz zachować wartość identyfikatora URI w kolumnie GmailContract.Labels.URI, aby wysłać zapytanie i obserwować zmiany w jednej etykietie.

Wartość NAME w przypadku wstępnie zdefiniowanych etykiet może się różnić w zależności od regionu, dlatego nie używaj wartości GmailContract.Labels.NAME. Zamiast tego możesz automatycznie rozpoznać wstępnie zdefiniowane etykiety, takie jak Odebrane, Wysłane lub Wersje robocze, używając wartości ciągu w kolumnie GmailContract.Labels.CANONICAL_NAME:

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

Aby uzyskać dodatkową pomoc, przeczytaj Podstawowe informacje o dostawcy treści

Zobacz przykład

Aby zobaczyć przykład działania tego dostawcy treści, pobierz przykładową aplikację.