从1970年起获取Google Fit数据时日期参数无效问题求助
解决Google Fit起始时间戳无效的问题
嘿,这个坑我之前踩过!Google Fit的API对查询的起始时间有明确限制,你直接用-3600(对应1969年12月31日23:00 UTC)肯定会报错——它根本不允许查询这么早的时间,毕竟用户的Fit数据最早也就是他们开始使用Google Fit或关联设备的时间,而且API本身有最低时间阈值。
问题根源
你传入的起始时间远早于Google Fit系统允许的最早查询时间,所以触发了"日期无效"的错误提示。
两种解决方案
方案1:设置一个合理的"早期默认时间"
如果只是想获取用户所有可用的Fit数据,没必要硬卡1970年,直接设置一个足够早但API能接受的时间就行,比如十年前。这样API会自动返回用户实际有记录的数据,忽略无数据的时间段:
val endTime = System.currentTimeMillis() / 1000 // 转换成秒级时间戳 // 设置为十年前的时间,覆盖绝大多数用户的Fit使用周期 val startTime = endTime - 10 * 365 * 24 * 60 * 60 val readRequest = DataReadRequest.Builder() .aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime(1, TimeUnit.DAYS) .setTimeRange(startTime, endTime, TimeUnit.SECONDS) .build()
方案2:精确获取用户的最早Fit数据时间
如果需要更精准的起始时间,可以先查询用户最早的Fit记录时间,再用这个时间作为起始点:
// 先查询用户最早的步数记录(可替换为你需要的其他数据类型) val earliestDataRequest = DataReadRequest.Builder() .read(DataType.TYPE_STEP_COUNT_DELTA) .setTimeRange(0, System.currentTimeMillis() / 1000, TimeUnit.SECONDS) .setLimit(1) .setSortDescending(false) // 升序排序,第一条就是最早的记录 .build() // 执行查询并获取最早时间 GoogleFit.getHistoryClient(context, GoogleSignIn.getLastSignedInAccount(context)!!) .readData(earliestDataRequest) .addOnSuccessListener { result -> val earliestTime = if (result.dataPoints.isNotEmpty()) { result.dataPoints.first().getStartTime(TimeUnit.SECONDS) } else { // 如果用户还没有任何数据,设置一个默认的早期时间 System.currentTimeMillis() / 1000 - 365 * 24 * 60 * 60 } // 用获取到的最早时间构建最终查询请求 val readRequest = DataReadRequest.Builder() .aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime(1, TimeUnit.DAYS) .setTimeRange(earliestTime, System.currentTimeMillis() / 1000, TimeUnit.SECONDS) .build() // 继续处理查询结果... }
额外注意
Google Fit对不同数据类型的保留期限有差异:原始数据可能只保留数月,而聚合数据(比如你用的AGGREGATE_STEP_COUNT_DELTA)会保留更久,所以用十年前的时间作为起始点是非常安全的选择。
内容的提问来源于stack exchange,提问作者fesave
相关产品推荐
相关产品推荐

