我目前正在开发一个将从Google Fit获取健身历史数据的应用。确定步数和体重是可以的,但是获取睡眠数据有点问题。我想获得准确的开始时间和结束时间,但唯一的方法是按活动细分进行分类。问题是,当您要获取大量数据时(我当前正在开发的应用程序最多需要从365天之前获取数据),它甚至不会返回超时错误,并且我的应用程序会一直保持加载中。它甚至不会开始从Google Fit中读取数据。因此,我想问一下,尽管活动量很大,是否有办法按活动段获取睡眠数据?并且请共享您的代码。顺便说一下,这就是我获取睡眠数据的方式:
val sleepReadRequest = DataReadRequest.Builder().aggregate(DataType.TYPE_ACTIVITY_SEGMENT,DataType.AGGREGATE_ACTIVITY_SUMMARY).bucketByActivitySegment(1,TimeUnit.MINUTES).setTimeRange(offset,end,TimeUnit.MILLISECONDS).build()
LogUtil.d(TAG, "getting sleep data...") Fitness.getHistoryClient( context, Objects.requireNonNull<GoogleSignInAccount>(GoogleSignIn.getLastSignedInAccount(context)) ) .readData(sleepReadRequest) .addOnSuccessListener { dataReadResponse -> LogUtil.d(TAG, "success sleep data") val secondSet = handleDataReturned(dataReadResponse, false, DateUtil.convertTimeStampToDate(offset, DateUtil.DATE_FORMAT)) dailyData.addAll(secondSet) val allDailyList = getDailyDataList(dailyData, userHeight) callback.onGetDataSuccess(allDailyList) } .addOnFailureListener { e -> LogUtil.d(TAG, "fail sleep data") if (e is ApiException && e.statusCode == GoogleFitError.NOT_SIGNED.code) { // not signed app exception revokePermission(context) callback.onGetDataFailure(GoogleFitError.parse(e.statusCode)) } else { callback.onGetDataFailure(AppError.parse(Throwable(e))) } } .addOnCompleteListener { task -> LogUtil.d(TAG, "complete sleep data") callback.onGetDataComplete(task) }
而不是汇总,您能只阅读活动段并自己遍历它们吗?
val sleepReadRequest =
DataReadRequest.Builder()
.read(DataType.TYPE_ACTIVITY_SEGMENT)
.setTimeRange(offset, end, TimeUnit.MILLISECONDS)
.build()
然后您可以使用DataReadResult#getDataSet(DataType)
检索返回的数据。
[如果您发现它超时了(一次可能会大量存储一年的数据!),我建议将请求批量处理成较小的请求,并在过去将数据缓存,这种情况不太可能改变。