如何从.NET MAUI代码中访问Android Health Connect
在.NET MAUI中访问Android Health Connect数据的实现指南
核心步骤:实例化HealthConnectClient
Health Connect的客户端实例化依赖Android平台上下文,在.NET MAUI中需通过平台特定代码实现(用#if ANDROID条件编译隔离Android专属逻辑):
#if ANDROID using Android.Health.Connect; using Android.Content; // 在Android平台代码中(如MainActivity、平台服务类)获取实例 var healthConnectClient = HealthConnectClient.GetInstance(Android.App.Application.Context); #endif
前置配置
- 项目框架要求:将MAUI项目的Android目标框架设置为Android 14 (API 34) 及以上(对应
net-android-34.0命名空间)。 - Manifest配置:在
Platforms/Android/AndroidManifest.xml中添加必要权限及声明:<!-- 权限示例:读取步数、心率等 --> <uses-permission android:name="android.permission.health.READ_STEPS" /> <uses-permission android:name="android.permission.health.READ_HEART_RATE" /> <!-- 声明Health Connect访问 --> <application> <meta-data android:name="android.health.connect.client" android:value="true" /> </application>
权限申请流程
访问Health Connect数据前必须动态申请对应权限,示例代码如下:
#if ANDROID using Android.Health.Connect.Permissions; using AndroidX.Core.App; // 定义需要的权限集合 var requiredPermissions = new List<string> { Permission.ReadSteps, Permission.ReadHeartRate }; // 检查已有权限 var permissionStatus = await healthConnectClient.CheckPermissionsAsync(requiredPermissions); var missingPermissions = permissionStatus .Where(p => !p.Value.Granted) .Select(p => p.Key) .ToList(); if (missingPermissions.Any()) { // 注册权限请求回调 var permissionLauncher = RegisterForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result => { foreach (var (permission, isGranted) in result) { if (isGranted) { // 权限已授予,可执行数据读取逻辑 } } }); // 发起权限请求 permissionLauncher.Launch(missingPermissions.ToArray()); } #endif
读取健身数据示例(以步数为例)
权限授予后,可通过ReadRecordsAsync查询指定时间范围的健康数据:
#if ANDROID using Android.Health.Connect.DataTypes; using Android.Health.Connect.Query; // 构建步数查询请求(近7天数据) var stepQuery = new ReadRecordsRequest.Builder() .SetDataType(StepCountRecord.GetRecordType()) .SetTimeRange(DateTimeOffset.UtcNow.AddDays(-7), DateTimeOffset.UtcNow) .Build(); // 执行查询 var queryResult = await healthConnectClient.ReadRecordsAsync(stepQuery); var stepRecords = queryResult.Records.Cast<StepCountRecord>(); // 处理查询结果 foreach (var record in stepRecords) { var totalSteps = record.Count; var recordStartTime = record.StartTime.LocalDateTime; // 自定义业务逻辑处理 } #endif
关键注意事项
- 平台限制:Health Connect仅支持Android平台,MAUI中需通过条件编译或依赖服务封装跨平台调用逻辑。
- 设备支持:确保目标设备安装了Health Connect应用(或通过Google Play服务提供支持),否则客户端实例化会失败。
- 上下文要求:权限请求必须在
Activity上下文内发起,若在ViewModel等非Activity类中调用,需通过MessagingCenter或依赖服务传递Activity实例。
内容的提问来源于stack exchange,提问作者Steve Mason
相关产品推荐
相关产品推荐

