برنامه اندروید جیمیل شامل یک ارائهدهنده محتوا است که توسعهدهندگان شخص ثالث میتوانند از آن برای بازیابی اطلاعات برچسب مانند نام و تعداد ایمیلهای خوانده نشده استفاده کنند و با تغییر این اطلاعات، بهروز بمانند. به عنوان مثال، یک برنامه یا ویجت میتواند تعداد ایمیلهای خوانده نشده صندوق ورودی یک حساب خاص را نمایش دهد.
قبل از استفاده از این ارائه دهنده محتوا، متد 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.java برای ساخت URI و تعریف ستونهای برگشتی ارائه دادهایم.
یک برنامه میتواند مستقیماً از این URI پرسوجو کند - یا بهتر از آن، از یک CursorLoader استفاده کند - تا یک Cursor با اطلاعات مربوط به همه برچسبهای یک حساب کاربری به دست آورد:
Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);
با دادههای موجود در این مکاننما، میتوانید مقدار URI را در ستون GmailContract.Labels.URI حفظ کنید تا تغییرات را روی یک برچسب واحد جستجو و مشاهده کنید.
مقدار NAME برای برچسبهای از پیش تعریف شده میتواند بسته به زبان متفاوت باشد، بنابراین GmailContract.Labels.NAME استفاده نکنید. در عوض، میتوانید برچسبهای از پیش تعریف شده مانند Inbox، Sent یا Drafts را با استفاده از مقدار String در ستون 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
}
}
}
برای اطلاعات بیشتر، اصول اولیه ارائه دهنده محتوا را مطالعه کنید.
بررسی یک مثال
برای دیدن نمونهای از این ارائهدهنده محتوا در عمل، یک برنامه نمونه را دانلود کنید .