Google Fit не отображает данные, отправленные нашим приложением через Android SDK.
При попытке отправить данные в Google Fit через SDK Android (не API) данные не отображаются в Google Fit сразу, это шаги, которые я делаю:
- Я получаю данные из нашего 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 } ] }
а затем отправьте эту информацию по шагам (на данный момент нам нужно только расстояние до поля магазина)
- Выполните вход в 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()
- Затем определите параметры пригодности для своих типов данных:
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()
- Я хочу записывать только сейчас, сохранить в параметр расстояния 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()
- Создать точку данных:
val distance = DataPoint.builder(distanceDataSource)
.setTimeInterval(training1.getStartDateInMillis(), training1.getFinishDateInMillis(), TimeUnit.MILLISECONDS)
.setField(Field.FIELD_DISTANCE, training1.distance.toFloat())
.build()
- Набор данных Builder со следующими конфигурациями:
val distanceDataSet = DataSet.builder(distanceDataSource)
.add(distance)
.build()
- Сделайте запрос на вставку:
val insertRequest = SessionInsertRequest.Builder()
.setSession(session)
.addDataSet(distanceDataSet)
.build()
- Создайте клиент сеанса с помощью 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.