בחלק ראשון של פוסט זה, אסביר כיצד לתשאל את מאגר ה- Contacts של הטלפון. בחלק השני אסביר כיצד לתשאל את ה- Calendar.
Contacts
בגירסת מנגו החדשה יש יכולת לתשאל את מאגר ה- Contacts של הטלפון לקריאה בלבד, ובכך לעשות שימוש במידע כדי להציג מידע זה בצורה שונה או לנצל מידע זה למטרות שונות.
הרעיון המרכזי הוא גישה לאובייקט Contacts וביצוע פעולות חיפוש אסינכרוניות מולו.
נניח לרגע שהאפליקציה הבאה שלכם היא אפשרות חיפוש Contact בעזרת סרגל אותיות. לחיצה על אות מציגה את רשימת ה- Contacts שמתחילים באות זו.
להלן קטע קוד שמדגים כיצד לבצע שאילתה אל מול Contacts:
Code Snippet
- var phoneContacts = new Contacts();
- phoneContacts.SearchCompleted += phoneContacts_SearchCompleted;
- phoneContacts.SearchAsync(string.Empty, FilterKind.DisplayName, null);
Code Snippet
- void phoneContacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
- {
- foreach (var contact in e.Results)
- {
- char firstLetter = contact.DisplayName.FirstOrDefault();
- List<PhoneContact> letterContacts;
- if (!_allContacts.TryGetValue(firstLetter, out letterContacts))
- {
- letterContacts = new List<PhoneContact>();
- _allContacts.Add(firstLetter, letterContacts);
- }
- var phoneContact = new PhoneContact(contact);
- letterContacts.Add(phoneContact);
- }
- }
בקטע קוד המצורף, ניתן לראות שכל מה שצריך לעשות כדי לתשאל את ה- Contacts זה ליצור אובייקט חדש מסוג Contacts ואז להפעיל מטודה SearchAsync עם פרמטר שאומר מה לחפש, ובאיזה אופן. במקרה שלנו אנו מעונינים בכל ה- Contacts ולכן העברתי string.Empty. אפשר במקום להעביר רק אות או מחרוזת מתוך DisplayName או מתוך תכונה אחרת של ה- Contact אותה נציין כפרמטר שני, בעזרת enum: FilterKind.
כתוצאות החיפוש מוכנות, נורה האירוע SearchCompleted, כאן אני מבצע cache של החיפוש כדי לא להפעיל את החיפוש בכל פעם מחדש כשהמשתמש לוחץ על אות.
כדי לא לצרוך זכרון מיותר, יצרתי מחלקה חדשה בשם PhoneContact שמכילה רק את ה- DisplayName והתמונה. אותם משכתי מתוך אובייקט ה- Contact.
Code Snippet
- public class PhoneContact
- {
- public PhoneContact(Contact contact)
- {
- this.DisplayName = contact.DisplayName;
- var stream = contact.GetPicture();
- if (stream != null)
- {
- Picture = PictureDecoder.DecodeJpeg(stream);
- }
- }
- public string DisplayName { get; set; }
- public ImageSource Picture { get; set; }
- }
בחלק הבא אציג כיצד לתשאל את היומן.