今天給大家介紹下Windows Phone 8 的 people hub - 人脈相關的API,瞭解Windows phone的同學一定都知道在windows phone7的API對通訊錄的操作許可權是唯讀 不能直接向通訊錄中新增連絡人... 只能通過其他方式同步連絡人 例如:exchange, save deloge,這樣對一些通訊錄的應用帶來了很多使用者體驗上制約,不過在microsoft最新的Windows phone 8 SDK中開啟的這一限制,支援API層級的通訊錄增刪改查,下面我就給大家介紹一下。
當然在寫代碼之前不要忘記設定WMAppManifest檔案
1. 通訊錄中新增連絡人...
首先給大家介紹的是如何建立一個連絡人至連絡人清單,在SDK 8.0 中的 ContactStore 他用於連絡人操作
ContactStore store = await ContactStore.CreateOrOpenAsync( ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly);
可以看到CreateOrOpenAsync方法中有兩個參數 分別是 ContactStoreSystemAccessMode 和 ContactStoreApplicationAccessMode 兩個枚舉值 這兩個枚舉值比較關鍵 前者是聲明當前應用所建立的連絡人十分可以在People hub中編輯改寫,後者是聲明在其他應用程式中的現實存取權限.
ReadOnly 在people hub中對於系統使用者來說是唯讀 ReadWrite 顧名思義就是可讀寫的。
LimitedReadOnly 對於其他應用程式來說能看到的資訊只是描述資訊和現實圖片 ReadOnly則是可以讀取全部資訊的。
添加一個連絡人的代碼十分簡單
async public void AddContact() { ContactStore store = await ContactStore.CreateOrOpenAsync( ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly); StoredContact contact = new StoredContact(store); //contact.RemoteId = "123"; //contact.Id 唯讀屬性添加成功後系統會自動分配 contact.GivenName = txtGivenName.Text; contact.FamilyName = txtFamilyName.Text; IDictionary<string, object> props = await contact.GetPropertiesAsync(); props.Add(KnownContactProperties.Email, txtMail.Text); props.Add(KnownContactProperties.Telephone, txtPhone.Text); await contact.SaveAsync(); MessageBox.Show("save done"); }
這裡給大家提一下RemoteId 是一個識別連絡人的標示 可以是GUID進行同步修改的時候可以為mapping service上的資料所用,在應用中也支援RemoteId的尋找連絡人。
2. 修改連絡人
async private void UpdateContact(string remoteId, string givenName, string familyName, string email, string codeName) { ContactStore store = await ContactStore.CreateOrOpenAsync(); StoredContact contact = await store.FindContactByRemoteIdAsync(remoteId); if (contact != null) { contact.GivenName = givenName; contact.FamilyName = familyName; IDictionary<string, object> props = await contact.GetPropertiesAsync(); props[KnownContactProperties.Email] = email; IDictionary<string, object> extprops = await contact.GetExtendedPropertiesAsync(); extprops["Codename"] = codeName; await contact.SaveAsync(); } }
修改連絡人的過程和建立十分相似 區別就是可以通過一個RemoteId 或者 ID 擷取到目標連絡人對要修改的欄位進行修改儲存。
3. 刪除連絡人
ContactQueryResult result = store.CreateContactQuery(); IReadOnlyList<StoredContact> contacts = await result.GetContactsAsync(); List<StoredContact> listSC = contacts.ToList(); await store.DeleteContactAsync(listSC[0].Id);
刪除連絡人更為簡單 只需要StoredContact的ID就可以進行刪除操作。
4. 查詢連絡人
查詢連絡人仍然支援7.5的查詢方式(支援過濾條件支援linq)
private void ButtonContacts_Click(object sender, RoutedEventArgs e){ Contacts cons = new Contacts(); //Identify the method that runs after the asynchronous search completes. cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted); //Start the asynchronous search. cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #1");}void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e){ //Do something with the results. MessageBox.Show(e.Results.Count().ToString());}
通訊錄搜尋:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh286416(v=vs.105).aspx
過濾條件:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh286417(v=vs.105).aspx
除此之外還支援使用
CreateContactQuery 擷取ContactStore連絡人清單 支援返回屬性設定和排序
async private void QueryWithDesiredFields() { ContactStore store = await ContactStore.CreateOrOpenAsync(); ContactQueryOptions options = new ContactQueryOptions(); options.DesiredFields.Add(KnownContactProperties.Email); options.OrderBy = ContactQueryResultOrdering.FamilyNameGivenName; ContactQueryResult result = store.CreateContactQuery(options); IReadOnlyList<StoredContact> contacts = await result.GetContactsAsync(); }
經過上述應用添加到people hub中的連絡人顯示也是可以篩選顯示的
進入 人脈 - 設定 - 篩選我的連絡人清單 - 選擇要顯示來自應用的連絡人即可
預設都是選中的
MSDN串連:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207024(v=vs.105).aspx
歡迎大家在這裡和我溝通交流或者在新浪微博上 @王博_Nick