应用集成 health kit 后,通过调用 DataController 中的十个接口来操作用户的运动数据和健康数据, 这十个接口包括:
这十个接口都封装在 DataController 对象中,因此在需要调用这十个接口前,必须先初始化一个 DataController 对象:dataController, 后续业务接口的调用都是通过调用 dataController 对象中的接口实现。初始化 DataController 对象的示例代码如下:
HiHealthOptions hiHealthOptions = HiHealthOptions.builder()
.addDataType(DataType.DT_CONTINUOUS_STEPS_DELTA, HiHealthOptions.ACCESS_READ)
.addDataType(DataType.DT_CONTINUOUS_STEPS_DELTA, HiHealthOptions.ACCESS_WRITE)
.addDataType(DataType.DT_INSTANTANEOUS_HEIGHT, HiHealthOptions.ACCESS_READ)
.addDataType(DataType.DT_INSTANTANEOUS_HEIGHT, HiHealthOptions.ACCESS_WRITE)
.build();
AuthHuaweiId signInHuaweiId = HuaweiIdAuthManager.getExtendedAuthResult(hiHealthOptions);
DataController dataController = HuaweiHiHealth.getDataController(context, signInHuaweiId);
在本开发指导中,使用步数增量(DataType.DT_CONTINUOUS_STEPS_DELTA)和身高(DataType.DT_INSTANTANEOUS_HEIGHT)两种数据类型进行示例说明,初始化 DataController 对象(dataController)时,仅请求了步数增量和身高的读写权限,即初始化后的dataController对象拥有步数增量和身高数据的读写权限。
将用户的运动健康数据插入到 Health 平台中。
DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build(); final SampleSet sampleSet = SampleSet.create(dataCollector);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date startDate = dateFormat.parse("2020-03-17 09:00:00");
Date endDate = dateFormat.parse("2020-03-17 09:05:00");
int stepsDelta = 1000; SamplePoint samplePoint = sampleSet.createSamplePoint() .setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS); samplePoint.getFieldValue(Field.FIELD_STEPS_DELTA).setIntValue(stepsDelta);
sampleSet.addSample(samplePoint);
Task<Void> insertTask = dataController.insert(sampleSet);
insertTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("Success insert a SampleSet into HMS core");
showSampleSet(sampleSet);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到两个辅助函数:Health 平台返回数据的显示函数 showSampleSet(SampleSet sampleSet) ,输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这两个函数的代码示例如下:
/**
* 将SampleSet对象中的SamplePoint打印输出
*
* @param sampleSet 样本数据集合
*/
private void showSampleSet(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));
}
}
}
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} 从 Health 平台删除历史数据,只能删除本应用插入的数据。
DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date startDate = dateFormat.parse("2020-03-17 09:00:00");
Date endDate = dateFormat.parse("2020-03-17 09:05:00"); DeleteOptions deleteOptions = new DeleteOptions.Builder().addDataCollector(dataCollector) .setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS) .build();
Task<Void> deleteTask = dataController.delete(deleteOptions);
deleteTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("Success delete sample data from HMS core");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到辅助函数:输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build(); SampleSet sampleSet = SampleSet.create(dataCollector);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date startDate = dateFormat.parse("2020-03-17 09:00:00");
Date endDate = dateFormat.parse("2020-03-17 09:05:00");
int stepsDelta = 2000; SamplePoint samplePoint = sampleSet.createSamplePoint() .setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS); samplePoint.getFieldValue(Field.FIELD_STEPS_DELTA).setIntValue(stepsDelta);
sampleSet.addSample(samplePoint);
UpdateOptions updateRequest = new UpdateOptions.Builder() .setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS) .setSampleSet(sampleSet) .build();
Task<Void> updateTask = dataController.update(updateRequest);
updateTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("Success update sample data from HMS core");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到辅助函数:输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} 从 Health 平台查询历史数据,例如读取某一时间段的步数,可以在 ReadOptions 指定读取的条件,如指定数据采集器,读取的数据类型,读取详情数据,读取到会直接返回数据集合。
DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date startDate = dateFormat.parse("2020-03-17 09:00:00");
Date endDate = dateFormat.parse("2020-03-17 09:05:00"); ReadOptions readOptions = new ReadOptions.Builder().read(dataCollector) .setTimeRange(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS) .build();
Task<ReadReply> readReplyTask = dataController.read(readOptions);
readReplyTask.addOnSuccessListener(new OnSuccessListener<ReadReply>() {
@Override
public void onSuccess(ReadReply readReply) {
logger("Success read a SampleSets from HMS core");
for (SampleSet sampleSet : readReply.getSampleSets()) {
showSampleSet(sampleSet);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到两个辅助函数:Health 平台返回数据的显示函数 showSampleSet(SampleSet sampleSet) ,输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这两个函数的代码示例如下:
/**
* 将SampleSet对象中的SamplePoint打印输出
*
* @param sampleSet 样本数据集合
*/
private void showSampleSet(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));
}
}
}
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} Task<SampleSet> todaySummationTask = dataController.readTodaySummation(DataType.DT_CONTINUOUS_STEPS_DELTA);
注意: 在本示例中, 插入的数据时间是固定时间"2020-03-17 09:05:00",在调测本示例中的接口时,需要将插入的数据时间修改成当天的日期,才能查询到数据。
todaySummationTask.addOnSuccessListener(new OnSuccessListener<SampleSet>() {
@Override
public void onSuccess(SampleSet sampleSet) {
logger("Success read today summation from HMS core");
if (sampleSet != null) {
showSampleSet(sampleSet);
}
}
});
todaySummationTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到两个辅助函数:Health 平台返回数据的显示函数 showSampleSet(SampleSet sampleSet) ,输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这两个函数的代码示例如下:
/**
* 将SampleSet对象中的SamplePoint打印输出
*
* @param sampleSet 样本数据集合
*/
private void showSampleSet(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));
}
}
}
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} Task<SampleSet> todaySummationTask = dataController.readTodaySummationFromDevice(DataType.DT_CONTINUOUS_STEPS_DELTA);
todaySummationTask.addOnSuccessListener(new OnSuccessListener<SampleSet>() {
@Override
public void onSuccess(SampleSet sampleSet) {
logger("Success read today device summation from HMS core");
if (sampleSet != null) {
showSampleSet(sampleSet);
}
}
});
todaySummationTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger(errorCode + ": " + errorMsg);
}
});
上面的代码片段中有用到两个辅助函数:Health 平台返回数据的显示函数 showSampleSet(SampleSet sampleSet) ,输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这两个函数的代码示例如下:
/**
* 将SampleSet对象中的SamplePoint打印输出
*
* @param sampleSet 样本数据集合
*/
private void showSampleSet(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));
}
}
}
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_INSTANTANEOUS_HEIGHT)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build(); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, DataRegisterReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
ModifyDataMonitorOptions dataMonitorOptions = new ModifyDataMonitorOptions.Builder().setModifyDataType(DataType.DT_INSTANTANEOUS_HEIGHT) .setModifyDataCollector(dataCollector) .setModifyDataIntent(pendingIntent) .build();
Task<Void> registerTask = dataController.registerModifyDataMonitor(dataMonitorOptions);
registerTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("Register Data Update Listener Success");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger("Register Data Update Listener Failure: " + errorCode + ": " + errorMsg);
pendingIntent = null;
}
}); DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
.setDataType(DataType.DT_INSTANTANEOUS_HEIGHT)
.setDataStreamName("STEPS_DELTA")
.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
.build();
SampleSet sampleSet = SampleSet.create(dataCollector);
SamplePoint samplePoint = sampleSet.createSamplePoint()
.setTimeInterval(System.currentTimeMillis(), System.currentTimeMillis(), TimeUnit.MILLISECONDS);
samplePoint.getFieldValue(Field.FIELD_HEIGHT).setFloatValue(1.56f);
sampleSet.addSample(samplePoint);
dataController.insert(sampleSet);
上面的代码片段中有用到辅助函数:
输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, DataRegisterReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
Task<Void> task = dataController.unregisterModifyDataMonitor(pendingIntent);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("Unregister Data Update Listener Success: ");
pendingIntent = null;
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger("Unregister Data Update Listener Failure: " + errorCode + ":" + errorMsg);
}
});
上面的代码片段中有用到辅助函数:输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} Task<Void> syncTask = dataController.syncAll();
syncTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("synAll success");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger("synAll failure" + errorCode + ":" + errorMsg);
}
});
上面的代码片段中有用到辅助函数:输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
} Task<Void> syncTask = dataController.clearAll();
syncTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
logger("clearAll success");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
String errorCode = e.getMessage();
String errorMsg = HiHealthStatusCodes.getStatusCodeMessage(Integer.parseInt(errorCode));
logger("clearAll failure" + errorCode + ":" + errorMsg);
}
});
上面的代码片段中有用到辅助函数:输出结果保存到日志及显示到页面 TextView 控件函数 logger(String string)。 这个函数的代码示例如下:
/**
* 同时输出操作结果日志到logcat和页面上的TextView控件
*
* @param string 日志字符串
*/
private void logger(String string) {
Log.i(TAG, string);
logInfoView.append(string + System.lineSeparator());
int offset = logInfoView.getLineCount() * logInfoView.getLineHeight();
if (offset > logInfoView.getHeight()) {
logInfoView.scrollTo(0, offset - logInfoView.getHeight());
}
}