【问题标题】:Error reading contacts in Xamarin Forms using Xamarin.Mobile使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错
【发布时间】:2017-03-06 17:41:25
【问题描述】:

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

“'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.android xamarin.forms xamarin.mobile


【解决方案1】:

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

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

当你像这样var contacts = new List&lt;MobileUserContact&gt;(); 编码时,你的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))
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多