使用 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.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权限
如果这是 Xamarin.Mobile
包问题,也许您可以提交问题 here。在这里我无法修复此错误,但只能建议两个不使用此 Xamarin.Mobile
包获取联系人的解决方法。
- 您可以尝试使用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阶段,目前还没有完全支持。
- 另一种方法是使用
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.Forms android 项目
中循环访问联系人时遇到以下错误"Expression of type '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权限
如果这是 Xamarin.Mobile
包问题,也许您可以提交问题 here。在这里我无法修复此错误,但只能建议两个不使用此 Xamarin.Mobile
包获取联系人的解决方法。
- 您可以尝试使用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阶段,目前还没有完全支持。
- 另一种方法是使用
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))
});
}