首页 > 解决方案 > 在 Xamarin 中导入联系人 - 电子邮件返回 null

问题描述

我正在尝试将选定的联系人从电话目录导入我的应用程序。使用下面的代码,联系人姓名和电话号码成功返回,但电子邮件始终返回 null(该if (emailCursor.MoveToFirst())子句始终返回 false)。ImportedContact 是一个简单的类,具有 3 个字符串属性,名称、电话和电子邮件。我已确保我的联系人已分配电子邮件地址。

static ImportedContact GetContactFromUri(Android.Net.Uri contactUri)
        {
            var importedContact = new ImportedContact();

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

                var cursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(contactUri, projection, null, null, null);
                if (cursor.MoveToFirst())
                {
                    importedContact.Name = cursor.GetString(cursor.GetColumnIndex(projection[1]));
                    importedContact.Phone = cursor.GetString(cursor.GetColumnIndex(projection[2]));
                };

                var id = cursor.GetString(cursor.GetColumnIndex(projection[0]));
                var emailCursor = CrossCurrentActivity.Current.Activity.ContentResolver.Query(
                    ContactsContract.CommonDataKinds.Email.ContentUri,
                    null,
                    ContactsContract.CommonDataKinds.Email.InterfaceConsts.ContactId + " = " + id, null, null);

                if (emailCursor.MoveToFirst())
                {
                    int colId = emailCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data);
                    importedContact.Email = emailCursor.GetString(colId);
                }
                emailCursor.Close();

                return importedContact;
            }
            catch
            {
                return null;
            }
        }

标签: c#xamarinxamarin.forms

解决方案


实际问题是由于我调用选择器的方式 - 我错误地将意图类型设置为特定于电话数据:

public static void OpenContactPicker(Action<ImportedContact> callback)
{
    _callback = callback;
    Intent intent = new Intent(Intent.ActionPick);
    intent.SetType(ContactsContract.CommonDataKinds.Phone.ContentType);
    CurrentActivity.StartActivityForResult(intent, RequestCodes.ContactPicker);
}

这仅返回电话信息,不包括电子邮件、网站等。我将其更改为:

    public static void OpenContactPicker(Action<ImportedContact> callback)
    {
        _callback = callback;
        Intent intent = new Intent(Intent.ActionPick, ContactsContract.Contacts.ContentUri);
        CurrentActivity.StartActivityForResult(intent, RequestCodes.ContactPicker);
    }

这将根据需要返回所有联系信息。


推荐阅读