菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的()
健身房不开,国民“运动量”却爆发式上涨。
私教都拉不回的运动自律,被刘畊宏的一套毽子操拉回来了。最近程序员阿强也在女友的打卡带动下,跟着刘教练开启了在家健身模式,线上与千万网友隔空同频共振,阿强表示,终于找到快乐运动的正确打开方式。
阿强切身体会了居家健身需求的兴起,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、开发步骤
完整的开发流程如下。
文章图片
3、开始运动和停止运动功能实现
控制运动和获取实时运动配合使用顺序一般为:
(1)registerSportData,开始获取实时运动数据。
(2)startSport,开始运动。
(3)stopSport,停止运动。
(4)unregisterSportData,停止获取实时运动数据。
关键代码步骤
(1)开始获取实时运动数据
- 调用 HiHealthDataStore 对象的 registerSportData 方法,开始获取实时运动数据。
- 通过请求参数 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)开始运动
开始和结束运动支持的运动类型常量
文章图片
- 调用 HiHealthDataStore 对象的 startSport 方法,启动相应类型的运动。
- 通过请求参数 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)结束运动:
- 调用 HiHealthDataStore 对象的 stopSport 方法,停止相应类型的运动。
- 通过请求参数 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)停止获取实时运动数据:
- 调用 HiHealthDataStore 对象的 unregisterSportData 方法,停止获取实时运动数据。
- 通过请求参数 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 = https://www.it610.com/article/(HiHealthPointData) obj;
Log.i(TAG,"start time : " + pointData.getStartTime());
Log.i(TAG, "query steps : " + String.valueOf(pointData.getValue()));
}
}
}
});
查询数据所需参数及查询结果:
文章图片
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 = https://www.it610.com/article/(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、Gitee
【菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的()】关注我们,第一时间了解 HMS Core 最新技术资讯~
推荐阅读
- 程序员突破内卷大法(聊聊软件架构师成长之路(干货系列,说人话接地气))
- 程序员|2021最新Android开发者学习路线,已整理成文档
- Java程序员需要知道的操作系统知识汇总(持续更新)
- 实锤了!程序员喜提新头衔!!
- 程序员干货学习资源(持续更新)
- 5年程序员问我(什么是断言())
- 最佳Python课程(程序员和开发人员应在2020年考虑)
- 如何用程序员的方式,营造七夕氛围感()
- 每个程序员都应该经历一次软考
- 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧,建议收藏!!!