使用 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.IQueryable
1[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<MobileUserContact>();
编码时,你的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 组件保存联系人