Gmail용 Android 콘텐츠 제공업체

Android Gmail 앱에는 서드 파티 개발자가 이름 및 읽지 않은 개수와 같은 라벨 정보를 가져오고 정보가 변경될 때마다 최신 상태를 유지하는 데 사용할 수 있는 콘텐츠 제공업체가 포함되어 있습니다. 예를 들어 앱이나 위젯이 특정 계정의 받은편지함 중 읽지 않은 개수를 표시할 수 있습니다.

이 콘텐츠 제공자를 사용하기 전에 GmailContract.canReadLabels(Context) 메서드를 호출하여 사용자 버전의 Gmail 앱에서 이러한 쿼리를 지원하는지 확인합니다.

쿼리할 올바른 Gmail 계정 찾기

앱은 먼저 유효한 Gmail 계정의 이메일 주소를 찾아 라벨 정보를 쿼리해야 합니다. GET_ACCOUNTS 권한이 있으면 AccountManager가 다음 정보를 반환할 수 있습니다.

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

콘텐츠 제공업체 쿼리

이메일 주소를 선택하면 쿼리할 ContentProvider URI를 가져올 수 있습니다. GmailContract.java라는 간단한 클래스를 제공하여 URI를 구성하고 반환되는 열을 정의합니다.

앱은 이 URI를 직접 쿼리하거나 CursorLoader를 사용하여 계정의 모든 라벨에 관한 정보로 커서를 가져올 수 있습니다.

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

그런 다음 이 커서의 데이터가 있는 GmailContract.Labels.URI 열의 URI 값을 유지하여 단일 라벨의 변경사항을 쿼리하고 감시할 수 있습니다.

사전 정의된 라벨의 NAME 값은 언어에 따라 다를 수 있으므로 GmailContract.Labels.NAME는 사용하지 마세요. 대신 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
        }
    }
}

자세한 내용은 콘텐츠 제공자 기본사항을 참고하세요.

예시 검토

이 콘텐츠 제공업체의 실제 작동 예를 보려면 샘플 앱을 다운로드하세요.