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

.NET MAUI中Android/iOS通话记录获取及Android代码错误解决

.NET MAUI 获取通话记录问题求助

我正在开发.NET MAUI应用,需要获取Android和iOS设备的通话记录,并在应用中展示来电姓名与通话时长。我已编写以下Android端代码,但查询通话记录时遇到错误。

我的问题

  1. 如何解决Android.App.Application.Context.ContentResolver.Query相关的错误?
  2. .NET MAUI中Android端获取通话记录是否有更优方式?
  3. iOS端处理通话相关功能是否有更好方案?

开发环境

  • .NET MAUI
  • Android
  • Visual Studio 2022

代码片段

public IEnumerable<CallLogEntry> GetCallLogs()
{
    var callLogs = new List<CallLogEntry>();

    var uri = CallLog.Calls.ContentUri;
    string[] projection = {
        CallLog.Calls.Number,
        CallLog.Calls.Type,
        CallLog.Calls.Date,
        CallLog.Calls.Duration,
        CallLog.Calls.CachedName
    };

    using (ICursor cursor = Android.App.Application.Context.ContentResolver.Query(uri, projection, null, null, CallLog.Calls.Date + " DESC"))
    {
        if (cursor.MoveToFirst())
        {
            do
            {
                var number = cursor.GetString(cursor.GetColumnIndex(CallLog.Calls.Number));
                var type = (CallType)cursor.GetInt(cursor.GetColumnIndex(CallLog.Calls.Type));
                var date = new DateTime(cursor.GetLong(cursor.GetColumnIndex(CallLog.Calls.Date)));
                var duration = cursor.GetLong(cursor.GetColumnIndex(CallLog.Calls.Duration));
                var name = cursor.GetString(cursor.GetColumnIndex(CallLog.Calls.CachedName));

                callLogs.Add(new CallLogEntry
                {
                    Number = number,
                    Type = type,
                    Date = date,
                    Duration = duration,
                    Name = name
                });
            } while (cursor.MoveToNext());
        }
    }

    return callLogs;
}

问题详情

我遇到以下错误:Error: 'Android.App.Application' is not found. Are you missing any reference assembly?

已尝试的解决方法

我已在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.READ_CALL_LOG" />

尝试清理并重建项目。


问题解答

1. 解决Android.App.Application未找到的错误

在.NET MAUI的Android项目中,直接引用Android.App.Application易因命名空间或上下文获取方式报错,可按以下步骤修复:

  • 先在代码文件顶部添加命名空间:using Android.App;
  • 若仍报错,替换上下文获取逻辑:将Android.App.Application.Context改为Platform.CurrentActivity?.ContentResolver(调用前需确保Activity不为null,可先检查权限状态)

修改后的查询代码片段:

using (ICursor cursor = Platform.CurrentActivity.ContentResolver.Query(uri, projection, null, null, CallLog.Calls.Date + " DESC"))

另外,Android 6.0及以上版本需动态申请READ_CALL_LOG权限,仅在Manifest声明无效,可通过.NET MAUI权限API处理:

var status = await Permissions.CheckStatusAsync<Permissions.CallLogsRead>();
if (status != PermissionStatus.Granted)
{
    status = await Permissions.RequestAsync<Permissions.CallLogsRead>();
}
if (status == PermissionStatus.Granted)
{
    // 执行通话记录查询逻辑
}

2. .NET MAUI Android端获取通话记录的更优方式

  • 用**依赖服务(Dependency Service)**封装Android端逻辑,隔离平台代码,提升跨项目可维护性。
  • 优先使用Android 13+支持的异步查询方法QueryAsync,避免阻塞主线程:
await using var cursor = await Platform.CurrentActivity.ContentResolver.QueryAsync(uri, projection, null, null, CallLog.Calls.Date + " DESC");
if (cursor != null)
{
    while (await cursor.MoveToNextAsync())
    {
        // 读取通话记录数据逻辑
    }
}
  • 对查询结果做本地缓存,减少重复访问系统通话日志的次数,优化应用性能。

3. iOS端处理通话相关功能的方案

iOS隐私管控严格,第三方应用无法直接读取系统历史通话记录,可采用以下替代方案:

  • 集成CallKit框架:仅能监听实时来电、去电事件,获取当前通话的基础信息,无法访问历史记录。
  • 引导用户手动导出通话记录(如通过通讯录导出文件),再由应用读取导入,但用户体验较差。
  • 企业级应用可申请苹果特殊权限,但流程繁琐且通过率极低。

注意:任何绕过iOS隐私限制的操作都会导致应用被App Store拒绝,建议根据业务需求调整功能设计。


内容的提问来源于stack exchange,提问作者Khan Mehnaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:46:00