.NET MAUI中READ_CONTACTS权限未生效问题咨询
MAUI Android 通讯录权限问题解决
问题根源
Android 6.0(API 23)及以上版本对危险权限(如READ_CONTACTS)要求运行时动态申请,仅在Manifest中声明权限是不够的。你的Manifest配置正确,但缺少动态权限请求步骤,同时代码的异常捕获范围也存在问题。
修复方案
1. 添加运行时权限请求逻辑
在调用通讯录选择接口前,先检查并申请权限:
// 检查并请求通讯录读取权限 var permissionStatus = await Permissions.CheckStatusAsync<Permissions.ContactsRead>(); if (permissionStatus != PermissionStatus.Granted) { permissionStatus = await Permissions.RequestAsync<Permissions.ContactsRead>(); } if (permissionStatus == PermissionStatus.Granted) { try { var contact = await Contacts.Default.PickContactAsync(); if (contact == null) return; // 处理联系人数据 string id = contact.Id; string givenName = contact.GivenName; string familyName = contact.FamilyName; List<ContactPhone> phones = contact.Phones; List<ContactEmail> emails = contact.Emails; } catch (Exception ex) { // 捕获权限异常或其他错误 Console.WriteLine($"操作失败: {ex.Message}"); } } else { // 权限被拒绝,提示用户前往设置开启 }
2. 修正异常捕获范围
原代码中PickContactAsync未包含在try块内,权限异常会直接抛出而无法被捕获,导致后续代码(包括if (contact == null))无法执行。将PickContactAsync移入try块后,才能正确捕获异常并排查问题。
3. 确认Manifest文件有效性
确保AndroidManifest.xml位于项目的Platforms/Android目录下,MAUI会优先使用该目录下的配置,避免自动生成的Manifest覆盖你的权限声明。
4. 模拟器手动验证权限
如果动态请求仍不生效,可以手动开启权限:
- 打开模拟器「设置」→「应用」→ 找到你的应用 →「权限」→ 开启「通讯录」权限,再重新测试功能。
内容的提问来源于stack exchange,提问作者Wallace B. McClure
相关产品推荐
相关产品推荐

