簡體   English   中英

在 Xamarin Forms 應用程序中獲取 Android 聯系人

[英]Fetching Android contacts in Xamarin Forms application

我的 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;
        }
    }
}

根據您的描述,您無法獲取手動添加的聯系人記錄? 您可以嘗試以下代碼,我對其進行了測試,可以獲取手動添加的聯系人記錄。

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

我發現了問題。

我的 URI 指向 ContactsContract.CommonDataKinds.StructuredPostal.ContentUri;

如果手動輸入的聯系人沒有郵政地址,則它不在結構化郵政數據 Model 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM