Google Fit не отображает данные, отправленные нашим приложением через Android SDK.

При попытке отправить данные в Google Fit через SDK Android (не API) данные не отображаются в Google Fit сразу, это шаги, которые я делаю:

  1. Я получаю данные из нашего API (эти сеансы получаются с наших устройств, а структура данных сборки — с наших компьютеров, использующих Интернет вещей); затем получим эти данные в формате .json, например:

{ "data": [ { "id": "aa8329a1-9841-4f94-8911-06500e11d17b", "startTime": "2022-06-11 12:11:18", "finishTime": "2022-06-11 12:43:18", "type": 2, "distance": 0.069394 } ] }

а затем отправьте эту информацию по шагам (на данный момент нам нужно только расстояние до поля магазина)

  1. Выполните вход в Google:
      GoogleSignInOptions
            .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestServerAuthCode(BuildConfig.WEB_CLIENT_GOOGLE_FIT)
            .requestIdToken(BuildConfig.WEB_CLIENT_GOOGLE_FIT)
            .requestScopes(
                Scope("https://www.googleapis.com/auth/fitness.activity.write"),
                Scope("https://www.googleapis.com/auth/fitness.heart_rate.write"),
                Scope("https://www.googleapis.com/auth/fitness.location.write"),
                Scope("https://www.googleapis.com/auth/fitness.activity.read"),
                Scope("https://www.googleapis.com/auth/fitness.location.read"))
            .build()
  1. Затем определите параметры пригодности для своих типов данных:
      FitnessOptions
            .builder()
            .addDataType(DataType.AGGREGATE_DISTANCE_DELTA, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.AGGREGATE_CALORIES_EXPENDED, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.AGGREGATE_SPEED_SUMMARY, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.AGGREGATE_HEART_POINTS, FitnessOptions.ACCESS_WRITE)
            .addDataType(DataType.TYPE_POWER_SAMPLE, FitnessOptions.ACCESS_WRITE)
            .build()
  1. Я хочу записывать только сейчас, сохранить в параметр расстояния Google Fit: //DISTANCE
      val distanceDataSource = DataSource.Builder()
                .setAppPackageName("com.bodytone.zapp.dev")
                .setDataType(DataType.AGGREGATE_DISTANCE_DELTA)
                .setStreamName("session-data-distance")
                .setType(DataSource.TYPE_RAW)
                .build()
  1. Создать точку данных:
      val distance = DataPoint.builder(distanceDataSource)
                .setTimeInterval(training1.getStartDateInMillis(), training1.getFinishDateInMillis(), TimeUnit.MILLISECONDS)
                .setField(Field.FIELD_DISTANCE, training1.distance.toFloat())
                .build()
  1. Набор данных Builder со следующими конфигурациями:
      val distanceDataSet = DataSet.builder(distanceDataSource)
                .add(distance)
                .build()
  1. Сделайте запрос на вставку:
      val insertRequest = SessionInsertRequest.Builder()
                .setSession(session)
                .addDataSet(distanceDataSet)
                .build()
  1. Создайте клиент сеанса с помощью InsertRequest:
      Fitness.getSessionsClient(requireActivity(), GoogleSignIn.getAccountForExtension(requireActivity(), fitnessOptions))
                .insertSession(insertRequest)
                .addOnSuccessListener {
                    Toast.makeText(requireActivity(), "Session insert was successful!", Toast.LENGTH_LONG).show()
                }
                .addOnCanceledListener {
                    Toast.makeText(requireActivity(), "Session insert was cancelled!", Toast.LENGTH_LONG).show()
                }
                .addOnFailureListener {
                    it.printStackTrace()
                    Toast.makeText(requireActivity(), "There was a problem inserting the session: ${it.message}", Toast.LENGTH_LONG).show()
                }
                .continueWith{
                    verifySession(training1)
                }

на данный момент мы всегда получаем сообщение от addOnSuccessListener, поэтому мы считаем, что эти данные хранятся в Google Fit, потому что получаем сообщение от addOnSuccessListener(), в котором говорится: «Вставка сеанса прошла успешно!»

как только мы закончим вставкуRequest, мы используем в continueWith методverifySession(training1), чтобы убедиться, что он был вставлен успешно:

      Fitness.getSessionsClient(requireActivity(), GoogleSignIn.getAccountForExtension(requireActivity(), fitnessOptions))
            .readSession(request)
            .addOnSuccessListener { sessionReadResponse ->
                // Get a list of the sessions that match the criteria to check the result.
                val sessions = sessionReadResponse.sessions
                Log.i("Bodytone", "Session read was successful. Number of returned sessions is: ${sessions.size}")
                for (session in sessions) {
                    // Process the session
                    dumpSession(session)
                    // Process the data sets for this session
                    val dataSets = sessionReadResponse.getDataSet(session)
                    for (dataSet in dataSets) {
                        dumpDataSet(dataSet)
                    }
                }
            }
            .addOnFailureListener {
                Timber.i("Error reading: ${it.message}")
            }

Затем, получив хранилище данных в Google Fit с помощью метода readSession , мы можем наблюдать, что эти данные отображаются успешно!!! Мы можем увидеть это хранилище сеансов с помощью этого метода!

Теперь возник вопрос: почему, если данные успешно сохранены в Google Fit, они не отображаются в приложении Google Fit? Кроме того, нам пришлось подождать около 30 минут, чтобы проверить, были ли эти данные сохранены в Google Fit, хотя, как мы показали выше, сеанс был сохранен успешно, затем восстановите этот сеанс и покажите, что все в порядке! Почему бы не отобразить этот сеанс в Google Fit, если все в порядке (Google Fit не показывает ошибок), все в порядке...¿Это может произойти с Google Fit?

ПД: Конфигурация консоли Google в порядке, весь рабочий пакет идентификаторов, идентификатор sha1, окно согласия oauth в порядке (тестовый режим) с тестовым пользователем на данный момент; профиль, который мы используем для просмотра сеанса Google, также относится к этому пользовательскому тесту; просто не отображаются данные, отправляемые в Google Fit, в приложении Google Fit (при этом наше приложение одобрено в ваших подключенных приложениях и при входе в Google Access)

Некоторая помощь, образец в git (работает)?

Большое спасибо!!

1 ответ

У меня возникла еще одна проблема с Google Fit, очень похожая на вашу. Я пишу в службу поддержки Google Fit и прошу помощи, и вот ответ, который они предоставили:

«... в настоящее время вы используете собственную библиотеку Android для GoogleFit. Она устарела с мая 2022 года, и мы больше не рекомендуем разработчикам использовать ее. Однако API-интерфейсы REST все еще активны, и мы рекомендуем разработчикам использовать их в будущем. Другой вариант — использовать Android Health Connect...».

Вот что я вам скажу: переходите на REST API или используйте Health Connect.

Другие вопросы по тегам