【问题标题】:Reading accurate sleeping data from Google Fit API从 Google Fit API 读取准确的睡眠数据
【发布时间】:2019-12-03 08:48:38
【问题描述】:

我目前正在开发一款可以从 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)
        }

【问题讨论】:

  • 我也遇到了同样的问题,你找到答案了吗?

标签: android api kotlin google-fit google-fit-sdk


【解决方案1】:

您是否可以只阅读活动片段并自己遍历它们而不是聚合?

val sleepReadRequest =
    DataReadRequest.Builder()
        .read(DataType.TYPE_ACTIVITY_SEGMENT)
        .setTimeRange(offset, end, TimeUnit.MILLISECONDS)
        .build()

然后您可以使用DataReadResult#getDataSet(DataType) 检索返回的数据。

如果您发现它超时(一次一年的数据可能相当多!)我建议将请求分成较小的请求并缓存过去不太可能改变的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多