文档管理中心
我的

HealthRecordController

展开

Class Info

public class HealthRecordController

健康记录的接口定义,用户可通过该接口插入、删除、修改和读取健康记录数据。

开发者可以通过HuaweiHiHealth类获取到HealthRecordController。

获取HealthRecordController对象的示例代码如下:
Java
Kotlin
// 获取healthRecordController对象
// 请注意此处的this为Activity对象
HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this);
// 获取healthRecordController对象
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)

Public Method Summary

展开

Qualifier and Type

Method Name and Description

Task<String>

addHealthRecord(HealthRecordInsertOptions insertOption)

将健康记录插入到Health Service Kit。

Task<Void>

deleteHealthRecord(HealthRecordDeleteOptions deleteOptions)

根据请求参数删除健康记录数据。

Task<HealthRecordReply>

getHealthRecord(HealthRecordReadOptions readOption)

读取健康记录数据的接口,可通过设置readOptions的参数,读取不同时间、数据类型、数据采集源等维度的数据。

Task<Void>

updateHealthRecord(HealthRecordUpdateOptions updateOption)

对于已有健康记录数据进行修改,若指定修改的健康记录不存在,则给出报错提示信息。

Public Methods

addHealthRecord(HealthRecordInsertOptions insertOption)

展开

Method

public Task<String> addHealthRecord(HealthRecordInsertOptions insertOption)

将健康记录插入到Health Service Kit。

Parameters

展开

Name

Description

insertOption

向Health Service Kit中插入的健康记录参数。

Returns

展开

Type

Description

Task<String>

返回插入的健康记录数据的标志。

请注意保存此标志,用于调用updateHealthRecord接口。

示例代码如下:
Java
Kotlin
// 请注意此处的this为Activity对象
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.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetList
DataCollector dataCollector =
    new com.huawei.hms.hihealth.data.DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE)
        .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
        .setPackageName(getApplicationContext())
        .setDataStreamName("such as step count")
        .build();
SampleSet sampleSet = SampleSet.create(dataCollector);
// 预置时间跨度5分钟,设置心率明细点值88
SamplePoint 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);

// 2.创建用来承载心率统计数据类型的采集器,与统计数据点
DataCollector dataCollector1 = new com.huawei.hms.hihealth.data.DataCollector.Builder()
    .setDataType(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(getApplicationContext())
    .setDataStreamName("such as step count")
    .build();
// samplePointList 用来存放统计数据点
List<SamplePoint> samplePointList = new ArrayList<>();
// 构造心率统计数据点
SamplePoint samplePoint1 = new SamplePoint.Builder(dataCollector1).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(getApplicationContext())
    .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());
    }
});
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
// 设置请求体的开始时间和结束时间
val cal = Calendar.getInstance()
val now = Date()
cal.time = now
val endTime = cal.timeInMillis
cal.add(Calendar.HOUR_OF_DAY, -1)
val startTime = cal.timeInMillis

// 1.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetList
val dataCollector =
    DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE)
        .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
        .setPackageName(applicationContext)
        .setDataStreamName("such as step count")
        .build()
val sampleSet = SampleSet.create(dataCollector)
// 预置时间跨度5分钟,设置心率明细点值88
val samplePoint =
    sampleSet.createSamplePoint().setTimeInterval(startTime , startTime + 300000L, TimeUnit.MILLISECONDS)
samplePoint.getFieldValue(Field.FIELD_BPM).setDoubleValue(88.0)
sampleSet.addSample(samplePoint)
// sampleSetList 用来存放健康明细数据
val sampleSetList = ArrayList<SampleSet>()
sampleSetList.add(sampleSet)

// 2.创建用来承载心率统计数据类型的采集器,与统计数据点
val dataCollector1 = DataCollector.Builder()
    .setDataType(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(applicationContext)
    .setDataStreamName("such as step count")
    .build()
// samplePointList 用来存放统计数据点
val samplePointList = ArrayList<SamplePoint>()
// 构造心率统计数据点
val samplePoint1 = SamplePoint.Builder(dataCollector1).build()
samplePoint1.getFieldValue(Field.FIELD_AVG).setDoubleValue(90.0)
samplePoint1.getFieldValue(Field.FIELD_MAX).setDoubleValue(100.0)
samplePoint1.getFieldValue(Field.FIELD_MIN).setDoubleValue(80.0)
samplePoint1.getFieldValue(Field.FIELD_LAST).setDoubleValue(80);
samplePoint1.setTimeInterval(startTime + 1L, startTime + 300000L, TimeUnit.MILLISECONDS)
samplePointList.add(samplePoint1)

// 3.构造健康记录的采集器(以心率过缓健康数据类型为例),以及构造健康记录结构体
val dataCollector2 = DataCollector.Builder()
    .setDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(applicationContext)
    .setDataStreamName("such as step count")
    .build()

val healthRecordBuilder = HealthRecord.Builder(dataCollector2).setSubDataSummary(samplePointList)
    .setSubDataDetails(sampleSetList)
    .setStartTime(startTime, TimeUnit.MILLISECONDS)
    .setEndTime(endTime, TimeUnit.MILLISECONDS)
// 给心率过缓健康数据类型的每个Field设置值
healthRecordBuilder.setFieldValue(HealthFields.FIELD_THRESHOLD, 40.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 44.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 40.0)
val healthRecord = healthRecordBuilder.build()

val insertOptions = HealthRecordInsertOptions.Builder().setHealthRecord(healthRecord).build()

healthRecordController!!.addHealthRecord(insertOptions).addOnSuccessListener { healthRecordId ->
    // 请保存好插入成功后返回的healthRecordId,这个healthRecordId用于修改健康记录场景
    healthRecordIdFromInsertResult = healthRecordId
    logger("The health record is added successfully,please save the healthRecordId:\n$healthRecordId")
}.addOnFailureListener { e -> logger(e.toString()) }
说明

直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:

1. healthRecordController没有定义

解决办法:healthRecordController是类HealthRecordController的对象,开发者可以通过HuaweiHiHealth类获取到healthRecordController。
Java
Kotlin
// 获取healthRecordController对象
// 请注意此处的this为Activity对象
HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this);
// 获取healthRecordController对象
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)

2. 辅助函数logger没有定义

解决办法:定义logger函数,参考下面的示例代码。
Java
Kotlin
private static final String TAG = "HealthRecordController";

/** 
 * 同时输出操作结果日志到logcat 
 * 
 * @param string日志字符串
 */ 
private void logger(String string) { 
    Log.i(TAG, string); 
}
private val TAG = "HealthRecordController"

/**
 * 同时输出操作结果日志到logcat
 *
 * @param string日志字符串
 */
private fun logger(string: String) {
    Log.i(TAG, string)
}

3. 字符串变量healthRecordIdFromInsertResult未定义

解决办法:healthRecordIdFromInsertResult字符串用来作为updateHealthRecord接口调用的参数,具体的定义参考如下,需在调用insert成功后予以赋值。

Java
private String healthRecordIdFromInsertResult  = "";
Kotlin
private val healthRecordIdFromInsertResult  = ""

updateHealthRecord(HealthRecordUpdateOptions updateOption)

展开

Method

public Task<Void> updateHealthRecord(HealthRecordUpdateOptions updateOption)

对于已有健康记录数据进行修改,若指定修改的健康记录数据不存在,则给出报错提示信息。

Parameters

展开

Name

Description

updateOption

修改Health Service Kit中健康记录的参数。

Returns

展开

Type

Description

Task<Void>

用来检查请求是否成功、失败、已完成的Task对象。

示例代码如下:
Java
Kotlin
// 请注意此处的this为Activity对象
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.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetList
DataCollector dataCollector =
    new com.huawei.hms.hihealth.data.DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE)
        .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
        .setPackageName(getApplicationContext())
        .setDataStreamName("such as step count")
        .build();
SampleSet sampleSet = SampleSet.create(dataCollector);
// 预置时间跨度5分钟,设置心率明细点值90
SamplePoint 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);

// 2.创建用来承载心率统计数据类型的采集器,与统计数据点
DataCollector dataCollector1 = new com.huawei.hms.hihealth.data.DataCollector.Builder()
    .setDataType(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(getApplicationContext())
    .setDataStreamName("such as step count")
    .build();
// samplePointList 用来存放统计数据点
List<SamplePoint> samplePointList = new ArrayList<>();
// 构造心率统计数据点
SamplePoint samplePoint1 = new SamplePoint.Builder(dataCollector1).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(getApplicationContext())
    .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,记得携带插入成功后返回的healthRecordId
HealthRecordUpdateOptions 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());
    }
});
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
// 设置请求体的开始时间和结束时间
val cal = Calendar.getInstance()
val now = Date()
cal.time = now
val endTime = cal.timeInMillis
cal.add(Calendar.HOUR_OF_DAY, -1)
val startTime = cal.timeInMillis

// 1.创建用来承载心率明细数据类型的采集器与存放明细数据的sampleSetList
val dataCollector =
    DataCollector.Builder().setDataType(DataType.DT_INSTANTANEOUS_HEART_RATE)
        .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
        .setPackageName(applicationContext)
        .setDataStreamName("such as step count")
        .build()
val sampleSet = SampleSet.create(dataCollector)
// 预置时间跨度5分钟,设置心率明细点值90
val samplePoint =
    sampleSet.createSamplePoint().setTimeInterval(startTime , startTime + 300000L, TimeUnit.MILLISECONDS)
samplePoint.getFieldValue(Field.FIELD_BPM).setDoubleValue(90.0)
sampleSet.addSample(samplePoint)
// sampleSetList 用来存放健康明细数据
val sampleSetList = ArrayList<SampleSet>()
sampleSetList.add(sampleSet)

// 2.创建用来承载心率统计数据类型的采集器,与统计数据点
val dataCollector1 = DataCollector.Builder()
    .setDataType(DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(applicationContext)
    .setDataStreamName("such as step count")
    .build()
// samplePointList 用来存放统计数据点
val samplePointList = ArrayList<SamplePoint>()
// samplePointList 用来存放统计数据点
val samplePoint1 = SamplePoint.Builder(dataCollector1).build()
samplePoint1.getFieldValue(Field.FIELD_AVG).setDoubleValue(90.0)
samplePoint1.getFieldValue(Field.FIELD_MAX).setDoubleValue(100.0)
samplePoint1.getFieldValue(Field.FIELD_MIN).setDoubleValue(80.0)
samplePoint1.getFieldValue(Field.FIELD_LAST).setDoubleValue(80);
samplePoint1.setTimeInterval(startTime + 1L, startTime + 300000L, TimeUnit.MILLISECONDS)
samplePointList.add(samplePoint1)

// 3.构造健康记录的采集器(以心率过缓健康数据类型为例),以及构造健康记录结构体
val dataCollector2 = DataCollector.Builder()
    .setDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA)
    .setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    .setPackageName(applicationContext)
    .setDataStreamName("such as step count")
    .build()

val healthRecordBuilder = HealthRecord.Builder(dataCollector2).setSubDataSummary(samplePointList)
    .setSubDataDetails(sampleSetList)
    .setStartTime(startTime, TimeUnit.MILLISECONDS)
    .setEndTime(endTime, TimeUnit.MILLISECONDS)
// 给心率过缓健康数据类型的每个Field设置值
healthRecordBuilder.setFieldValue(HealthFields.FIELD_THRESHOLD, 42.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48.0)
healthRecordBuilder.setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 42.0)
val healthRecord = healthRecordBuilder.build()

// 4.构造待修改的updateOptions,记得携带插入成功后返回的healthRecordId
val updateOptions = HealthRecordUpdateOptions.Builder().setHealthRecord(healthRecord)
    .setHealthRecordId(healthRecordIdFromInsertResult)
    .build()

healthRecordController!!.updateHealthRecord(updateOptions)
    .addOnSuccessListener { logger("Health record updated successfully.") }
    .addOnFailureListener { e -> logger(e.toString()) }
说明

直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:

  1. healthRecordIdFromInsertResult未定义

    解决办法:请使用addHealthRecord方法回调中的healthRecordIdFromInsertResult的值定义该字符串变量。

  2. healthRecordController没有定义
    解决办法:healthRecordController是类HealthRecordController的对象,开发者可以通过HuaweiHiHealth类获取到healthRecordController。
    Java
    Kotlin
    // 获取healthRecordController对象
    // 请注意此处的this为Activity对象
    HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this);
    // 获取healthRecordController对象
    // 请注意此处的this为Activity对象
    val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
  1. 辅助函数logger没有定义
    解决办法:定义logger函数,参考下面的示例代码。
    Java
    Kotlin
    private static final String TAG = "HealthRecordController";
    
    /** 
     * 同时输出操作结果日志到logcat 
     * 
     * @param string日志字符串
     */ 
    private void logger(String string) { 
        Log.i(TAG, string); 
    }
    private val TAG = "HealthRecordController"
    
    /**
     * 同时输出操作结果日志到logcat
     *
     * @param string日志字符串
     */
    private fun logger(string: String) {
        Log.i(TAG, string)
    }

getHealthRecord(HealthRecordReadOptions readOption)

展开

Method

public Task<HealthRecordReply> getHealthRecord(HealthRecordReadOptions readOption)

读取健康记录数据的接口,可通过设置readOption的参数,读取不同时间、数据类型、数据采集源等维度的数据。

Parameters

展开

Name

Description

readOption

从华为Health Service Kit中读取健康记录数据的请求参数。

Returns

展开

Type

Description

Task<HealthRecordReply>

返回健康记录读取响应结果。

示例代码如下:
Java
Kotlin
// 请注意此处的this为Activity对象
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 
// 以下以读取指定时间范围内的心率过缓(DT_HEALTH_RECORD_BRADYCARDIA)健康记录为例,关联读取指定时间范围内的心率数据(DT_INSTANTANEOUS_HEART_RATE)
// 如果需要读取其他类型的运动期间的详情数据,请开发者自行添加对应的数据类型
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参数传入查询healthRecord
Task<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());
    }
});
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
// 设置请求体的开始时间和结束时间
val cal = Calendar.getInstance()
val now = Date()
cal.time = now
val endTime = cal.timeInMillis
cal.add(Calendar.DAY_OF_YEAR, -1)
val startTime = cal.timeInMillis

// 构建读取健康记录的参数HealthRecordReadOptions
// 以下以读取指定时间范围内的心率过缓(DT_HEALTH_RECORD_BRADYCARDIA)健康记录时间为例,关联读取指定时间范围内的心率数据(DT_INSTANTANEOUS_HEART_RATE)
// 如果需要读取其他类型的运动期间的详情数据,请开发者自行添加对应的数据类型
val healthRecordReadOptions =
    HealthRecordReadOptions.Builder().setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
        .readHealthRecordsFromAllApps()
        .readByDataType(HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA)
        .setSubDataTypeList(listOf(DataType.DT_INSTANTANEOUS_HEART_RATE))
        .build()

// 通过构造的HealthRecordReadOptions参数传入查询healthRecord
val task = healthRecordController!!.getHealthRecord(healthRecordReadOptions)
task.addOnSuccessListener { readResponse ->
    logger("Get HealthRecord was successful!")
    // 打印调用接口获取的健康记录列表
    val recordList = readResponse.healthRecords
    for (record in recordList) {
        if (record == null) {
            continue
        }
        dumpHealthRecord(record)
        logger("Print detailed data points associated with health records")
        for (dataSet in record.subDataDetails) {
            dumpDataSet(dataSet)
        }
    }
}
task.addOnFailureListener { e -> logger(e.toString()) }
说明

直接拷贝使用上述示例代码,会有下面多处报错,错误点和解决办法如下:

  1. healthRecordController没有定义
    解决办法:healthRecordController是类HealthRecordController的对象,开发者可以通过HuaweiHiHealth类获取到healthRecordController。
    Java
    Kotlin
    // 获取healthRecordController对象
    // 请注意此处的this为Activity对象
    HealthRecordController healthRecordController = HuaweiHiHealth.getHealthRecordController(this);
    // 获取healthRecordController对象
    // 请注意此处的this为Activity对象
    val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
  2. 辅助函数logger没有定义
    解决办法:定义logger函数,参考下面的示例代码。
    Java
    Kotlin
    private static final String TAG = "HealthRecordController";
    
    /** 
     * 同时输出操作结果日志到logcat 
     * 
     * @param string日志字符串
     */ 
    private void logger(String string) { 
        Log.i(TAG, string); 
    }
    private val TAG = "HealthRecordController"
    
    /**
     * 同时输出操作结果日志到logcat
     *
     * @param string日志字符串
     */
    private fun logger(string: String) {
        Log.i(TAG, string)
    }
  3. 辅助函数dumpHealthRecord没有定义
    解决办法:定义dumpHealthRecord函数,参考下面的示例代码。
    Java
    Kotlin
    /** 
      * 将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() + "\n\tpackageName: "
                + healthRecord.getDataCollector().getPackageName() + "\n\tStartTime: "
                + dateFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + " "
                + timeFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + "\n\tEndTime: "
                + dateFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + " "
                + timeFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + "\n\tHealthRecordDataType: "
                + healthRecord.getDataCollector().getDataType().getName() + "\n\tHealthRecordDataCollectorId: "
                + healthRecord.getDataCollector().getDataStreamId() + "\n\tmetaData: " + healthRecord.getMetadata()
                + "\n\tFileValueMap: " + 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());
                }
            }
        }
    }
    /** 
      * 将HealthRecord对象中的信息打印输出
      * 
      * @param healthRecord 健康记录对象
      */ 
    private fun dumpHealthRecord(healthRecord: HealthRecord?) {
        logger("Print health record summary information!")
        val dateFormat = DateFormat.getDateInstance()
        val timeFormat = getTimeInstance()
        if (healthRecord != null) {
            logger(
                "\tHealthRecordIdentifier: " + healthRecord.healthRecordId + "\n\tpackageName: "
                    + healthRecord.dataCollector.packageName + "\n\tStartTime: "
                    + dateFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + " "
                    + timeFormat.format(healthRecord.getStartTime(TimeUnit.MILLISECONDS)) + "\n\tEndTime: "
                    + dateFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + " "
                    + timeFormat.format(healthRecord.getEndTime(TimeUnit.MILLISECONDS)) + "\nHealthRecordDataType: "
                    + healthRecord.dataCollector.dataType.name + "\n\tHealthRecordDataCollectorId: "
                    + healthRecord.dataCollector.dataStreamId + "\n\tmetaData: " + healthRecord.metadata
                    + "\n\tFileValueMap: " + healthRecord.fieldValues
            )
    
            if (healthRecord.subDataSummary != null && !healthRecord.subDataSummary.isEmpty()) {
                val sDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
    
                for (samplePoint in healthRecord.subDataSummary) {
                    logger("Sample point type: " + samplePoint.dataType.name)
                    logger("Start: " + sDateFormat.format(Date(samplePoint.getStartTime(TimeUnit.MILLISECONDS))))
                    logger("End: " + sDateFormat.format(Date(samplePoint.getEndTime(TimeUnit.MILLISECONDS))))
                    for (field in samplePoint.dataType.fields) {
                        logger("Field: " + field.name + " Value: " + samplePoint.getFieldValue(field))
                    }
                    logger(System.lineSeparator())
                }
            }
        }
    }
  1. 辅助函数dumpDataSet没有定义
    解决办法:定义dumpDataSet函数,参考下面的示例代码。
    Java
    Kotlin
    /** 
      * 将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)); 
            } 
        } 
    }
    /**
     * 将SampleSet对象中的SamplePoint打印输出
     *
     * @param sampleSet 样本数据集合
     */
    private fun dumpDataSet(sampleSet: SampleSet) {
        val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.SIMPLIFIED_CHINESE)
    
        for (samplePoint in sampleSet.samplePoints) {
            logger("Sample point type: " + samplePoint.dataType.name)
            logger("Start: " + dateFormat.format(Date(samplePoint.getStartTime(TimeUnit.MILLISECONDS))))
            logger("End: " + dateFormat.format(Date(samplePoint.getEndTime(TimeUnit.MILLISECONDS))))
            for (field in samplePoint.dataType.fields) {
                logger("Field: " + field.name + " Value: " + samplePoint.getFieldValue(field))
            }
        }
    }

deleteHealthRecord(HealthRecordDeleteOptions deleteOption)

展开

Method

public Task<Void> deleteHealthRecord(HealthRecordDeleteOptions deleteOption)

根据请求参数删除健康记录数据。

说明
  1. 删除健康记录接口支持按健康记录id删除,也支持按数据类型和删除时间段进行删除,若两者都存在时则按健康记录id为准。
  2. 可以通过设置是否删除关联详情数据subDataTypeList删除详情数据。

Parameters

展开

Name

Description

deleteOption

删除的健康记录查询请求,包括healthRecordIds、删除时间段、数据类型。

Returns

展开

Type

Description

Task<Void>

用来检查请求是否成功、失败、已完成的Task对象。

删除健康记录的示例代码如下:
Java
Kotlin
// 请注意此处的this为Activity对象
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();
// 构造请求对象的dataType
DataType dataType = HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA;
// 构造请求对象的subDataTypeList
List<DataType> subDataTypeList = Collections.singletonList(DataType.DT_INSTANTANEOUS_HEART_RATE);
// 此处设置的healthRecordIds为插入成功后返回的healthRecordId
List<String> healthRecordIds = Collections.singletonList("healthRecordId");

// 构造删除对象请求体
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) {
        logger(e.toString());
    }
});
// 请注意此处的this为Activity对象
val healthRecordController = HuaweiHiHealth.getHealthRecordController(this)
// 构造请求对象的时间区间:开始和结束时间
// 请注意此处设置的开始时间和结束时间均需大于2014年1月1号对应的UNIX时间戳
val cal = Calendar.getInstance()
val now = Date()
cal.setTime(now)
val endTime = cal.getTimeInMillis()
cal.add(Calendar.DAY_OF_YEAR, -2)
val startTime = cal.getTimeInMillis()
// 构造请求对象的dataType
val dataType = HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA
// 此处设置的healthRecordIds为插入成功后返回的healthRecordId
val subDataTypeList = Collections.singletonList(DataType.DT_INSTANTANEOUS_HEART_RATE)
// 构造请求对象的healthRecordIds 
val healthRecordIds = Collections.singletonList("healthRecordId")

// 构造删除对象请求体
val deleteRequest = HealthRecordDeleteOptions.Builder()
    .setHealthRecordIds(healthRecordIds)
    .isDeleteSubData(true)
    .setDataType(dataType)
    .setSubDataTypeList(subDataTypeList)
    .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
    .build()

// 调用deleteHealthRecord接口删除健康记录
val deleteTask = healthRecordController!!.deleteHealthRecord(deleteRequest)
deleteTask.addOnSuccessListener { Log.i("HealthRecords", "HealthRecord deleted successfully.") }
    .addOnFailureListener { e ->
        val errorCode = e.message
        val errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode!!))
        Log.i("HealthRecords", "$errorCode: $errorMsg")
    }