Aplikacja Gmail na Androida zawiera dostawcę treści którego deweloperzy zewnętrzni mogą używać do pobierania informacji o etykietach, takich jak nazwa i liczba nieprzeczytanych wiadomości, oraz do aktualizowania tych informacji. Aplikacja lub widget może na przykład wyświetlać liczbę nieprzeczytanych wiadomości w skrzynce odbiorczej określonego konta.
Zanim zaczniesz korzystać z tego dostawcy treści, wywołaj metodę
GmailContract.canReadLabels(Context)
, aby sprawdzić, czy wersja aplikacji Gmail użytkownika
obsługuje te zapytania.
Znajdowanie prawidłowego konta Gmail, na którym można wykonywać zapytania
Aby móc wykonywać zapytania o informacje o etykietach, aplikacja musi najpierw znaleźć adres e-mail prawidłowego konta Gmail. Dzięki uprawnieniu
GET_ACCOUNTS
usługa
AccountManager
może zwrócić 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 */);
Wykonywanie zapytań do dostawcy treści
Po wybraniu adresu e-mail możesz uzyskać identyfikator
ContentProvider
URI, na którym można wykonywać zapytania. Aby utworzyć identyfikator URI i zdefiniować zwracane kolumny, udostępniliśmy klasę
GmailContract. Aplikacja może bezpośrednio wykonywać zapytania do tego identyfikatora URI.
Dzięki danym w Cursor możesz zapisać wartość identyfikatora URI w
GmailContract.Labels.URI
kolumnie, aby wykonywać zapytania i śledzić zmiany dotyczące pojedynczej etykiety.
Wartość NAME w przypadku predefiniowanych etykiet może się różnić w zależności od ustawień regionalnych, dlatego nie używaj
GmailContract.Labels.NAME.
Zamiast tego możesz programowo identyfikować predefiniowane etykiety, takie jak Skrzynka odbiorcza,
Wysłane czy Wersje robocze, za pomocą wartości ciągu znaków w
GmailContract.Labels.CANONICAL_NAME
kolumnie:
// 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.
}
}
}
}
Więcej informacji znajdziesz w artykule Podstawy dostawcy treści.
Przeglądanie przykładu
Aby zobaczyć przykład działania tego dostawcy treści, pobierz przykładową aplikację.