برنامه اندروید جیمیل شامل یک ارائهدهنده محتوا است که توسعهدهندگان شخص ثالث میتوانند از آن برای بازیابی اطلاعات برچسب، مانند نام و تعداد ایمیلهای خوانده نشده، استفاده کنند و با تغییر این اطلاعات، بهروز بمانند. به عنوان مثال، یک برنامه یا ویجت میتواند تعداد ایمیلهای خوانده نشده صندوق ورودی یک حساب خاص را نمایش دهد.
قبل از استفاده از این ارائه دهنده محتوا، متد GmailContract.canReadLabels(Context) را فراخوانی کنید تا مشخص شود که آیا نسخه کاربر برنامه 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 */);
از ارائه دهنده محتوا سوال کنید
با انتخاب یک آدرس ایمیل، میتوانید یک URL ContentProvider برای پرسوجو دریافت کنید. ما کلاسی به نام GmailContract ارائه دادهایم تا URI را بسازد و ستونهای برگشتی را تعریف کند. یک برنامه میتواند مستقیماً از این URI پرسوجو کند.
با دادههای موجود در Cursor ، میتوانید مقدار URI را در ستون GmailContract.Labels.URI حفظ کنید تا تغییرات را روی یک برچسب واحد جستجو و مشاهده کنید.
مقدار NAME برای برچسبهای از پیش تعریف شده میتواند بسته به زبان متفاوت باشد، بنابراین GmailContract.Labels.NAME استفاده نکنید. در عوض، میتوانید برچسبهای از پیش تعریف شده مانند Inbox، Sent یا Drafts را با استفاده از مقدار رشتهای در ستون GmailContract.Labels.CANONICAL_NAME به صورت برنامهنویسی شناسایی کنید:
// 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.
}
}
}
}
برای اطلاعات بیشتر، به اصول اولیه ارائه دهنده محتوا مراجعه کنید.
بررسی یک مثال
برای دیدن نمونهای از این ارائهدهنده محتوا در عمل، یک برنامه نمونه را دانلود کنید .