You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:54:19