- 项目需求是获取使用者的睡眠数据,硬件使用的是Miband3,用小米手环3来获取用户的睡眠数据。因为小米并没有提供小米手环的接口供开发者来调用 ,所以得多一步周转环节,利用小米手环的配套运动App:小米运动(MiFit)关联到谷歌健康(GoogleFit)上,当MiFit同步到手环上的数据之后,便会将数据同步到GoogleFit上面,如此便能够利用GoogleFit 提供给开发者的请求接口,将需要的数据从GoogleFit上获得到。因为换了对日的新工作,保密性严格所以不能把完整的源码贴出来了,只记录根据官方的文档和Demo去集成的时候,关键需要注意的地方,像前期准备工作准备一个谷歌账号,开发者平台注册项目,设置凭据添加Fit 服务这种的就不多加赘述。
- GoogleFit开发者官网文档,提供的代码样例太老了,是过时的写法,是不能正常跑起来的
上图是写入睡眠的官方文档。当你想要获取睡眠数据,如果GoogleFit上面没有睡眠数据供使用,你需要造一条假数据insert到GoogleFit,官网的写法如上图,但是如果AndroidStudio照着写,会发现全是错,比如第一行的dataType已经改名成了:
DataType.TYPE_ACTIVITY_SEGMENT
不仅如此,dataSet的装载也不是直接setValues的方式了,而是DataPoint的方式去装:
DataSet activitySegments = DataSet.create(dataSource);
DataPoint firstRunningDp = activitySegments.createDataPoint()
.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
firstRunningDp.getValue(Field.FIELD_ACTIVITY).setActivity(FitnessActivities.SLEEP_LIGHT);
activitySegments.add(firstRunningDp);
2.想读取小米的DataSet, SessionReadRequest要设置readSessionsFromAllApps(),把所有的拉取下来再判断,因为你不知道小米写入session的session name 是怎么命名的,不能像官网那样写成.setSessionName(SAMPLE_SESSION_NAME)。
3.拉取下来后会发现,虽然GoogleFit日志里只有一项睡眠记录,但是拉取下来小米的睡眠数据是根据睡眠段分的Session,一个Session对应一个睡眠段,比如下图所示session下标3到11就是属于睡眠的(这一步也解决了上一步关于session name的命名问题,由下图亦然可以知道session name 就是name字段的值),如果想计算睡眠总时间就得自己做一个判断了,取时间最早和最晚的睡眠session时间戳,睡眠阶段的code跟官方文档是一致的,如109浅睡眠,110深睡眠:
- MIband3只能记录夜间的睡眠数据,白天睡觉是不能识别的,官方如下回应:
- 查询的时间间隔要在sessionRequest前写明,比如想查询从昨天15:00到今天15:00的睡眠数据,可以如下写法:
//查询时间范围
Calendar cal = Calendar.getInstance();
cal.setTime(now);
hrOfDay = cal.get(Calendar.HOUR_OF_DAY);
Log.e("hrOfDay", hrOfDay + "");
cal.set(Calendar.HOUR_OF_DAY, 15); //yesterday 15 is my start time.
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.add(Calendar.DAY_OF_YEAR, -1);
startTime = cal.getTimeInMillis();
Calendar cal1 = Calendar.getInstance();
cal1.setTime(now);
cal1.set(Calendar.HOUR_OF_DAY, 15); //15 is my end time.
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
endTime = cal1.getTimeInMillis();
// Build a session read request
SessionReadRequest readRequest = new SessionReadRequest.Builder()
.setTimeInterval(startTime, endTime, MILLISECONDS)
.read(DataType.TYPE_ACTIVITY_SEGMENT)
// .setSessionName(SAMPLE_SESSION_NAME)
.readSessionsFromAllApps()
.build();
- MiBand3 支持设置多种语言,语言设置是跟手机走的,比如要设置成日语,只需要把手机语言设置成日语,再重新连接手环,等手环下载更新结束就可以了。
网友评论