public SUGARContact[] GetAllContacts() { List <SUGARContact> resultList = new List <SUGARContact>(); CNContactStore store = new CNContactStore(); CNContactFetchRequest request = new CNContactFetchRequest( CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.PhoneNumbers); store.EnumerateContacts(request, out NSError err, (CNContact contact, ref Boolean stop) => { CNLabeledValue <CNPhoneNumber>[] phoneNumberValues = contact.PhoneNumbers; List <string> phoneNumbersAsStrings = new List <string>(); List <long> phoneNumbersAsLongs = new List <long>(); foreach (var labeledValue in phoneNumberValues) { string stringValue = labeledValue.Value.StringValue; phoneNumbersAsStrings.Add(stringValue); phoneNumbersAsLongs.Add(ParseNumberAsLong(stringValue)); } SUGARContact nextContact = new SUGARContact($"{contact.GivenName} {contact.FamilyName}", phoneNumbersAsStrings, phoneNumbersAsLongs); resultList.Add(nextContact); }); return(resultList.ToArray()); }
public SUGARContact[] GetAllContacts() { var dataCursor = GetDataCursor(); List <SUGARContact> allContacts = new List <SUGARContact>(); // The idea is to go through all rows of the data cursor and remember the // latest contact. string latestContactName = null; SUGARContact latestContact = null; dataCursor.MoveToPosition(-1); while (dataCursor.MoveToNext()) { string currentContactName = dataCursor.GetString(dataCursor.GetColumnIndex("display_name")); if (latestContactName != null && currentContactName == latestContactName) { // Now we have at least two rows with the same name -> get numbers // and add them to the latest contact if not present. string nextNumber = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number)); string nextNormNumber = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NormalizedNumber)); if (nextNumber != null) { if (!latestContact.PhoneNumbersAsStrings.Contains(nextNumber)) { latestContact.PhoneNumbersAsStrings.Add(nextNumber); } } if (nextNormNumber != null) { if (!latestContact.PhoneNumbersAsStrings.Contains(nextNormNumber)) { latestContact.PhoneNumbersAsStrings.Add(nextNormNumber); } } } else { // Now it is either the first contact or the name has changed. In the first case, // there has been no contact created yet, the latestContact is null. Otherwise // the latestContact is created and contains all numbers. if (latestContact != null) { allContacts.Add(latestContact); } string number = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number)); string normNumber = dataCursor.GetString(dataCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NormalizedNumber)); List <string> numbers = new List <string>(2); if (number != null) { numbers.Add(number); } if (normNumber != null) { numbers.Add(normNumber); } // Update latest contact latestContact = new SUGARContact(currentContactName, numbers, new List <long>(0) /*We don't need longs in Android*/); latestContactName = currentContactName; } } dataCursor.Close(); return(allContacts.ToArray()); }