.NET Maui应用:Google Fit兼容及Health Connect实现咨询
问题解答
关于已弃用的Google Fit HistoryApi在MAUI中的可用性
- 已弃用的
FitnessClass.HistoryApi结合GoogleApiClient的方式,在以net6.0-android为目标框架的MAUI应用中理论上可临时运行,但强烈不推荐:- 这类API已被Google标记为弃用,后续会逐步停止维护,存在兼容性风险,比如新Android版本可能限制功能甚至直接禁用。
- net6.0-android对旧版Google Play Services API的支持有限,容易出现权限初始化失败、调用异常等问题。
MAUI中实现Health Connect的History API步骤
Health Connect是Google官方推荐的替代方案,针对History API的实现可按以下步骤操作:
1. 配置项目依赖
- 在MAUI项目的Android平台目录下,修改
AndroidManifest.xml,添加Health Connect所需权限和声明:<!-- 根据需要的历史数据类型添加对应权限 --> <uses-permission android:name="android.permission.health.READ_STEPS"/> <uses-permission android:name="android.permission.health.WRITE_STEPS"/> <application> <!-- 声明Health Connect应用关联 --> <meta-data android:name="android.health.connect.client.health_permissions" android:resource="@xml/health_permissions"/> </application> - 在Android项目的
Resources/xml目录下创建health_permissions.xml文件,定义需访问的数据类型:<health-permissions xmlns:android="http://schemas.android.com/apk/res/android"> <health-permission android:name="android.permission.health.READ_STEPS"/> <health-permission android:name="android.permission.health.WRITE_STEPS"/> </health-permissions>
2. 初始化Health Connect客户端
在MAUI的Android平台代码中,初始化客户端实例:
using Android.Health.Connect; using Android.Content; var healthConnectClient = HealthConnectClient.GetInstance(Android.App.Application.Context);
3. 检查Health Connect可用性
调用API前,先确认设备是否支持Health Connect:
var availabilityStatus = await healthConnectClient.ContractInfoAsync(); if (availabilityStatus.Status != HealthConnectAvailabilityStatus.Available) { // 处理不可用场景,比如提示用户安装/升级Health Connect return; }
4. 请求用户授权
读取或写入历史数据前,必须获取用户授权:
var permissionsToRequest = new List<string> { HealthPermission.ReadSteps, HealthPermission.WriteSteps }; var requestResult = await healthConnectClient.RequestPermissionsAsync(permissionsToRequest); if (!requestResult.AllPermissionsGranted) { // 处理权限拒绝情况 return; }
5. 调用History相关API
读取历史数据(以步数为例)
using Android.Health.Connect.DataTypes; using Java.Util.Concurrent; var startTime = DateTimeOffset.UtcNow.AddDays(-7).ToUnixTimeMilliseconds(); var endTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var request = new ReadRecordsRequest.Builder() .SetTimeRange(startTime, endTime, TimeUnit.Milliseconds) .AddDataType(StepCountRecord.RecordType) .Build(); var result = await healthConnectClient.ReadRecordsAsync(request); var stepRecords = result.GetRecords<StepCountRecord>(); // 遍历处理读取到的步数数据 foreach (var record in stepRecords) { var stepCount = record.Count; var recordStartTime = record.StartTime; }
写入历史数据(以步数为例)
var currentTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var stepRecord = new StepCountRecord.Builder( currentTime, currentTime, 1000) // 写入1000步数据 .Build(); var request = new InsertRecordsRequest.Builder() .AddRecord(stepRecord) .Build(); await healthConnectClient.InsertRecordsAsync(request);
内容的提问来源于stack exchange,提问作者Dumber_Texan2
相关产品推荐
相关产品推荐

