【发布时间】:2011-01-30 02:34:19
【问题描述】:
如何获取 windows 7 手机的联系人列表以在 win7 手机应用程序中使用?
【问题讨论】:
标签: c# windows-phone-7 xna
如何获取 windows 7 手机的联系人列表以在 win7 手机应用程序中使用?
【问题讨论】:
标签: c# windows-phone-7 xna
使用较早版本的 Windows Phone 7 SDK,只能使用选择器检索电话号码或电子邮件地址等。现在,使用 7.1 Mango SDK,可以从联系人中检索更多信息,例如Address、DisplayName、EmailAddresses 等。
我将向您展示如何使用 C# 从 Windows Phone 7 中检索所有联系人。
Contacts 类在命名空间 Microsoft.Phone.UserData 中定义,并从 PhoneDataSharingContext 扩展而来,并提供了一些用于与用户的联系人数据交互的方法和事件。
public MainPage()
{
InitializeComponent();
Contacts objContacts = new Contacts();
objContacts.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(objContacts_SearchCompleted);
objContacts.SearchAsync(string.Empty, FilterKind.None, null);
}
void objContacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
foreach (var result in e.Results)
{
lst.Add("Name : " + result.DisplayName + " ; Phone Number : " + result.PhoneNumbers.FirstOrDefault());
}
}
Contacts 还可以让用户使用SearchAsync 方法搜索联系人。 FilterKind 决定了将用于过滤的字段,如PhoneNumber、DisplayName 或EmailAddress 等。当它是None 时,它可以列出所有联系人。
请注意,我使用的是模拟器,因为我目前没有配备 Mango 的设备。
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
Contacts objContacts = new Contacts();
objContacts.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(objContacts_SearchCompleted);
objContacts.SearchAsync(string.Empty, FilterKind.None, null);
}
void objContacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
var ContactsData = from m in e.Results
select new MyContacts
{
DisplayName = m.DisplayName,
PhoneNumber = m.PhoneNumbers.FirstOrDefault()
};
var MyContactsLst = from contact in ContactsData
group contact by contact.DisplayName into c
orderby c.Key
select new Group<MyContacts>(c.Key, c);
longlist1.ItemsSource = ContactsData;
}
}
public class MyContacts
{
public string DisplayName { get; set; }
public ContactPhoneNumber PhoneNumber { get; set; }
}
【讨论】:
在 Windows Phone OS 7.1 中是可行的
这是 How To Access Contact List Data For Windows Phone 上的 MSDN 文章
这是文章中的代码 sn-p:
using Microsoft.Phone.UserData;
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());
}
【讨论】:
很遗憾,联系人 API 未在当前版本的 API 中公开。您可以获得的最接近的方法是使用来自 Tasks 命名空间的内容:
http://msdn.microsoft.com/en-us/library/ff428753(v=VS.92).aspx
您可以查找的两个是PhoneNumberChooseTask 和EmailAddressChooserTask。
另外,由于所有 WP7 手机都使用实时联系人进行无线同步,因此您可以随时调查执行 Web 请求并访问 Windows Live Contacts API。我知道这可能不是您想要的,但它可能是目前最好的选择。
【讨论】:
您可以让用户使用 PhoneNumberChooserTask 一次从他们的联系人列表中选择一个联系人(例如,SDK 7.0):
http://msdn.microsoft.com/en-us/library/ff769543(v=vs.92).aspx#BKMK_Phone
此外,在新的 Windows Phone SDK 7.1 版本(又名 Mango)的 Beta 版中,现在可以访问手机的所有联系人:
http://www.ginktage.com/2011/05/how-to-retreive-all-contacts-from-windows-phone-7-using-c/
注意:我听说 MS 直到 2011 年秋季才会允许在 Mango 开发的应用程序发布到应用程序商店。
【讨论】: