Xamarin Forms安卓端手机联系人无法列表显示问题求助
Xamarin.Forms安卓端联系人列表加载异常修复方案
1. 运行时权限逻辑修复
安卓6.0及以上版本仅在AndroidManifest.xml中声明权限不生效,需要在读取联系人逻辑执行前主动触发权限申请:
- 在
IContactsService实现类的联系人获取方法开头添加权限校验逻辑,可直接使用Xamarin.Essentials提供的权限API:
var readPermissionStatus = await Permissions.CheckStatusAsync<Permissions.ContactsRead>(); if (readPermissionStatus != PermissionStatus.Granted) { readPermissionStatus = await Permissions.RequestAsync<Permissions.ContactsRead>(); if (readPermissionStatus != PermissionStatus.Granted) { return new List<Contact>(); } }
- 确认
AndroidManifest.xml中已添加静态权限声明:
<uses-permission android:name="android.permission.READ_CONTACTS" />
2. 高版本安卓系统适配
安卓11及以上版本引入了包可见性限制,需要额外添加联系人查询声明:
在AndroidManifest.xml的manifest根节点下添加如下配置:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="vnd.android.cursor.dir/contact" /> </intent> </queries>
3. 基础依赖配置校验
- 确认
MainActivity.cs的OnCreate方法中初始化顺序正确:
base.OnCreate(savedInstanceState); // 初始化CurrentActivity插件 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState); // 初始化Xamarin.Essentials Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App());
- 重写
MainActivity的OnRequestPermissionsResult方法,将权限回调传递给Essentials组件:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
4. 数据加载逻辑排查
- 校验联系人查询
Uri是否为ContactsContract.Contacts.ContentUri,查询投影参数不要遗漏Id、DisplayName、Number等必填字段。 - 确认返回的联系人数据已正确赋值给实现了
INotifyPropertyChanged的可观察集合,绑定上下文配置无误。
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

