目录

DataController 开发

应用集成 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 平台中。

  1. 构造一个数据采集器对象。
    DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
    	.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
    	.setDataStreamName("STEPS_DELTA")
    	.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    	.build();
  1. 根据数据采集器,创建一个数据样本集合。
    final SampleSet sampleSet = SampleSet.create(dataCollector);
  1. 构造步数增量(DT_CONTINUOUS_STEPS_DELTA)一个采样点的开始、结束时间,增量步数。
    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;
  1. 构造一个步数增量(DT_CONTINUOUS_STEPS_DELTA)采样点。
    SamplePoint samplePoint = sampleSet.createSamplePoint()
    	.setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS);
    samplePoint.getFieldValue(Field.FIELD_STEPS_DELTA).setIntValue(stepsDelta);
  1. 将一个步数增量采样点存储到数据样本集合,也可以重复执行3 ~ 5添加多个样本点数据到样本集合。
    sampleSet.addSample(samplePoint);
  1. 调用数据控制器, 将数据样本集合插入到 Health 平台中。
    Task<Void> insertTask = dataController.insert(sampleSet);
  1. 调用数据控制器插入样本集合数据是异步操作,需要设置成功或失败的监听器,用来监听数据插入成功或失败。
    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 平台删除历史数据,只能删除本应用插入的数据。

  1. 构造删除条件: 一个数据采集器对象。
    DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
    	.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
    	.setDataStreamName("STEPS_DELTA")
    	.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    	.build();
  1. 构造删除条件时间区间: 开始,结束时间。
    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");
  1. 构造条件删除的参数对象。
    DeleteOptions deleteOptions = new DeleteOptions.Builder().addDataCollector(dataCollector)
    	.setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS)
    	.build();
  1. 使用指定的条件删除对象,调用数据控制器删除数据样本集。
    Task<Void> deleteTask = dataController.delete(deleteOptions);
  1. 调用数据控制器删除样本集合数据是异步操作,需要设置成功或失败的监听器,用来监听数据删除成功或失败。
    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());
	}
}

更新用户的运动健康数据

  1. 构造修改条件: 一个数据采集器对象。
    DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
    	.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
    	.setDataStreamName("STEPS_DELTA")
    	.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    	.build();
  1. 构造修改数据样本集合: 根据数据采集器,创建一个修改数据样本集合。
    SampleSet sampleSet = SampleSet.create(dataCollector);
  1. 构造修改步数增量(DT_CONTINUOUS_STEPS_DELTA)一个采样点的开始,结束时间,增量步数。
    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;
  1. 构造一个更新步数增量(DT_CONTINUOUS_STEPS_DELTA)采样点。
    SamplePoint samplePoint = sampleSet.createSamplePoint()
    	.setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS);
    samplePoint.getFieldValue(Field.FIELD_STEPS_DELTA).setIntValue(stepsDelta);
  1. 将一个更新步数增量采样点添加到修改数据样本集合,也可以重复执行3 ~ 5添加多个更新样本点数据到修改样本集合。
    sampleSet.addSample(samplePoint);
  1. 构造一个修改操作的参数对象。
    UpdateOptions updateRequest = new UpdateOptions.Builder()
    	.setTimeInterval(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS)
    	.setSampleSet(sampleSet)
    	.build();
  1. 使用指定的修改参数对象,调用数据控制器修改数据样本集。
    Task<Void> updateTask = dataController.update(updateRequest);
  1. 调用数据控制器修改样本集合数据是异步操作,需要设置成功或失败的监听器,用来监听数据更新成功或失败。
    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 指定读取的条件,如指定数据采集器,读取的数据类型,读取详情数据,读取到会直接返回数据集合。

  1. 构造查询条件: 一个数据采集器对象。
    DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
    	.setDataType(DataType.DT_CONTINUOUS_STEPS_DELTA)
    	.setDataStreamName("STEPS_DELTA")
    	.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    	.build();
  1. 构造查询条件时间区间: 开始,结束时间。
    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");
  1. 构造条件查询的查询对象。
    ReadOptions readOptions = new ReadOptions.Builder().read(dataCollector)
    	.setTimeRange(startDate.getTime(), endDate.getTime(), TimeUnit.MILLISECONDS)
    	.build();
  1. 使用指定的条件查询对象,调用数据控制器查询数据集。
    Task<ReadReply> readReplyTask = dataController.read(readOptions);
  1. 调用数据控制器查询样本集合数据是异步操作,需要设置成功或失败的监听器,用来监听数据查询成功或失败。
    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());
	}
}

查询用户的运动健康数据每日统计值

  1. 使用指定的数据类型(步数增量: DT_CONTINUOUS_STEPS_DELTA),调用数据控制器查询该数据类型的当天统计值。
    Task<SampleSet> todaySummationTask = dataController.readTodaySummation(DataType.DT_CONTINUOUS_STEPS_DELTA);
  1. 调用数据控制器查询当天的统计值是异步操作,需要设置成功或失败的监听器,用来监听数据查询成功或失败。

    注意: 在本示例中, 插入的数据时间是固定时间"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());
	}
}

查询用户本地设备的运动健康数据每日统计值

  1. 使用指定的数据类型(步数增量: DT_CONTINUOUS_STEPS_DELTA),调用数据控制器查询改数据类型的当天统计值。
    Task<SampleSet> todaySummationTask = dataController.readTodaySummationFromDevice(DataType.DT_CONTINUOUS_STEPS_DELTA);
  1. 调用数据控制器查询当天的统计值是异步操作,需要设置成功或失败的监听器,用来监听数据查询成功或失败。
    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());
	}
}

对用户数据运动健康数据更新添加监听

  1. 构造一个数据采集器对象, 数据类型指定当前允许添加监听的六种数据类型中的一种。
    • 基础代谢率(以每天千卡为单位):DataType.DT_INSTANTANEOUS_CALORIES_BMR。
    • 体脂率:DataType.DT_INSTANTANEOUS_BODY_FAT_RATE。
    • 身高(以米为单位):DataType.DT_INSTANTANEOUS_HEIGHT。
    • 单次饮水量(以升为单位):DataType.DT_INSTANTANEOUS_HYDRATE。
    • 用餐时摄入的的营养成分列表:DataType.DT_INSTANTANEOUS_NUTRITION_FACTS。
    • 体重(以千克为单位):DataType.DT_INSTANTANEOUS_BODY_WEIGHT。
    DataCollector dataCollector = new DataCollector.Builder().setPackageName(context)
    	.setDataType(DataType.DT_INSTANTANEOUS_HEIGHT)
    	.setDataStreamName("STEPS_DELTA")
    	.setDataGenerateType(DataCollector.DATA_TYPE_RAW)
    	.build();
  1. 构建一个数据修改的监听对象: PendingIntent。
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, DataRegisterReceiver.class),
    	PendingIntent.FLAG_UPDATE_CURRENT);
  1. 构造一个添加数据更改监听的参数对象。
    ModifyDataMonitorOptions dataMonitorOptions =
    	new ModifyDataMonitorOptions.Builder().setModifyDataType(DataType.DT_INSTANTANEOUS_HEIGHT)
    		.setModifyDataCollector(dataCollector)
    		.setModifyDataIntent(pendingIntent)
    		.build();
  1. 使用指定的添加数数据更改监听参数对象,调用数据控制器添加数据监听。
    Task<Void> registerTask = dataController.registerModifyDataMonitor(dataMonitorOptions);
  1. 调用数据控制器添加数据监听是异步操作,需要设置成功或失败监听器,用来监听数据监听成功或失败。
    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;
    	}
    });
  1. 调用下面的代码插入一条数据,可以触发上面的监听。
    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());
	}
}

取消对用户数据运动健康数据更新添加监听

  1. 构建一个数据修改的监听对象: PendingIntent。
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, DataRegisterReceiver.class),
    	PendingIntent.FLAG_UPDATE_CURRENT);
  1. 使用指定的更改监听参数对象,调用数据控制器取消数据监听。
    Task<Void> task = dataController.unregisterModifyDataMonitor(pendingIntent);
  1. 调用数据控制器删除数据监听是异步操作,需要设置完成,成功或失败监听器,监听删除数据监听成功或失败。
    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());
	}
}

用户运动健康数据的端云同步

  1. 调用数据控制器: 端云同步。
    Task<Void> syncTask = dataController.syncAll();
  1. 调用数据控制器端云同步是异步操作,需要设置成功或失败监听器,用来监听端云同步成功或失败。
    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());
	}
}

清空用户端云两侧的运动与健康数据

  1. 调用数据控制器: 清空端云所有本应用插入的数据。
    Task<Void> syncTask = dataController.clearAll();
  1. 调用数据控制器清空端云所有的用户数据是异步操作,需要设置成功或失败监听器,用来监听清空数据成功或失败。
    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());
    	}
    }