如何从Windows Phone应用程序中的联系人获取所有数据?

时间:2014-02-08 13:45:03

标签: c# xaml windows-phone-8 windows-phone

我想拥有所有联系人的姓名和图片并将其存储在某个地方?我们怎么做?根据我的发现,它只允许搜索一个并获取其详细信息。

2 个答案:

答案 0 :(得分:1)

您应该从msdn中的Contact filtering and matching开始阅读。有关代码段,请选中How to access contact data for Windows Phone

例如来自msdn的样本来计算这些项目:

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());
}

不要忘记在应用的清单中添加ID_CAP_CONTACTS功能,并在代码中添加using Microsoft.Phone.UserData;

更新:

例如,如果您想要联系人的每个姓名:

void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
    IEnumerable<Contact> contacts = e.Results; //Here your result
    string everynames = String.Empty;
    foreach (var item in contacts)
    {
        //We can get attributes from each item
        everynames += item.DisplayName +  Environment.NewLine;
    }
    MessageBox.Show(everynames);
}

更新2:

例如,如果您想要姓名,第一封邮件和第一个号码,您可以使用以下代码:

    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        IEnumerable<Contact> contacts = e.Results; //Here your result
        string everynames = String.Empty;
        foreach (var item in contacts)
        {
            //We can get attributes from each item
            everynames += item.DisplayName + ";" //Get name
                + (item.EmailAddresses.Count() > 0 ? (item.EmailAddresses.FirstOrDefault()).EmailAddress : "") + ";" //Check if contact has an email. If so, display it. He can be more than one !
                + (item.PhoneNumbers.Count() > 0 ? (item.PhoneNumbers.FirstOrDefault()).PhoneNumber : "") + ";" //Check if contact has a phonenumber. If so, display it. He can be more than one !
                + Environment.NewLine;
        }
        MessageBox.Show(everynames);
    }

更新3:

如果您想要所有照片,我会与您分享一个例子。不要忘记查看doc

void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
        foreach (var result in e.Results)
        {
            var stream = result.GetPicture();
            if (stream != null)
            {
                System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage();
                bmp.SetSource(stream); // You can do a list of image if you want to.
                Image img = new Image();
                img.Source = bmp;
                stack.Children.Add(img); // I choose to display in a stackpanel
            }
        }
}

别忘了试试{}抓住{} 您可以在FilterKind中更改SearchAsync()。我们使用FilterKind.None来获取所有内容。

答案 1 :(得分:1)

您可以使用Microsoft.Phone.UserData命名空间访问Windows Phone上的联系人数据,这里有一篇关于实现How to access contact data for Windows Phone的完整文章。但是,如果您想进一步了解创建联系人,请尝试ContactStore它有许多方法可以帮助你做你想做的事。

更新:

如果您想获得所有联系人:

  1. 首先声明using Microsoft.Phone.UserData;
  2. 使用以下代码触发并订阅搜索:
  3. 代码:

    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)
    {
        /* Here use the e.Results to return an object of type QueryDataEnumerable<Microsoft.Phone.UserData.Contact> where you can enumerate through the contacts returned*/
    }
    

    使用异步方法SearchAsync与String.empty和FilterKind.None只返回手机上的所有联系人,它返回QueryDataEnumerable<Microsoft.Phone.UserData.Contact>类型的对象,您可以循环并单独使用每个联系人。

    我希望这就是你要找的东西。

    更新2:

    您尝试使用的ContactQueryResult.GetContactsAsync()与ContactStore类配合使用,可帮助您为应用创建自定义联系人存储。当您将联系人保存到此商店时,它们将显示在手机的人员中心,与用户的其他联系人集成...(请参阅完整文章),我认为这不会对您的情况有所帮助,我认为使用已经提到的内容这个答案将使您能够获得所需的所有联系人,并根据需要使用它们。

    更新3:

    在Contacts_SearchCompleted方法中使用此类代码来获取联系人的图片

    Stream s = ((Contact)e.Results.First()).GetPicture();