使用 Xamarin.Mobile 在 Xamarin Forms 中读取联系人时出错

Error reading contacts in Xamarin Forms using Xamarin.Mobile

我在 Xamarin.Forms android 项目

中循环访问联系人时遇到以下错误

"Expression of type 'System.Collections.Generic.IEnumerable1[Xamarin.Contacts.Contact]' cannot be used for return type 'System.Linq.IQueryable1[Xamarin.Contacts.Contact]'"

有趣的是,我在 bugzilla 中发现了同样的错误,但没有提到解决方法。

有人可以帮我解决这个错误吗

https://bugzilla.xamarin.com/show_bug.cgi?id=35244

方法如下:

    public async Task<IEnumerable<MobileUserContact>> All()
    {

        if (_contacts != null) return _contacts;

        var contacts = new List<MobileUserContact>();

        try
        {
            if (!await _book.RequestPermission())
            {
                Console.WriteLine("Permission denied");
                return;
            }

            foreach (Contact contact in _book.OrderBy(c => c.LastName))
            {
                Console.WriteLine("{0} {1}", contact.FirstName, contact.LastName);
                contacts.Add(new MobileUserContact(contact.FirstName, contact.LastName, ""));
            }

            return contacts;
        }
        catch (Exception ex)
        {

            throw;
        }
    }

它正在使用 Xamarin.Mobile 0.7.1.0 版本的 dll

我启用了Read_Contacts权限

如果这是 Xamarin.Mobile 包问题,也许您可​​以提交问题 here。在这里我无法修复此错误,但只能建议两个不使用此 Xamarin.Mobile 包获取联系人的解决方法。

  1. 您可以尝试使用ContactsPlugin for Xamarin and Windows获取联系人。

而你的 MobileUserContact 应该是一个 class 当你像这样编码时 var contacts = new List<MobileUserContact>();,但是你像这里的方法一样使用它:contacts.Add(new MobileUserContact(contact.FirstName, contact.LastName, ""));.

无论如何,我创建了一个演示试图重现您的问题,以下代码在我身边工作正常:

public List<MobileUserContact> contacts;
public async Task<IEnumerable<MobileUserContact>> All()
{
    contacts = new List<MobileUserContact>();
    try
    {
        if (!await CrossContacts.Current.RequestPermission())
        {
            return null;
        }

        foreach (var contact in CrossContacts.Current.Contacts.ToList())
        {
            contacts.Add(new MobileUserContact
            {
                FirstName = contact.FirstName,
                LastName = contact.LastName
            });
        }
        return contacts;
    }
    catch (Exception ex)
    {
        throw;
    }
}

MobileUserContact class这里很简单:

public class MobileUserContact
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

除了READ_CONTACTS权限外,我们还需要注意这个插件只针对API 23+,针对Android平台的API 23+编译。

使用这个包的好处是所有代码都可以放在PCL,但是这个包目前处于Alpha阶段,目前还没有完全支持

  1. 另一种方法是使用DependencyService,使用Android平台原生API获取联系人

原生Android项目中的代码可以是这样的:

var cursor = Android.App.Application.Context.ContentResolver.Query(Phone.ContentUri, null, null, null, null);
contacts = new List<MobileUserContact>();
while (cursor.MoveToNext())
{
    contacts.Add(new MobileUserContact
    {
        FirstName = cursor.GetString(cursor.GetColumnIndex(Phone.InterfaceConsts.DisplayName)),
        Num = cursor.GetString(cursor.GetColumnIndex(Phone.Number))
    });
}