>source

우리는 마지막 Google Fit App Update가 데이터가 크게 떨어진 이래로, 우리는 code에서 문제를 식별하려고 시도한 이래로 우리는 사용자 기반에서 확인했습니다. 타이밍을주는 것은 우리가 사용하고 있었던 버전 (18.0)이 문제가 있다고 생각했습니다. SDK 20.0으로 업그레이드하면 결과가 개선되지 않았지만 데이터가 실속에서 중단되었습니다. 현재 Google Fit Trough에 연결된 사용자의 50-60 %가 SDK가 (이전 작업) 구현에 따라 더 이상 데이터를 회수 할 수 없습니다. 그들은 잃어 버리지 않으며, 그들은 여전히 ​​여기에있는 비트를 보내지 만 더 이상 그것이 무엇을했는지는 아닙니다.

이 그래프는 측면 중 하나가 잘못된 일을해야한다는 결론을 이끌어주는 이벤트의 타임 라인을 보여줍니다.

아래의 code 예제는 가독성을 위해 대부분의 데이터 처리 code로 제거되었지만 거기에 있습니다.

우리의 피트니스 클라이언트 요청fitnessoptions.access_read.아래 언급 된 모든 유형의 경우, 앱에 따라 다른 모든 유형의 경우 전경 또는 배경에서 초기화 될 때마다 사용자가 수락 한 사항을 요청하는지 확인하십시오.

우리는 매일 전체 또는 로컬 장치 일일 합계를 요청할 때 더 이상 값을 반환하지 않지만, 집합되지 않은 읽기에서 요청할 때 같은 기간의 데이터 청크를 더 이상 반환하지 않음을 확인할 수 있습니다.

DataType.TYPE_STEP_COUNT_DELTA
DataType.TYPE_CALORIES_EXPENDED
DataType.TYPE_HEART_RATE_BPM

우리는 또한 Avail을 사용하지 않고 총계 대응을 가능하게합니다.

DataType.AGGREGATE_CALORIES_EXPENDED
DataType.AGGREGATE_STEP_COUNT_DELTA

업데이트 전에 일하는 현재 GetDailyTotal 구현은 우리의 현재 GetDailyTotal 구현입니다.. 개발자 사이트 쇼의 예제로 똑바로 쓸모가 있습니다.:

Fitness.getHistoryClient(context, account)
                .readDailyTotal(type)
                .addOnSuccessListener {
                    Logger.i("${type.name}::DailyTotal::Success")
                    onResponse(it)
                }

이것은 현재 묻는 시간에 관계없이 현재 0을 반환합니다.

다음 우리는 개발자 사이트 예제에 따라 GetDailyTotal이 내부에서가는 것과 관련이있는 것을 에뮬레이트하는 보완 code가 있습니다. 에서 : 일 시작 00:00:00, UTc+ 1 to : 일단 23:59:59, UTc+ 1 유형 : 모든 데이터 유형.

val readRequest= DataReadRequest.Builder()
                    .enableServerQueries()
                    .aggregate(type)
                    .bucketByTime(1, TimeUnit.DAYS)
                    .setTimeRange(from.time, to.time, TimeUnit.MILLISECONDS)
                    .build()
            val account= GoogleSignIn
                    .getAccountForExtension(context, fitnessOptions!!)
            GFitClient.request(context, account, readRequest) {
                if (it== null) {
                    aggregatedRequestError(type)
                } else {
                    Logger.i(TAG, "Aggregated ${type.name} received.")
                }
            }

여기서는 일반적인 결과는 1) null 또는 빈 결과, 2) 실제로 결과가 발생합니다 (의 경우DataType.TYPE_STEP_COUNT_DELTA.때로는 이 일어난다) 또는 3) apiexceptioncode 5012,이 데이터 유형은 집계 할 수 없습니다.

우리는 이중 이후 단일 집계를 사용하고 있습니다.(유형, type.Aggregate)일부 개발자 사이트 예제는 여전히 사용되지만 몇 가지 버전이 아직 사용되지만 몇 가지 버전이 필요하지 않습니다.

사용 (또는 그렇지 않음).EnableServerqueries ()최종 결과를 수정하지 않습니다.

마침내 우리는 최악의 상황을 가정하고 우리가 수동으로 집계하는지 상관없이 우리는 그 날을 위해 아무 것도 요청하지 않습니다. 이것은 일반적으로 결과를보고하고 다른 사람들은 그렇지 않았습니다. 슬프게도 그 결과는 편안함을 느낄 정도로 결코 결정적이지 않습니다.

val readRequest= DataReadRequest.Builder()
                        .enableServerQueries()
                        .read(type)
                        .bucketByTime(1, TimeUnit.DAYS)
                        .setTimeRange(from.time, to.time, TimeUnit.MILLISECONDS)
                        .build()
                val account= GoogleSignIn
                        .getAccountForExtension(context, fitnessOptions!!)

이것은 작동하는 경향이 있지만 데이터의 수동 처리는 데이터 세트, 버킷 및 전체 데이터 집합 구조의 복잡한 중첩 된 특성을 고려할 수있는 복잡합니다.

우리는 또한 맞는 앱에서 명확하게 표시되는 데이터를 검색 할 때 문제를 발견했지만 SDK가 해당 서브 세트 만 반환하는 동안 SDK가 앱에 나타나는 Huawei Health Activities와 같이 SDK에 나타나지 않습니다. SDK는 미국 데이터 (예를 들어, 하이트, REM, 깊은 ...)를 반환하는 SDK는 세션없이 단일 수면 블록과 동일한 수면을 보여줍니다.

SDK가 우리를 돌려주는 동일한 데이터를 가진 제 3 자 앱에 표시된 수면 세션 :

Google Fit 앱에 표시된 동일한 수면 세션 :

문서가 말하는 한 :

Android API의 경우 데이터 유형과 맞는 플랫폼으로 읽습니다. 병합 된 스트림을 기본적으로 반환하십시오. 이것은 자동으로 모두 포함됩니다다른 앱이 작성한 데이터를 포함하여 앱에서 사용할 수있는 데이터. 데이터가 왔는지 앱이나 장치 목록을 볼 수 없게됩니다. Android API에서.

우리는 병합 된 스트림이 실시간으로 제대로 작동하지 않고 (백엔드에서 직접 데이터를 보여주는 데이터를 보여주는 SDK와 SDK가 아직 작성되지 않은 SDK 사이의 지연으로 설명 될 수 있음)이 아니라 아닙니다. 차이의 분 또는 시간의 문제로 때로는 결코 나타나지 않습니다.

이 데이터를 검색하는 방법을 이해하려면 백그라운드가 있습니다.WorkerManager Couroutinejob그 때마다 (시스템이 그렇게 할 때, 우리가 선호하는 것)을 주어 지지만, 우리가 더 선호하는 것 (이렇게 묻는 것으로 묻는 것)은 1 시간 또는 몇 시간 만에 데이터를 최신 상태로 유지하기 위해 한 번입니다. 피트니스 앱에 표시), 우리는 마지막 업데이트에서 마지막 날짜 일로 데이터를 요청하거나 오늘날의 일일 총 (또는 현재 시간까지 "작동하지 않는"깔때기에 달려 있습니다. 마지막 업데이트 날짜에도).

  • 우리의 구현에는 잘못된 것이 있습니까?
  • Google Fit이 연결된 앱에 데이터를보고하는 방식을 변경 했습니까?
  • 어떻게 든 더 진실 된 데이터를 얻을 수 있습니까?
  • 는 동일한 데이터를 다르게 요청할 수있는 방법이 있으며,보다 효율적으로? 우리는 주로 시간 버킷 /세션이 아닌 매일 요약, 합계 및 평균을 얻는 데 주로 관심이 있습니다. 우리는 두 가지 모두를 요청하지만 다른 사용 사례를 다루는 다른 데이터 깔창으로 이동합니다.

첫 번째 그래프가 무엇을 보여주고 있는지 명확히시킬 수 있습니까?

Graeme Morgan2021-06-22 16:11:00

"일반적인 결과는 1) null 또는 빈 결과"빈 결과를 얻는 경우 왜 그렇게 예상치 못한 이유를 설명 할 수 있습니까? 적합 앱 또는 REST API를 통해 특정 사용자의 데이터를 볼 수 있습니까?

Graeme Morgan2021-06-22 16:11:00

@gramemorgan 첫 번째 그래프는 Fit SDK에서 앱 사용자가 제공 한 데이터의 양을 보여줍니다. 빈 결과를 얻는 경우 왜 그렇게 예상치 못한 이유를 설명 할 수 있습니까? 적합 앱 또는 REST API를 통해 특정 사용자의 데이터를 볼 수 있습니까? 예, # 1에서는 SDK가 반환되지 않은 앱에 항상 매일 데이터 데이터가 있습니다. 예제, requestDailyTotal (steps_count_delta)은 DataPoint 대부분의 시간이없는 데이터 집합을 반환하는 반환 반면 단계가 있으며 실제로 마지막 시도에서 실제로 검색됩니다. "마침내 우리는 최악의 경우 ..."

CptEric2021-06-22 16:11:00

@ glaememorgan 첫 번째 그래프가 SDK 20.0 업데이트가 될 때까지 우리 측면에서 업데이트되지 않고 긴 실행이 아닌 앱을 보여주고 싶습니다. 새로운 FIT 앱이 배포되는 즉시 감소가 시작되었습니다.

CptEric2021-06-22 16:11:00

그래프 추가 세부 사항 : SDK에만 적용되는 6H 기간 당 6H 기간 당 ne-catculative, 새로 전달 된 데이터의 척도입니다.

CptEric2021-06-22 16:11:00
  • 답변 # 1

    대답이 없으며 침묵 만 있습니다. Firebase 팀의 멋진 지원.

    당사의 솔루션은 데이터를 위해 rowdy 연속 수표를 맺었고 모든 실패에 대해 우리가 다른 방식으로 시도합니다.

  • 이전 c++ : String SSID가있는 Wi-Fi에 연결 ESP32
  • 다음 rust : 성명서의 오른쪽이 어떤 일을하고 있습니까?