程序聯(lián)系人存儲是第三方的應(yīng)用程序創(chuàng)建的聯(lián)系人數(shù)據(jù),這些聯(lián)系人的數(shù)據(jù)也可以在手機的通訊錄里面進行顯示,但是它們是由創(chuàng)建這些聯(lián)系人數(shù)據(jù)的第三方應(yīng)用程序所管理的。聯(lián)系人數(shù)據(jù)的歸屬應(yīng)用程序可以設(shè)置這些聯(lián)系人數(shù)據(jù)的系統(tǒng)和其他程序的訪問權(quán)限,對屬于它自己的聯(lián)系人具有增刪改的權(quán)限,并且一旦用戶卸載了聯(lián)系人數(shù)據(jù)歸屬應(yīng)用程序,這些聯(lián)系人也會被刪除掉。程序聯(lián)系人存儲的API在空間Windows.Phone.PersonalInformation下,下面來看一下如何去使用這些API來操作聯(lián)系人。
ContactStore類和StoredContact類
ContactStore類表示一個Windows Phone應(yīng)用程序的自定義聯(lián)系人存儲,它是應(yīng)用程序存儲的一個管理者,負責管理應(yīng)用程序所創(chuàng)建的聯(lián)系人。ContactStore類的主要成員如表15.9所示。StoredContact類表示一個應(yīng)用程序自定義的聯(lián)系人存儲,它繼承了IContactInformation接口,所有由應(yīng)用程序創(chuàng)建的聯(lián)系人都是一個StoredContact類的對象。StoredContact類的主要成員如表15.10所示。
表15.9 ContactStore類的主要成員
成員 | 說明 |
public ulong RevisionNumber { get; } | 聯(lián)系人存儲的版本號 |
public ContactQueryResult CreateContactQuery() | 創(chuàng)建一個默認的聯(lián)系人查詢,返回ContactQueryResult對象,包含了存儲中的聯(lián)系人 |
public ContactQueryResult CreateContactQuery(ContactQueryOptions options) | 創(chuàng)建一個自定義的聯(lián)系人查詢,返回ContactQueryResult對象,包含了存儲中的聯(lián)系人 |
public static IAsyncOperation<ContactStore> CreateOrOpenAsync() | 異步方法創(chuàng)建或者打開應(yīng)用程序的自定義聯(lián)系人存儲,假如存儲不存在將創(chuàng)建一個存儲 |
public static IAsyncOperation<ContactStore> CreateOrOpenAsync(ContactStoreSystemAccessMode access, ContactStoreApplicationAccessMode sharing) | 異步方法創(chuàng)建或者打開應(yīng)用程序的自定義聯(lián)系人存儲,假如存儲不存在將創(chuàng)建一個存儲,返回當前的聯(lián)系人存儲對象 access:聯(lián)系人是否可以在手機系統(tǒng)通訊錄里面進行編輯還是只能在應(yīng)用程序中創(chuàng)建 sharing:是否存儲的聯(lián)系人所有屬性都可以在另外的應(yīng)用程序里面進行訪問 |
public IAsyncAction DeleteAsync() | 異步方法刪除應(yīng)用程序的聯(lián)系人存儲 |
public IAsyncAction DeleteContactAsync(string id) | 異步方法通過聯(lián)系人的ID刪除應(yīng)用程序里面存儲的聯(lián)系人 |
public IAsyncOperation<StoredContact> FindContactByIdAsync(string id) | 異步方法通過ID查找應(yīng)用程序的聯(lián)系人,返回StoredContact對象 |
public IAsyncOperation<StoredContact> FindContactByRemoteIdAsync(string id) | 異步方法通過remote ID查找應(yīng)用程序的聯(lián)系人,返回StoredContact對象 |
public IAsyncOperation<IReadOnlyList<ContactChangeRecord>> GetChangesAsync(ulong baseREvisionNumber) | 異步方法通過聯(lián)系人的版本號獲取聯(lián)系人改動記錄 |
public IAsyncOperation<IDictionary<string, object>> LoadExtendedPropertiesAsync() | 異步方法加載應(yīng)用程序聯(lián)系人的擴展屬性Map表 |
public IAsyncAction SaveExtendedPropertiesAsync(IReadOnlyDictionary<string, object> data) | 異步方法保存應(yīng)用程序聯(lián)系人的擴展屬性Map表 |
表15.10 StoredContact類的主要成員
成員 | 說明 |
public StoredContact(ContactStore store) | 通過當前應(yīng)用程序的ContactStore來初始化一個StoredContact對象 |
public StoredContact(ContactStore store, ContactInformation contact) | 通過ContactStore對象和ContactInformation對象來創(chuàng)建一個StoredContact對象,StoredContact對象的信息由ContactInformation對象來提供 |
public string DisplayName { get; set; } | 獲取或設(shè)置一個存儲聯(lián)系人的顯示名稱 |
public IRandomAccessStreamReference DisplayPicture { get; } | 獲取一個存儲聯(lián)系人的圖片 |
public string FamilyName { get; set; } | 獲取或設(shè)置一個存儲聯(lián)系人的家庭姓 |
public string GivenName { get; set; } | 獲取或設(shè)置一個存儲聯(lián)系人的名字 |
public string HonorificPrefix { get; set; } | 獲取或設(shè)置一個存儲聯(lián)系人的尊稱前綴 |
public string HonorificSuffix { get; set; } | 獲取或設(shè)置一個存儲聯(lián)系人的尊稱后綴 |
public string Id { get; } | 獲取應(yīng)用程序存儲聯(lián)系人的ID |
public string RemoteId { get; set; } | 獲取或設(shè)置應(yīng)用程序聯(lián)系人的RemoteId |
public ContactStore Store { get; } | 獲取當前應(yīng)用程序聯(lián)系人所在的聯(lián)系存儲對象 |
public IAsyncOperation<IRandomAccessStream> GetDisplayPictureAsync() | 獲取一個存儲聯(lián)系人的圖片 |
public IAsyncOperation<System.Collections.Generic.IDictionary<string, object>> GetExtendedPropertiesAsync() | 異步方法獲取聯(lián)系人的擴展屬性Map表 |
public IAsyncOperation<System.Collections.Generic.IDictionary<string, object>> GetPropertiesAsync() | 異步方法獲取聯(lián)系人的已知屬性Map表 |
public IAsyncAction ReplaceExistingContactAsync(string id) | 異步方法使用當前的聯(lián)系兒人來替換聯(lián)系人存儲中某個ID的聯(lián)系人 |
public IAsyncAction SaveAsync() | 異步方法保存當前的聯(lián)系人到聯(lián)系人存儲中 |
public IAsyncAction SetDisplayPictureAsync(IInputStream stream) | 異步方法保存當前的聯(lián)系人的圖片 |
public IAsyncOperation<IRandomAccessStream> ToVcardAsync() | 異步方法把當前的聯(lián)系人轉(zhuǎn)化為VCard信息流 |
15.3.2 程序聯(lián)系人的新增
新增程序聯(lián)系人需要先創(chuàng)建或者打開程序的聯(lián)系人存儲ContactStore,并且可以設(shè)置該程序聯(lián)系人存儲的被訪問權(quán)限。創(chuàng)建的代碼如下:
ContactStore conStore = await ContactStore.CreateOrOpenAsync();
聯(lián)系人存儲對于系統(tǒng)通訊和其他程序的都有權(quán)限的限制,ContactStoreSystemAccessMode枚舉表示手機系統(tǒng)通訊錄對應(yīng)用程序聯(lián)系人的訪問權(quán)限,有ReadOnly只讀權(quán)限和ReadWrite讀寫兩個權(quán)限,ContactStoreApplicationAccessMode枚舉表示第三方應(yīng)用程序?qū)?yīng)用程序聯(lián)系人的訪問權(quán)限類型,有LimitedReadOnly限制只讀權(quán)限和ReadOnly只讀權(quán)限。上面的代碼創(chuàng)建聯(lián)系人存儲的代碼是默認用了最低的訪問權(quán)限來來創(chuàng)建聯(lián)系人存儲,即聯(lián)系人對于系統(tǒng)通訊錄是只讀的權(quán)限,對于其他程序的訪問權(quán)限是限制只讀權(quán)限。下面來看一下自定義權(quán)限的創(chuàng)建聯(lián)系人存儲。
//創(chuàng)建一個系統(tǒng)通訊可以讀寫和其他程序只讀的聯(lián)系人存儲
ContactStore conStore = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly);
接下來看一下如何創(chuàng)建一個聯(lián)系人:
1.第一種方式直接通過聯(lián)系人存儲創(chuàng)建聯(lián)系人
//創(chuàng)建或者打開聯(lián)系人存儲
ContactStore conStore = await ContactStore.CreateOrOpenAsync();
//保存聯(lián)系人
StoredContact storedContact = new StoredContact(conStore);
// 設(shè)置聯(lián)系人的展示名稱
storedContact.DisplayName = "展示名稱";
//保存聯(lián)系人
await storedContact.SaveAsync();
2.第二種方式通過ContactInformation類對象創(chuàng)建聯(lián)系人
ContactInformation類表示一個非系統(tǒng)存儲中聯(lián)系人的聯(lián)系人信息。ContactInformation類的主要成員如表15.11所示。
//創(chuàng)建一個ContactInformation類
ContactInformation conInfo = new ContactInformation();
// 獲取ContactInformation類的屬性map表
var properties = await conInfo.GetPropertiesAsync();
//添加電話屬性
properties.Add(KnownContactProperties.Telephone, "123456");
//添加名字屬性
properties.Add(KnownContactProperties.GivenName, "名字");
//創(chuàng)建或者打開聯(lián)系人存儲
ContactStore conStore = await ContactStore.CreateOrOpenAsync();
//保存聯(lián)系人
StoredContact storedContact = new StoredContact(conStore, conInfo);
//保存聯(lián)系人
await storedContact.SaveAsync();
表15.11 ContactInformation類主要成員
成員 | 說明 |
ContactInformation() | 初始化 |
string DisplayName | 聯(lián)系人的顯示名字 |
IRandomAccessStreamReference DisplayPicture | 聯(lián)系人圖片信息 |
string FamilyName | 聯(lián)系人姓 |
string GivenName | 名字 |
string HonorificPrefix | 尊稱前綴 |
string HonorificSuffix | 尊稱后綴 |
IAsyncOperation<IRandomAccessStream> GetDisplayPictureAsync() | 異步獲取聯(lián)系人圖片 |
IAsyncOperation<System.Collections.Generic.IDictionary <string, object>> GetPropertiesAsync() | 異步獲取聯(lián)系人的Map表信息 |
IAsyncOperation<ContactInformation> ParseVcardAsync(IInputStream vcard) | 異步解析一個VCard數(shù)據(jù)流為ContactInformation對象 |
IAsyncAction SetDisplayPictureAsync(IInputStream stream) | 異步設(shè)置聯(lián)系人的圖片通過圖片數(shù)據(jù)流 |
IAsyncOperation<IRandomAccessStream> ToVcardAsync() | 異步轉(zhuǎn)換ContactInformation對象為一個VCard信息流 |
程序聯(lián)系人的查詢
聯(lián)系人查詢也需要創(chuàng)建聯(lián)系人存儲,創(chuàng)建聯(lián)系人存儲的形式和聯(lián)系人新增是一樣的。聯(lián)系人查詢是通過ContactStore的CreateContactQuery方法來創(chuàng)建一個查詢,可以查詢的參數(shù)ContactQueryOptions來設(shè)置查詢返回的結(jié)果和排序的規(guī)則,創(chuàng)建的查詢時ContactQueryResult類型?梢酝ㄟ^ContactQueryResult類的GetContactsAsync異步方法獲取聯(lián)系人存儲中的聯(lián)系人列表和通過GetCurrentQueryOptions方法獲取當前的查詢條件。下面來看創(chuàng)建聯(lián)系人查詢的代碼如下:
conStore = await ContactStore.CreateOrOpenAsync();
ContactQueryResult conQueryResult = conStore.CreateContactQuery();
uint count = await conQueryResult.GetContactCountAsync();
IReadOnlyList<StoredContact> conList = await conQueryResult.GetContactsAsync();
程序聯(lián)系人的編輯
聯(lián)系人編輯刪除也需要創(chuàng)建聯(lián)系人存儲,創(chuàng)建聯(lián)系人存儲的形式和聯(lián)系人新增是一樣的。聯(lián)系人的編輯需要首先要獲取要編輯的聯(lián)系人,獲取編輯的聯(lián)系人可以通過聯(lián)系人的id或者remoteid來獲取,獲取到的聯(lián)系人是一個StoredContact對象,通過修改該對象的屬性,然后再調(diào)用SaveAsync保存方法就可以實現(xiàn)編輯聯(lián)系人了。刪除聯(lián)系人的可以分為刪除一個聯(lián)系人和刪除所有的聯(lián)系人,刪除一個聯(lián)系人的可以通過聯(lián)系人的id然后調(diào)用ContactStore的DeleteContactAsync方法來進行刪除,如果要刪除所有的聯(lián)系人那么就要調(diào)用ContactStore的DeleteAsync方法。聯(lián)系人的新增,編輯和刪除都會有相關(guān)的操作記錄,GetChangesAsync方法來獲取聯(lián)系人的修改記錄。下面來看一下修改一個聯(lián)系人的代碼:
ContactStore conStore = await ContactStore.CreateOrOpenAsync();
StoredContact storCon = await conStore.FindContactByIdAsync(id);
var properties = await storCon.GetPropertiesAsync();
properties[KnownContactProperties.Telephone] = "12345678";
await storCon.SaveAsync();
程序聯(lián)系人的刪除
刪除聯(lián)系人的可以分為刪除一個聯(lián)系人和刪除所有的聯(lián)系人,刪除一個聯(lián)系人的可以通過聯(lián)系人的id然后調(diào)用ContactStore的DeleteContactAsync方法來進行刪除,如果要刪除所有的聯(lián)系人那么就要調(diào)用ContactStore的DeleteAsync方法。聯(lián)系人的新增,編輯和刪除都會有相關(guān)的操作記錄,GetChangesAsync方法來獲取聯(lián)系人的修改記錄。下面來看一下刪除一個聯(lián)系人的代碼:
ContactStore conStore = await ContactStore.CreateOrOpenAsync();
await conStore.DeleteContactAsync (id);
await conStore.DeleteAsync ();
實例演示聯(lián)系人存儲的使用
下面給出查詢?nèi)粘贪才诺氖纠翰樵兪謾C里面所有的日程安排信息。
代碼清單15-3:聯(lián)系人存儲的增刪改(源代碼:第15章\Examples_15_3)
MainPage.xaml文件主要代碼:聯(lián)系人新增頁面
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock HorizontalAlignment="Left" Text="名字" FontSize="30"/> <TextBox HorizontalAlignment="Left" x:Name="name" Height="85" Text="" Width="296"/> <TextBlock HorizontalAlignment="Left" Text="電話" FontSize="30" /> <TextBox HorizontalAlignment="Left" x:Name="phone" Height="85" Text="" Width="296"/> <Button Content="保存" HorizontalAlignment="Left" Width="308" Height="91" Click="Button_Click_1"/> <Button Content="查詢應(yīng)用存儲的聯(lián)系人" HorizontalAlignment="Left" Width="308" Height="91" Click="Button_Click_2"/> </StackPanel> </Grid>
MainPage.xaml.cs文件主要代碼
// 新增一個聯(lián)系人 private async void Button_Click_1(object sender, RoutedEventArgs e) { if (name.Text != "" && phone.Text != "") { try { // 創(chuàng)建一個聯(lián)系人的信息對象 ContactInformation conInfo = new ContactInformation(); // 獲取聯(lián)系人的屬性字典 var properties = await conInfo.GetPropertiesAsync(); // 添加聯(lián)系人的屬性 properties.Add(KnownContactProperties.Telephone, phone.Text); properties.Add(KnownContactProperties.GivenName, name.Text); // 創(chuàng)建或者打開聯(lián)系人存儲 ContactStore conStore = await ContactStore.CreateOrOpenAsync(); StoredContact storedContact = new StoredContact(conStore, conInfo); // 保存聯(lián)系人 await storedContact.SaveAsync(); MessageBox.Show("保存成功"); } catch (Exception ex) { MessageBox.Show("保存失敗,錯誤信息:" + ex.Message); } } else { MessageBox.Show("名字或電話不能為空"); } } // 跳轉(zhuǎn)到聯(lián)系人列表頁面 private void Button_Click_2(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/ContactsList.xaml", UriKind.Relative)); }
ContactsList.xaml文件主要代碼:聯(lián)系人列表頁面
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <ListBox x:Name="conListBox" ItemsSource="{Binding}" > <ListBox.ItemTemplate > <DataTemplate> <StackPanel> <TextBlock Text="{Binding Name}" /> <TextBlock Text="{Binding Id}" /> <TextBlock Text="{Binding Phone}" /> <Button Content="刪除" HorizontalAlignment="Left" Width="308" Height="91" Click="Button_Click_1"/> <Button Content="編輯" HorizontalAlignment="Left" Width="308" Height="91" Click="Button_Click_2"/> <TextBlock Text="————————————————————————" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </Grid>
ContactsList.xaml.cs文件主要代碼
private ContactStore conStore;//聯(lián)系人存儲 public ContactsList() { InitializeComponent(); } // 進入頁面事件 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { GetContacts(); base.OnNavigatedTo(e); } // 獲取聯(lián)系人列表 async private void GetContacts() { conStore = await ContactStore.CreateOrOpenAsync(); ContactQueryResult conQueryResult = conStore.CreateContactQuery(); // 查詢聯(lián)系人 IReadOnlyList<StoredContact> conList = await conQueryResult.GetContactsAsync(); List<Item> list = new List<Item>(); foreach (StoredContact storCon in conList) { var properties = await storCon.GetPropertiesAsync(); list.Add( new Item { Name = storCon.FamilyName + storCon.GivenName, Id = storCon.Id, Phone = properties[KnownContactProperties.Telephone].ToString() }); } conListBox.ItemsSource = list; } // 刪除聯(lián)系人事件處理 private async void Button_Click_1(object sender, RoutedEventArgs e) { Button deleteButton = sender as Button; Item deleteItem = deleteButton.DataContext as Item; await conStore.DeleteContactAsync(deleteItem.Id); GetContacts(); } // 跳轉(zhuǎn)到編輯聯(lián)系人頁面 private void Button_Click_2(object sender, RoutedEventArgs e) { Button deleteButton = sender as Button; Item editItem = deleteButton.DataContext as Item; NavigationService.Navigate(new Uri("/EditContact.xaml?Id=" + editItem.Id, UriKind.Relative)); } } // 自定義綁定的聯(lián)系人數(shù)據(jù)對象 class Item { public string Name { get; set; } public string Id { get; set; } public string Phone { get; set; } }
EditContact.xaml文件主要代碼:聯(lián)系人編輯頁面
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock HorizontalAlignment="Left" Text="名字" FontSize="30"/> <TextBox HorizontalAlignment="Left" x:Name="name" Height="85" Text="" Width="296"/> <TextBlock HorizontalAlignment="Left" Text="電話" FontSize="30" /> <TextBox HorizontalAlignment="Left" x:Name="phone" Height="85" Text="" Width="296"/> <Button Content="保存" HorizontalAlignment="Left" Width="308" Height="91" Click="Button_Click_1"/> </StackPanel> </Grid>
EditContact.xaml.cs文件主要代碼
private string conId = ""; private ContactStore conStore;//聯(lián)系人數(shù)據(jù)存儲 private StoredContact storCon; //聯(lián)系人對象 private IDictionary<string, object> properties;//聯(lián)系人屬性字典 public EditContact() { InitializeComponent(); } // 進入頁面事件處理 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { // 通過聯(lián)系人的id獲取聯(lián)系人的信息 if (NavigationContext.QueryString.ContainsKey("Id")) { conId = NavigationContext.QueryString["Id"].ToString(); GetContact(conId); } base.OnNavigatedTo(e); } // 保存編輯的聯(lián)系人 private async void Button_Click_1(object sender, RoutedEventArgs e) { if (name.Text != "" && phone.Text != "") { storCon.GivenName = name.Text; properties[KnownContactProperties.Telephone] = phone.Text; await storCon.SaveAsync();//保存聯(lián)系人 NavigationService.GoBack(); //返回上一個頁面 } else { MessageBox.Show("名字或者電話不能為空"); } } // 獲取需要編輯的聯(lián)系人信息 async private void GetContact(string id) { conStore = await ContactStore.CreateOrOpenAsync(); storCon = await conStore.FindContactByIdAsync(id); properties = await storCon.GetPropertiesAsync(); name.Text = storCon.GivenName; phone.Text = properties[KnownContactProperties.Telephone].ToString(); } phone.Text = properties[KnownContactProperties.Telephone].ToString(); }
程序的運行效果如圖所示