One of the best features of Windows 8 is that it allows you to store all your contacts in one place. This means you can link your e-mail, Linked-in, Facebook, Twitter and Google+ contacts in a single list. If you want to access this programatically, it’s surprisingly simple.
The first thing to do is to create a contact picker
[sourcecode language=“javascript”] // Create the picker var picker = new Windows.ApplicationModel.Contacts.ContactPicker(); picker.commitButtonText = “Select” ;
The commitButtonText allows you to say what the dialog's OK button will say. The next function is called to make the contact selection. In Windows 8 this was pickMultipleContactsAsync (there was also a pickSingleContactAsync), but both are deprecated for 8.1, and you should use the following:
[sourcecode language="javascript"]
// Open the picker for the user to select contacts
picker.pickContactsAsync();
Or
[sourcecode language=“javascript”] // Open the picker for the user to select a contact picker.pickContactAsync();
This needs to be inside a promise, to ensure that the app doesn't become unresponsive while you select contacts:
[sourcecode language="javascript"]
function pickContacts() {
// Create the picker
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
picker.commitButtonText = "Select";
var emailsPromise = new WinJS.Promise( function (complete, error, progress) {
// Open the picker for the user to select contacts
picker.pickContactsAsync().then( function (contacts) {
if (contacts.length > 0) {
// Iterate through the contacts collection and do something
complete(); // Call complete to exit the promise
} else {
complete(); // Call complete to exit the promise
}
});
});
return emailsPromise;
};
This works, with one slight caveat - it gives you every single contact. But say you just want the e-mail address? The following will return only the contacts for which you have an e-mail address:
[sourcecode language=“javascript”] picker.desiredFieldsWithContactFieldType.append(Windows.ApplicationModel.Contacts.ContactFieldType.Email);
(Note, this replaces the deprecated desiredFields property in Windows 8.0)
So, the final cut looks like this:
[sourcecode language="javascript"]
function pickContacts() {
// Create the picker
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
picker.commitButtonText = "Select";
picker.desiredFieldsWithContactFieldType.append(
Windows.ApplicationModel.Contacts.ContactFieldType.Email);
var emailsPromise = new WinJS.Promise( function (complete, error, progress) {
// Open the picker for the user to select contacts
picker.pickContactsAsync().then( function (contacts) {
if (contacts.length > 0) {
// Iterate through the contacts collection and do something
complete(); // Call complete to exit the promise
} else {
complete(); // Call complete to exit the promise
}
});
});
return emailsPromise;
};
So, what does this look like in C#? IMHO, it looks a lot neater:
// Create the picker
Windows.ApplicationModel.Contacts. ContactPicker picker = new Windows.ApplicationModel.Contacts.ContactPicker ();
picker.CommitButtonText = "Select";
picker.DesiredFieldsWithContactFieldType.Add(
Windows.ApplicationModel.Contacts. ContactFieldType .Email);
// Open the picker for the user to select contacts
var contacts = await picker.PickContactsAsync();
if (contacts.Count() > 0)
{
//...
}
Final Note
It’s also worth noting that when you get the contacts, the e-mail addresses for each are a collection (each contact can have many); so you’ll need to do something like this:
[sourcecode language=“javascript”] contacts.forEach( function (contact) { contact.emails.every( function (email) { output += email.address + ”,” ; }); });
Or
``` csharp
foreach( var em in c.Emails)
{
System.Diagnostics. Debug.WriteLine( "{0} email {1}" , c.Name, em.Address);
}