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
// 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:
// Open the picker for the user to select contacts picker.pickContactsAsync();
Or
// 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:
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:
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:
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:
contacts.forEach( function (contact) { contact.emails.every( function (email) { output += email.address + "," ; }); });
Or
foreach( var em in c.Emails) { System.Diagnostics. Debug.WriteLine( "{0} email {1}" , c.Name, em.Address); }