Member 13046079 Ответов: 0

Проблема с api Google fit history, возвращающим пустые наборы данных


Привет, ребята, у меня есть проблема с использованием Google Fit Api. Я получаю данные о деятельности только в определенных ситуациях. Я использую библиотеку RxFit (но у меня было такое же поведение, используя реализацию по умолчанию).

Моя реализация:

fun requestActivities(): Single<DataReadResult> {
    val fit = RxFit(context, arrayOf(Fitness.HISTORY_API), arrayOf(Scope(Scopes.FITNESS_ACTIVITY_READ)))
    val dataReadRequest = buildRequest(getStartEndTime())
    return fit.history().read(dataReadRequest).doOnSuccess { storeDatapoints(it) }
}

private fun storeDatapoints(data: DataReadResult) {
    val idlist = activityRepository.all().map { it.activityId }
    val activities = data.buckets
          .flatMap { it.dataSets }
          .flatMap { it.dataPoints }
          .filter { point ->
              //https://developers.google.com/fit/rest/v1/reference/activity-types
              val activity = point.getValue(Field.FIELD_ACTIVITY).asInt()
              return@filter activity != 0 && activity != 3 //&& !(109..112).contains(activity)
          }
          .map { point ->
              PersistentExerciseActivity(
                    activityId = point.timestampNanos.toString(),
                    date = Instant(point.getTimestamp(TimeUnit.MILLISECONDS)).toDateTime().toLocalDateTime(),
                    duration = point.getValue(Field.FIELD_DURATION).asInt() / 1000 / 60,
                    activity = point.getValue(Field.FIELD_ACTIVITY).asActivity(),
                    apiId = null
              )
          }
          .filter { !idlist.contains(it.activityId) }
    activityRepository.store(activities)
}

private fun getStartEndTime(): Pair<Long, Long> {
    val cal = Calendar.getInstance()
    val now = Date()
    cal.time = now

    cal.set(Calendar.HOUR_OF_DAY, 0)
    cal.set(Calendar.MINUTE, 0)
    cal.set(Calendar.MILLISECOND, 0)
    cal.set(Calendar.SECOND, 0)

    val endTime = cal.timeInMillis
    cal.add(Calendar.WEEK_OF_YEAR, -1)
    val startTime = cal.timeInMillis

    return Pair(startTime, endTime)
}

private fun buildRequest(startEndTime: Pair<Long, Long>): DataReadRequest {
    return DataReadRequest.Builder()
          .aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
          .bucketByTime(1, TimeUnit.DAYS)
          .setTimeRange(startEndTime.first, startEndTime.second, TimeUnit.MILLISECONDS)
          .enableServerQueries()
          .build()
}


Что я уже пробовал:

Когда я пытаюсь сделать это на своем собственном телефоне (Nexus 5X) с моей собственной учетной записью, он работает совершенно нормально. Если я попробую использовать другую учетную запись на своем телефоне, я получу успешный ответ, но никаких фактических данных об активности. То же самое относится и к другому устройству и другой учетной записи. И с моим собственным аккаунтом на другом устройстве это тоже не работает. То же самое происходит и при использовании эмулятора.

Есть ли у кого-нибудь какие-нибудь идеи, что может быть причиной этого?

С уважением,

Ролоф

0 Ответов