Xamarin Forms:Android手机联系人未列出



我指的是这个博客列出的电话联系人。它在ios部分运行良好,但在android部分,联系人没有列出。没有异常或错误,但是UI是空白的。

根据博客,我在安卓平台上做了以下事情:

  1. 创建了模型类Contact和接口IContactsService
  2. 添加了READ_CONTACTS权限,并添加了ContactsService实现
  3. 已安装插件.CurrentActivityAcr.UserDialogs程序包
  4. 在Android项目中添加了Permission.Util
  5. 在主项目的MainActivityContactPage文件中添加了所需内容

不知道我在android部分缺少了什么,在ios上它运行得很好。在android上,运行时不会询问联系人权限。我从应用程序设置手动添加权限,但没有运气My Xamarin表单版本:4.8.0.1821

我在这里上传了一个示例项目供参考。

提前谢谢。

从我的Microsoft QA线程中得到了答案:

Android 10不使用Android.Support.V4.Content.ContextCompat来请求权限,因此请使用Xamarin.Essentials:权限来请求运行时权限。

在ContactsViewModel.cs上,在LoadContacts方法中添加CheckAndContactsReadPermission((方法,如下代码所示。

async Task LoadContacts()
{
try
{
await CheckAndContactsReadPermission();
await _contactService.RetrieveContactsAsync();
}
catch (TaskCanceledException)
{
Console.WriteLine("Task was cancelled");
}
}
public async Task<PermissionStatus> CheckAndContactsReadPermission()
{
var status = await Permissions.CheckStatusAsync<Permissions.ContactsRead>();
if (status == PermissionStatus.Granted)
return status;
if (status == PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS)
{
// Prompt the user to turn on in settings
// On iOS once permission has been denied it may not be requested again from the application
return status;
}

status = await Permissions.RequestAsync<Permissions.ContactsRead>();
return status;
}

在ContactsService.cs上,按照以下代码更改LoadContactsAsync方法。

async Task<IList<Contact>> LoadContactsAsync()
{
IList<Contact> contacts = new List<Contact>();
//var hasPermission = await RequestPermissionAsync();
//if (hasPermission)
//{
var uri = ContactsContract.Contacts.ContentUri;
var ctx = Application.Context;
await Task.Run(() =>
{
var cursor = ctx.ApplicationContext.ContentResolver.Query(uri, new string[]
{
ContactsContract.Contacts.InterfaceConsts.Id,
ContactsContract.Contacts.InterfaceConsts.DisplayName,
ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
}, null, null, $"{ContactsContract.Contacts.InterfaceConsts.DisplayName} ASC");
if (cursor.Count > 0)
{
while (cursor.MoveToNext())
{
var contact = CreateContact(cursor, ctx);
if (!string.IsNullOrWhiteSpace(contact.Name))
{
OnContactLoaded?.Invoke(this, new ContactEventArgs(contact));
contacts.Add(contact);
}
if (stopLoad)
break;
}
}
});
// }
return contacts;
}

最新更新