0

循环访问 Xamarin.Forms android 项目中的联系人时出现以下错误

“'System.Collections.Generic.IEnumerable 1[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 权限

4

1 回答 1

1

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

  1. 您可以尝试使用Xamarin 和 Windows 的 ContactsPlugin来获取联系人。

当你像这样编码时你MobileUserContact应该是一个类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类在这里很简单:

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))
    });
}
于 2017-03-07T10:38:04.750 回答