Извлечение Android контактов в приложении Xamarin Forms - PullRequest
0 голосов
/ 25 апреля 2020

Часть моего приложения Xamarin Forms Android получает контакты пользователя со своего телефона в список. Метод, который получает контакты ниже.

До этого момента я импортировал файл тестовых контактов .vcf в эмулятор Android для тестирования своего приложения. Это работает правильно, и мой метод возвращает список контактов.

Однако, когда я вручную добавляю контакт в эмулятор Android, открыв приложение контактов телефона и введя новый контакт. Метод по-прежнему возвращает только контакты .vcf и не включает только что созданный мной новый контакт.

Я предполагаю, что контакты .vcf хранятся в телефоне не так, как вводимые вручную контакты. Я смотрю не в том месте, когда создаю свою проекцию?

public class PhoneContacts_Android : IPhoneContacts
{
    private List<Contact> _contacts = new List<Contact>();

    public List<Contact> GetContactsList()
    {
        if (ContextCompat.CheckSelfPermission(MainActivity.ThisActivity, Manifest.Permission.ReadContacts) == (int)Permission.Granted)
        {
            var uri = ContactsContract.CommonDataKinds.StructuredPostal.ContentUri;

            string[] projection = {
            ContactsContract.Contacts.InterfaceConsts.Id,
            ContactsContract.Contacts.InterfaceConsts.DisplayName,
            ContactsContract.CommonDataKinds.StructuredPostal.FormattedAddress,
            ContactsContract.CommonDataKinds.StructuredPostal.Street,
            ContactsContract.CommonDataKinds.StructuredPostal.City,
            ContactsContract.CommonDataKinds.StructuredPostal.Region,
            ContactsContract.CommonDataKinds.StructuredPostal.Postcode
            };

            var cursor = MainActivity.ThisActivity.ContentResolver.Query(uri, projection, null, null, null);

            _contacts = new List<Contact>();

            if (cursor.MoveToFirst())
            {
                do
                {
                    var _contact = new Contact();
                    _contact.Address = new Address();

                    _contact.Id = (int) cursor.GetLong(cursor.GetColumnIndex(projection[0]));
                    _contact.DisplayName = cursor.GetString(cursor.GetColumnIndex(projection[1]));
                    _contact.Address.AddressLine1 = cursor.GetString(cursor.GetColumnIndex(projection[2]));
                    _contact.Address.AddressLine2 = cursor.GetString(cursor.GetColumnIndex(projection[3]));
                    _contact.Address.City = cursor.GetString(cursor.GetColumnIndex(projection[4]));
                    _contact.Address.State = cursor.GetString(cursor.GetColumnIndex(projection[5]));
                    _contact.Address.ZipCode = cursor.GetString(cursor.GetColumnIndex(projection[6]));

                    if (string.IsNullOrWhiteSpace(_contact.FirstName) && _contact.DisplayName != null)
                    {
                        string[] words = _contact.DisplayName.Split(' ');
                        _contact.FirstName = words[0];
                        _contact.NickName= words[0];
                        if (string.IsNullOrWhiteSpace(_contact.LastName))
                            _contact.LastName = words[1];
                    }

                    _contacts.Add(_contact);

                } while (cursor.MoveToNext());
            }

            return _contacts;
        }
        else
        {
            ActivityCompat.RequestPermissions(MainActivity.ThisActivity, new System.String[] { Manifest.Permission.ReadContacts }, 1);
            return null;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Я нашел проблему.

Мой URI был указан в ContactsContract.CommonDataKinds.StructuredPostal.ContentUri;

Если у введенного вручную контакта не было почтового адреса, его не было в модели данных StructuredPostal.

0 голосов
/ 27 апреля 2020

По вашему описанию вы не можете получить контактную запись, что добавляете вручную? Вы можете попробовать следующий код, я тестирую его и могу получить запись контакта, добавляя которую вручную.

List<Contact> contactList;

void FillContacts()
    {
        //var uri = ContactsContract.Contacts.ContentUri;

        var uri = ContactsContract.CommonDataKinds.Phone.ContentUri;

        string[] projection = {
            ContactsContract.Contacts.InterfaceConsts.Id,
            ContactsContract.Contacts.InterfaceConsts.DisplayName,
             ContactsContract.CommonDataKinds.Phone.Number,
           ContactsContract.Contacts.InterfaceConsts.PhotoId
           //ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
        };

        // ManagedQuery is deprecated in Honeycomb (3.0, API11)
        //var cursor = activity.ManagedQuery (uri, projection, null, null, null);

        // ContentResolver requires you to close the query yourself
        //var cursor = activity.ContentResolver.Query(uri, projection, null, null, null);

        // CursorLoader introduced in Honeycomb (3.0, API11)
        var loader = new CursorLoader(activity, uri, projection, null, null, null);
        var cursor = (ICursor)loader.LoadInBackground();


        contactList = new List<Contact>();

        if (cursor.MoveToFirst())
        {
            do
            {
                contactList.Add(new Contact
                {
                    Id = cursor.GetLong(cursor.GetColumnIndex(projection[0])),
                    DisplayName = cursor.GetString(cursor.GetColumnIndex(projection[1])),
                    PhoneNumber = cursor.GetString(cursor.GetColumnIndex(projection[2])),
                    PhotoId = cursor.GetString(cursor.GetColumnIndex(projection[3]))
                });
            } while (cursor.MoveToNext());
        }
    }

public class Contact
{
    public long Id { get; set; }
    public string DisplayName { get; set; }
    public string PhoneNumber { get; set; }
    public string PhotoId { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...