管理健康记录
应用集成Health Service kit后,通过调用HealthRecordController类中的接口来操作用户的健康记录, 如下:
将健康记录写入Health Service Kit(addHealthRecord) 删除Health Service Kit中的健康记录(deleteHealthRecord) 修改Health Service Kit中的健康记录(updateHealthRecord) 查询Health Service Kit中的健康记录(getHealthRecord)说明
在调用Health Service Kit Android SDK接口时,请确保手机处于亮屏且解锁状态,否则可能会导致接口调用失败,具体误参见错误码:DISABLE_DATA_OPERATION。 在调用Health Service Kit SDK接口时,请确保您的应用为前台应用或者与前台应用绑定,否则可能会导致接口调用失败,具体错误参见错误码:APPLICATION_NOT_FORGROUND。 通过HuaweiHiHealth.getHealthRecordController方法获取HealthRecordController时,若传入Activity对象(用于应用包含界面的场景调用),支持触发HMS Core版本强制升级,若传入Context对象(用于应用无界面的场景调用),不支持触发HMS Core版本强制升级。 在开始调用Health Service Kit接口之前,请阅读Health Service Kit Android SDK接口调用示例章节,了解Health Service Kit Android SDK接口调用流程。将健康记录写入Health Service Kit
用户可以将健康记录相关数据通过HealthRecordController写入到Health Service Kit,具体可执行以下操作:
应用需先确认是否已拥有健康记录数据操作权限,数据类型详见健康记录数据类型。 创建一个指定采集器、时间段、健康数据统计信息、健康数据明细信息和其他必要信息的HealthRecord。 使用HealthRecord创建一个HealthRecordInsertOptions。 使用HealthRecordController.addHealthRecord方法将HealthRecordInsertOptions插入Health Service Kit。以健康记录支持的心率过缓数据类型为例,插入HealthRecord示例代码如下:
收起
自动换行
深色代码主题
复制
// 请注意:// 1.此处的this为Activity对象// 2.此处的HealthRecordController类的对象,请在每次接口调用前初始化,避免相关Activity或Context失效导致的数据读取失败的问题HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this); // 设置请求体的开始时间和结束时间Calendar cal = Calendar.getInstance();Date now = new Date();cal.setTime(now);long endTime = cal.getTimeInMillis();cal.add(Calendar.HOUR_OF_DAY, -1);long startTime = cal.getTimeInMillis(); // 1.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetListDataCollector dataCollector = new com.huawei.hms.hihealth.data.DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE) .setDataGenerateType(DataCollector.DATA_TYPE_RAW) .setPackageName(context) .setDataStreamName("such as step count") .build();SampleSet sampleSet = SampleSet.create(dataCollector);// 预置时间跨度5分钟,设置心率明细点值88SamplePoint samplePoint = sampleSet.createSamplePoint().setTimeInterval(startTime , startTime + 300000L, TimeUnit.MILLISECONDS);samplePoint.getFieldValue(Field.FIELD_BPM).setDoubleValue(88);sampleSet.addSample(samplePoint);// sampleSetList 用来存放健康明细数据List<SampleSet> sampleSetList = new ArrayList<>();sampleSetList.add(sampleSet); // samplePointList 用来存放统计数据点List<SamplePoint> samplePointList = new ArrayList<>();// 2.构造心率统计数据点SamplePoint samplePoint1 = new SamplePoint.Builder(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS).build();samplePoint1.getFieldValue(Field.FIELD_AVG).setDoubleValue(90);samplePoint1.getFieldValue(Field.FIELD_MAX).setDoubleValue(100);samplePoint1.getFieldValue(Field.FIELD_MIN).setDoubleValue(80);samplePoint1.getFieldValue(Field.FIELD_LAST).setDoubleValue(80);samplePoint1.setTimeInterval(startTime + 1L, startTime + 300000L, TimeUnit.MILLISECONDS);samplePointList.add(samplePoint1); // 3.构造健康记录的采集器(以心率过缓健康数据类型为例),以及构造健康记录结构体DataCollector dataCollector2 = new com.huawei.hms.hihealth.data.DataCollector.Builder() .setDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA) .setDataGenerateType(DataCollector.DATA_TYPE_RAW) .setPackageName(context) .setDataStreamName("such as step count") .build(); HealthRecord.Builder healthRecordBuilder = new HealthRecord.Builder(dataCollector2).setSubDataSummary(samplePointList) .setSubDataDetails(sampleSetList) .setStartTime(startTime, TimeUnit.MILLISECONDS) .setEndTime(endTime, TimeUnit.MILLISECONDS);// 给心率过缓健康数据类型的每个Field设置值healthRecordBuilder.setFieldValue(HealthFields.FIELD_THRESHOLD, 40d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 44d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 40d);HealthRecord healthRecord = healthRecordBuilder.build(); HealthRecordInsertOptions insertOptions = new HealthRecordInsertOptions.Builder().setHealthRecord(healthRecord).build(); healthRecordController.addHealthRecord(insertOptions).addOnSuccessListener(new OnSuccessListener<String>() { @Override public void onSuccess(String healthRecordId) { // 请保存好插入成功后返回的healthRecordId,这个healthRecordId用于修改场景 healthRecordIdFromInsertResult = healthRecordId; logger("The health record is added successfully,please save the healthRecordId! " + healthRecordId); }}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { logger(e.toString()); }});
说明
直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:
辅助函数logger没有定义。解决办法:定义logger函数,不进行任何操作,参考下面的示例代码。
收起
自动换行
深色代码主题
复制
private static final String TAG = "HealthRecordController"; /** * 同时输出操作结果日志到logcat * * @param string日志字符串 */ private void logger(String string) { Log.i(TAG, string); } 字符串变量healthRecordIdFromInsertResult未定义。
解决办法:healthRecordIdFromInsertResult字符串用来作为updateHealthRecord接口调用的参数,具体的定义参考如下,需在调用addHealthRecord成功后予以赋值。
收起
自动换行
深色代码主题
复制
private String healthRecordIdFromInsertResult = "";
删除Health Service Kit中的健康记录
用户可以通过HealthRecordController删除健康记录,具体可执行以下操作:
根据healthRecordIds或起止时间、数据类型创建一个HealthRecordDeleteOptions。 使用HealthRecordController.deleteHealthRecord方法将HealthRecordDeleteOptions从Health Service Kit中删除 。说明
删除的运动健康数据的健康记录数据的开始时间和结束时间均需大于2014年1月1号对应的UNIX时间戳。 删除健康记录数据时,若healthRecordIds不为空则根据healthRecordIds删除,否则根据健康记录数据类型及起止时间删除。删除Health Service Kit的健康记录示例代码如下:
收起
自动换行
深色代码主题
复制
// 请注意:// 1.此处的this为Activity对象// 2.此处的HealthRecordController类的对象,请在每次接口调用前初始化,避免相关Activity或Context失效导致的数据读取失败的问题HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this); // 构造请求对象的时间区间:开始和结束时间// 请注意此处设置的开始时间和结束时间均需大于2014年1月1号对应的UNIX时间戳Calendar cal = Calendar.getInstance();Date now = new Date();cal.setTime(now);long endTime = cal.getTimeInMillis();cal.add(Calendar.DAY_OF_YEAR, -2);long startTime = cal.getTimeInMillis();// 构造请求对象的dataTypeDataType dataType = HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA;// 构造请求对象的subDataTypeListList<DataType> subDataTypeList = Collections.singletonList(DataType.DT_INSTANTANEOUS_HEART_RATE);// 构造请求对象的healthRecordIdsList<String> healthRecordIds = Collections.singletonList("healthRecordIdFromInsertResult"); // 构造删除对象请求体HealthRecordDeleteOptions deleteRequest = new HealthRecordDeleteOptions.Builder() .setHealthRecordIds(healthRecordIds) .isDeleteSubData(true) .setDataType(dataType) .setSubDataTypeList(subDataTypeList) .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS).build(); // 调用deleteHealthRecord接口删除健康记录Task<Void> deleteTask = healthRecordController.deleteHealthRecord(deleteRequest);deleteTask.addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.i("HealthRecords","HealthRecord deleted successfully.!"); }}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { Log.i("HealthRecords","Failed to delete data" + e.getMessage()); }});
修改Health Service Kit中的健康记录
用户可以通过HealthRecordController修改已经写入到Health Service Kit的健康记录相关数据,具体可执行以下操作:
应用需先确认是否已拥有健康记录数据操作权限,数据类型详见健康记录数据类型。 创建一个指定采集器、时间段、健康数据统计信息、健康数据明细信息和其他必要信息的HealthRecord。 使用HealthRecord和将健康记录写入Health Service Kit回调中的HealthRecordId,创建一个HealthRecordUpdateOptions。 使用HealthRecordController.updateHealthRecord方法修改Health Service Kit中的健康记录及相关数据。说明
1. 插入的健康记录的开始时间和结束时间均需大于2014年1月1号对应的UNIX时间戳。
2. 如果想要通过HealthRecordId修改的健康记录不存在,会抛出错误码。
以健康记录支持的心率过缓数据类型为例,修改HealthRecord示例代码如下:
收起
自动换行
深色代码主题
复制
// 请注意:// 1.此处的this为Activity对象// 2.此处的HealthRecordController类的对象,请在每次接口调用前初始化,避免相关Activity或Context失效导致的数据读取失败的问题HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this); // 设置请求体的开始时间和结束时间Calendar cal = Calendar.getInstance();Date now = new Date();cal.setTime(now);long endTime = cal.getTimeInMillis();cal.add(Calendar.HOUR_OF_DAY, -1);long startTime = cal.getTimeInMillis(); // 1.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetListDataCollector dataCollector = new com.huawei.hms.hihealth.data.DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE) .setDataGenerateType(DataCollector.DATA_TYPE_RAW) .setPackageName(context) .setDataStreamName("such as step count") .build();SampleSet sampleSet = SampleSet.create(dataCollector);// 预置时间跨度5分钟,设置心率明细点值90SamplePoint samplePoint = sampleSet.createSamplePoint().setTimeInterval(startTime , startTime + 300000L, TimeUnit.MILLISECONDS);samplePoint.getFieldValue(Field.FIELD_BPM).setDoubleValue(90);sampleSet.addSample(samplePoint);// sampleSetList 用来存放健康明细数据List<SampleSet> sampleSetList = new ArrayList<>();sampleSetList.add(sampleSet); // samplePointList 用来存放统计数据点List<SamplePoint> samplePointList = new ArrayList<>();// 2.构造心率统计数据点SamplePoint samplePoint1 = new SamplePoint.Builder(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS).build();samplePoint1.getFieldValue(Field.FIELD_AVG).setDoubleValue(90);samplePoint1.getFieldValue(Field.FIELD_MAX).setDoubleValue(100);samplePoint1.getFieldValue(Field.FIELD_MIN).setDoubleValue(80);samplePoint1.getFieldValue(Field.FIELD_LAST).setDoubleValue(80);samplePoint1.setTimeInterval(startTime + 1L, startTime + 300000L, TimeUnit.MILLISECONDS);samplePointList.add(samplePoint1); // 3.构造健康记录的采集器(以心率过缓健康数据类型为例),以及构造健康记录结构体DataCollector dataCollector2 = new com.huawei.hms.hihealth.data.DataCollector.Builder() .setDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA) .setDataGenerateType(DataCollector.DATA_TYPE_RAW) .setPackageName(context) .setDataStreamName("such as step count") .build(); HealthRecord.Builder healthRecordBuilder = new HealthRecord.Builder(dataCollector2).setSubDataSummary(samplePointList) .setSubDataDetails(sampleSetList) .setStartTime(startTime, TimeUnit.MILLISECONDS) .setEndTime(endTime, TimeUnit.MILLISECONDS);// 给心率过缓健康数据类型的每个Field设置值healthRecordBuilder.setFieldValue(HealthFields.FIELD_THRESHOLD, 42d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48d);healthRecordBuilder.setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 42d);HealthRecord healthRecord = healthRecordBuilder.build(); // 4.构造待修改的updateOptions,记得携带插入成功后返回的healthRecordIdHealthRecordUpdateOptions updateOptions = new HealthRecordUpdateOptions.Builder().setHealthRecord(healthRecord) .setHealthRecordId(healthRecordIdFromInsertResult) .build(); healthRecordController.updateHealthRecord(updateOptions).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { logger("Health record updated successfully."); }}).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { logger(e.toString()); }});
说明
直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:
healthRecordIdFromInsertResult未定义解决办法:请使用将健康记录写入Health Service Kit回调中的HealthRecordId的值定义该字符串变量。
辅助函数logger没有定义解决办法:定义logger函数,参考下面的示例代码。
收起
自动换行
深色代码主题
复制
private static final String TAG = "HealthRecordController"; /** * 同时输出操作结果日志到logcat * * @param string日志字符串 */ private void logger(String string) { Log.i(TAG, string); }
查询Health Service Kit中的健康记录
用户可以通过HealthRecordController查询已经写入到Health Service Kit的健康记录相关数据,具体可执行以下操作:
应用需先确认是否已拥有健康记录数据操作权限,数据类型详见健康记录数据类型。 根据查询时间和相关条件,创建一个HealthRecordReadOptions。 使用HealthRecordController.getHealthRecord方法查询Health Service Kit中存储的健康记录相关数据。说明
调用查询运动健康数据的健康记录接口,接口参数中的开始时间和结束时间均需大于2014年1月1号对应的UNIX时间戳。 调用查询运动健康数据的健康记录接口,接口参数中的开始时间和结束时间之间的时间跨度不允许超过31天。以健康记录支持的心率过缓数据类型为例,查询HealthRecord示例代码如下:
收起
自动换行
深色代码主题
复制
// 请注意:// 1.此处的this为Activity对象// 2.此处的HealthRecordController类的对象,请在每次接口调用前初始化,避免相关Activity或Context失效导致的数据读取失败的问题HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this); // 设置请求体的开始时间和结束时间 Calendar cal = Calendar.getInstance();Date now = new Date();cal.setTime(now);long endTime = cal.getTimeInMillis();cal.add(Calendar.DAY_OF_YEAR, -1);long startTime = cal.getTimeInMillis(); // 构建读取运动记录的参数HealthRecordReadOptions List<DataType> subDataTypeList = new ArrayList<>();subDataTypeList.add(DataType.DT_INSTANTANEOUS_HEART_RATE);HealthRecordReadOptions healthRecordReadOptions = new HealthRecordReadOptions.Builder().setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) .readHealthRecordsFromAllApps() .readByDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA) .setSubDataTypeList(subDataTypeList) .build(); // 通过构造的HealthRecordReadOptions参数传入查询healthRecordTask<HealthRecordReply> task = healthRecordController.getHealthRecord(healthRecordReadOptions);task.addOnSuccessListener(new OnSuccessListener<HealthRecordReply>() { @Override public void onSuccess(HealthRecordReply readResponse) { logger("Get HealthRecord was successful!"); // 打印调用接口获取的运动记录列表 List<HealthRecord> recordList = readResponse.getHealthRecords(); for (HealthRecord record : recordList) { if (record == null) { continue; } dumpHealthRecord(record); logger("Print detailed data points associated with health records"); for (SampleSet dataSet : record.getSubDataDetails()) { dumpDataSet(dataSet); } } }});task.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { logger(e.toString()); }});
说明
直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:
辅助函数logger没有定义解决办法:定义logger函数,参考下面的示例代码。
收起
自动换行
深色代码主题
复制
private static final String TAG = "HealthRecordController"; /** * 同时输出操作结果日志到logcat * * @param string日志字符串 */ private void logger(String string) { Log.i(TAG, string); } 辅助函数dumpHealthRecord没有定义
解决办法:定义dumpHealthRecord函数,参考下面的示例代码。
收起
自动换行
深色代码主题
复制
/** * 将HealthRecord对象中的信息打印输出 * * @param healthRecord 健康记录对象 */ private void dumpHealthRecord(HealthRecord healthRecord) { logger("Print health record summary information!"); DateFormat dateFormat = DateFormat.getDateInstance(); DateFormat timeFormat = DateFormat.getTimeInstance(); if (healthRecord != null) { logger("tHealthRecordIdentifier: " + healthRecord.getHealthRecordId() + "ntpackageName: " + healthRecord.getDataCollector().getPackageName() + "ntStartTime: " + dateFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + "ntEndTime: " + dateFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + "ntHealthRecordDataType: " + healthRecord.getDataCollector().getDataType().getName() + "ntHealthRecordDataCollectorId: " + healthRecord.getDataCollector().getDataStreamId() + "ntmetaData: " + healthRecord.getMetadata() + "ntFileValueMap: " + healthRecord.getFieldValues()); if (healthRecord.getSubDataSummary() != null && !healthRecord.getSubDataSummary().isEmpty()) { SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); for (SamplePoint samplePoint : healthRecord.getSubDataSummary()) { logger("Sample point type: " + samplePoint.getDataType().getName()); logger("Start: " + sDateFormat.format(new Date(samplePoint.getStartTime(TimeUnit.MILLISECONDS)))); logger("End: " + sDateFormat.format(new Date(samplePoint.getEndTime(TimeUnit.MILLISECONDS)))); for (Field field : samplePoint.getDataType().getFields()) { logger("Field: " + field.getName() + " Value: " + samplePoint.getFieldValue(field)); } logger(System.lineSeparator()); } } }} 辅助函数dumpDataSet没有定义
解决办法:定义dumpDataSet函数,参考下面的示例代码。
收起
自动换行
深色代码主题
复制
/** * 将SampleSet对象中的SamplePoint打印输出 * * @param sampleSet 采样集 */ private void dumpDataSet(SampleSet sampleSet) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (SamplePoint samplePoint : sampleSet.getSamplePoints()) { logger("Sample point type: " + samplePoint.getDataType().getName()); logger("Start: " + dateFormat.format(new Date(samplePoint.getStartTime(TimeUnit.MILLISECONDS)))); logger("End: " + dateFormat.format(new Date(samplePoint.getEndTime(TimeUnit.MILLISECONDS)))); for (Field field : samplePoint.getDataType().getFields()) { logger("Field: " + field.getName() + " Value: " + samplePoint.getFieldValue(field)); } } }
相关知识
体重健康管理软件(体重记录)
健康记录与病历管理
医疗健康记录的核对与管理.docx
孕期日记:记录成长历程,智慧管理健康
健康医疗记录管理表.doc
健康管理APP开发 记录运动日常 管理身体健康
婴儿期成长记录与健康档案管理
中医药健康管理服务记录表
孕妇健康日记,记录与管理你的美好孕期
2025健康记录管理工具Top6评测:如何进行个人健康管理
网址: 管理健康记录 https://www.trfsz.com/newsview1905234.html
推荐资讯
- 1发朋友圈对老公彻底失望的心情 12775
- 2BMI体重指数计算公式是什么 11235
- 3补肾吃什么 补肾最佳食物推荐 11199
- 4性生活姿势有哪些 盘点夫妻性 10428
- 5BMI正常值范围一般是多少? 10137
- 6在线基础代谢率(BMR)计算 9652
- 7一边做饭一边躁狂怎么办 9138
- 8从出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828
