.NET MAUI中Android/iOS通话记录获取及Android代码错误解决
.NET MAUI 获取通话记录问题求助
我正在开发.NET MAUI应用,需要获取Android和iOS设备的通话记录,并在应用中展示来电姓名与通话时长。我已编写以下Android端代码,但查询通话记录时遇到错误。
我的问题
- 如何解决
Android.App.Application.Context.ContentResolver.Query相关的错误? - .NET MAUI中Android端获取通话记录是否有更优方式?
- 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
相关产品推荐
相关产品推荐

