5

菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?

 2 years ago
source link: https://blog.51cto.com/u_14815220/5329006
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

健身房不开,国民“运动量”却爆发式上涨。

私教都拉不回的运动自律,被刘畊宏的一套毽子操拉回来了。最近程序员阿强也在女友的打卡带动下,跟着刘教练开启了在家健身模式,线上与千万网友隔空同频共振,阿强表示,终于找到快乐运动的正确打开方式。
阿强切身体会了居家健身需求的兴起,BUT,其不足之处也渐渐浮现。

线上跟学,一套动作,统一的节奏无法适配每一个人的身体状态…长期不运动或运动量小的同学,习惯了peace模式的身体骤然接受大开大合、耗时不短的健身操,健身热情跟得上,身体和心脏也跟不上,所以,在家健身的男生女生们,需要一个贴身运动健康管家来实时监控运动状况!

收到内心发来的开发需求,阿强说干就干,使用HMS Core的​ ​运动健康服务​​能力,打造了一个运动管家App,开始运动后,实时监控运动时间、消耗的卡路里、心率等健康数据,帮助调整运动状态。

菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?_数据

Demo示例

关于华为运动健康服务(HUAWEI Health Kit)

运动健康服务分为基础能力服务和扩展能力服务。

基础能力服务:Health Kit基础能力提供原子化数据开放,在获取用户对数据的授权后,应用通过接口访问运动健康数据,对用户数据进行增、删、改、查等操作,为用户提供运动健康类数据服务。

扩展能力服务: Health Kit扩展能力服务开放更多实时运动和健康数据、运动和健康解决方案场景化数据。

运动管家App相关能力则是基于Health Kit拓展能力中的功能进行开发。

1、 开发环境要求

Android 平台的要求

安装Android Studio 3.X及以上
JDK 1.8.211及以上

应用应满足以下条件

minSdkVersion 24
targetSdkVersion 29
compileSdkVersion 29
Gradle 4.6及以上
测试应用的设备要求Android 6.0 及以上版本且装有华为运动健康App的华为手机。

2、开发步骤

完整的开发流程如下。

菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?_bundle_02

3、开始运动和停止运动功能实现

控制运动和获取实时运动配合使用顺序一般为:
(1)registerSportData,开始获取实时运动数据。
(2)startSport,开始运动。
(3)stopSport,停止运动。
(4)unregisterSportData,停止获取实时运动数据。

关键代码步骤

(1)开始获取实时运动数据

  1. 调用 HiHealthDataStore 对象的 registerSportData 方法,开始获取实时运动数据。
  2. 通过请求参数 HiSportDataCallback 对象,返回查询结果,结果中数据类型参考实时运动 Bundle 对象键值。
HiHealthDataStore.registerSportData(context, new HiSportDataCallback() {
@Override
public void onResult(int resultCode) {
// 接口调用结果
Log.i(TAG, "registerSportData onResult resultCode:" + resultCode);
}

@Override
public void onDataChanged(int state, Bundle bundle) {
// 实时数据变化回调
Log.i(TAG, "registerSportData onChange state: " + state);
StringBuffer stringBuffer = new StringBuffer("");
if (state == HiHealthKitConstant.SPORT_STATUS_RUNNING) {
Log.i(TAG, "heart rate : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_HEARTRATE));
Log.i(TAG, "distance : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_DISTANCE));
Log.i(TAG, "duration : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_DURATION));
Log.i(TAG, "calorie : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_CALORIE));
Log.i(TAG, "totalSteps : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_STEPS));
Log.i(TAG, "totalCreep : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_CREEP));
Log.i(TAG, "totalDescent : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_DESCENT));
}
}
});

(2)开始运动
开始和结束运动支持的运动类型常量

菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?_数据_03
  1. 调用 HiHealthDataStore 对象的 startSport 方法,启动相应类型的运动。
  2. 通过请求参数 ResultCallback 对象,返回查询结果。
// 室外跑步
int sportType = HiHealthKitConstant.SPORT_TYPE_RUN;
HiHealthDataStore.startSport(context, sportType, new ResultCallback() {
@Override
public void onResult(int resultCode, Object message) {
if (resultCode == HiHealthError.SUCCESS) {
Log.i(TAG, "start sport success");
}
}
});

(3)结束运动:

  1. 调用 HiHealthDataStore 对象的 stopSport 方法,停止相应类型的运动。
  2. 通过请求参数 ResultCallback 对象,返回查询结果。
HiHealthDataStore.stopSport(context, new ResultCallback() {
@Override
public void onResult(int resultCode, Object message) {
if (resultCode == HiHealthError.SUCCESS) {
Log.i(TAG, "stop sport success");
}
}
});

(4)停止获取实时运动数据:

  1. 调用 HiHealthDataStore 对象的 unregisterSportData 方法,停止获取实时运动数据。
  2. 通过请求参数 HiSportDataCallback 对象,返回查询结果。
HiHealthDataStore.unregisterSportData(context, new HiSportDataCallback() {
@Override
public void onResult(int resultCode) {
// 接口调用结果
Log.i(TAG, "unregisterSportData onResult resultCode:" + resultCode);
}

@Override
public void onDataChanged(int state, Bundle bundle) {
// 此时不会被调用
}
});

4、今日活动量查询功能实现

查询每日活动量,包含步数统计、步数详情、距离、热量及运动中高强度,这部分数据来源于手机或华为穿戴设备,需先申请开通权限,并获取用户授权,否则接口将调用失败。所需权限​ ​点此查询​​。

(1)使用 execQuery 接口查询用户每日活动量
1、调用 HiHealthDataStore 对象的 execQuery 方法,查询用户每日活动量。
2、通过请求参数 ResultCallback 对象,返回查询结果。
步数统计为例:

int timeout = 0;
// 查询当天步数
Calendar currentDate = Calendar.getInstance();
currentDate.set(Calendar.HOUR_OF_DAY, 0);
currentDate.set(Calendar.MINUTE, 0);
currentDate.set(Calendar.SECOND, 0);
long startTime = currentDate.getTimeInMillis();
long endTime = System.currentTimeMillis();
// 查询步数
HiHealthDataQuery hiHealthDataQuery = new HiHealthDataQuery(HiHealthPointType.DATA_POINT_STEP_SUM, startTime,
endTime, new HiHealthDataQueryOption());
HiHealthDataStore.execQuery(context, hiHealthDataQuery, timeout, new ResultCallback() {
@Override
public void onResult(int resultCode, Object data) {
Log.i(TAG, "query steps resultCode: " + resultCode);
if (resultCode == HiHealthError.SUCCESS && data instanceof List) {
List dataList = (ArrayList) data;
for (Object obj : dataList) {
HiHealthPointData pointData = (HiHealthPointData) obj;
Log.i(TAG, "start time : " + pointData.getStartTime());
Log.i(TAG, "query steps : " + String.valueOf(pointData.getValue()));
}
}
}
});

查询数据所需参数及查询结果:

菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?_bundle_04

5、运动记录查询

查询30天内运动记录代码示例:
1、调用 HiHealthDataStore 对象的 execQuery 方法,查询用户运动记录。
2、通过请求参数 ResultCallback 对象,返回查询结果。

int timeout = 0;
long endTime = System.currentTimeMillis();
// 查询时间范围 : 30 天
long startTime = endTime - 1000 * 60 * 60 * 24 * 30L;
// 查询跑步记录
HiHealthDataQuery hiHealthDataQuery = new HiHealthDataQuery(HiHealthSetType.DATA_SET_RUN_METADATA, startTime,
endTime, new HiHealthDataQueryOption());
HiHealthDataStore.execQuery(context, hiHealthDataQuery, timeout, new ResultCallback() {
@Override
public void onResult(int resultCode, Object data) {
if (resultCode == HiHealthError.SUCCESS && data instanceof List){
List dataList = (List) data;
for (Object obj : dataList) {
HiHealthSetData hiHealthData = (HiHealthSetData) obj;
Map map = hiHealthData.getMap();
Log.i(TAG, "start time : " + hiHealthData.getStartTime());
Log.i(TAG, "total_time : " + map.get(HiHealthKitConstant.BUNDLE_KEY_TOTAL_TIME));
Log.i(TAG, "total_distance : " + map.get(HiHealthKitConstant.BUNDLE_KEY_TOTAL_DISTANCE));
Log.i(TAG, "total_calories : " + map.get(HiHealthKitConstant.BUNDLE_KEY_TOTAL_CALORIES));
Log.i(TAG, "step : " + map.get(HiHealthKitConstant.BUNDLE_KEY_STEP));
Log.i(TAG, "average_pace : " + map.get(HiHealthKitConstant.BUNDLE_KEY_AVERAGEPACE));
Log.i(TAG, "average_speed : " + map.get(HiHealthKitConstant.BUNDLE_KEY_AVERAGE_SPEED));
Log.i(TAG, "average_step_rate : " + map.get(HiHealthKitConstant.BUNDLE_KEY_AVERAGE_STEP_RATE));
Log.i(TAG, "step_distance : " + map.get(HiHealthKitConstant.BUNDLE_KEY_STEP_DISTANCE));
Log.i(TAG, "average_heart_rate : " + map.get(HiHealthKitConstant.BUNDLE_KEY_AVERAGE_HEART_RATE));
Log.i(TAG, "total_altitude : " + map.get(HiHealthKitConstant.BUNDLE_KEY_TOTAL_ALTITUDE));
Log.i(TAG, "total_descent : " + map.get(HiHealthKitConstant.BUNDLE_KEY_TOTALDESCENT));
Log.i(TAG, "data source : " + map.get(HiHealthKitConstant.BUNDLE_KEY_DATA_SOURCE));
}
}
}
});

点此查询​ ​数据所需参数及查询结果​

了解更多详情>>

访问​ ​华为开发者联盟官网​

获取​ ​开发指导文档​

华为移动服务开源仓库地址:​ ​GitHub​

关注我们,第一时间了解 HMS Core 最新技术资讯~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK