使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错

Posted

技术标签:

【中文标题】使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错【英文标题】:Error reading contacts in Xamarin Forms using Xamarin.Mobile 【发布时间】: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 权限

【问题讨论】:

我认为您可以尝试在源代码中包含github.com/xamarin/Xamarin.Mobile 并进行一些调试... 【参考方案1】:

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

    您可以尝试使用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阶段,暂时不完全支持

    另一种方法是使用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))
    );

【讨论】:

以上是关于使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Xamarin.Android 中的 Xamarin.Mobile 组件保存联系人

Xamarin.Mobile 相机图像流

Xamarin.Mobile 跨平台实现

Xamarin.Mobile iPad 相机尺寸

Xamarin Mobile 使用的 ASP.Net Core Web API

无法在 PCL iOS 项目中安装 Xamarin.Mobile