2015-04-02 2 views
11

Я разработал приложение, которое должно отображать ежедневные подсчеты шагов. Для этого я использовал API, доступный в Google Fit SDK.Шаг подсчета, полученный с помощью Google Fit Api, не соответствует количеству шагов, отображаемых в Google Fit Official App

Все, кажется, работает правильно, но количество шагов, которое я получаю, не совпадает с показанным в Официальном приложении Google Fit.

Например, я получаю 2308 шагов, когда приложение Google Fit App отображает 2367 шагов.

Есть ли причина для этого? Кто-нибудь имеет такую ​​же проблему? У кого-нибудь есть ключ?

+0

Возможно ли разместить код? Вы использовали класс AsyncTask для записи шагов в фоновом режиме? Я задал этот вопрос несколько дней назад, но никто не ответил мне. Http: //stackoverflow.com/questions/30129784/getting-step-count-from-google-fit. – Theo

+0

Можете ли вы разместить свой код? –

+0

Это может помочь http://www.gadgetsaint.com/android/google-fit-steps-calories-android/#.WESRX6J97BJ – ASP

ответ

24

Я нашел решение.

Приложение Fit выполняет некоторую дополнительную обработку поверх шагов. Он оценивает шаги, основанные на активности, когда никто не записывается.

Если это может помочь кому-то: Вы должны использовать пользовательские DataSource пакета com.google.android.gms

DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder() 
      .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
      .setType(DataSource.TYPE_DERIVED) 
      .setStreamName("estimated_steps") 
      .setAppPackageName("com.google.android.gms") 
      .build(); 

И использовать это в совокупности метод как это:

DataReadRequest readRequest = new DataReadRequest.Builder() 
      .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA) 
      .bucketByTime(1, TimeUnit.DAYS) 
      .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) 
      .build(); 
+0

Это помогло мне, хорошая работа. Как вы получили это решение? Любой источник этой информации, или просто ваша напряженная работа? – cyborg86pl

+0

@ Томас Томас это блестящий, ты можешь помочь мне с одной вещью? DataSource всегда имеет значение null, как я могу узнать количество шагов от запуска, ходьбы и т. Д.? – ShahrozKhan91

+1

Я до сих пор не получаю то же значение, большинство дней вернулось больше, чем сообщает Google Fit! Это на самом деле более неточно, чем показано в примере. –

0

Google Fit sdk входит в состав сервисов Google Play. Официальное приложение Google Fit также собирает те же данные из sdk услуг Google Play, но Google, вероятно, добавил еще несколько кодов в приложение Google Fit, чтобы сделать данные более точным. Это также может быть ошибкой в ​​приложении Google Fit.

4

Google Play Services 7.3 (выпущен 28.04.2015) добавил новый метод к HistoryApi.readDailyTotal, который соответствует количеству шагов в официальном приложении Google Fit и более удобен в использовании.

PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(fitnessApiClient, DataType.AGGREGATE_STEP_COUNT_DELTA); 
    DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS); 
    if (totalResult.getStatus().isSuccess()) { 
     DataSet totalSet = totalResult.getTotal(); 
     steps = totalSet.isEmpty() ? -1 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt(); 
    } 
+0

Как я смогу сделать это без обслуживания? Используя await, он дает ошибку в главном коде операции и изменение ожидания до 0 секунд не получает данные. – sirvar

+1

Вы не можете сделать это без сервисов Google Play. Вы должны использовать ожидание в фоновом потоке. Если вы хотите использовать его в основном потоке, вызовите result.setResultCallback (...); – Trung

+0

Как мне получить расстояние, используя Fitness.HistoryApi.readDailyTotal – Query

1

Как запрошено Sameer Z. Я отправляю полный код для получения значений.

DataSource estimatedSteps = new DataSource.Builder() 
    .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
    .setType(DataSource.TYPE_DERIVED) 
    .setStreamName("estimated_steps") 
    .setAppPackageName("com.google.android.gms") 
    .build(); 

DataReadRequest readRequest = new DataReadRequest.Builder() 
     .aggregate(estimatedSteps, DataType.AGGREGATE_STEP_COUNT_DELTA) 
     .setTimeRange(startTimeSeconds, endTimeSeconds, TimeUnit.SECONDS) 
     .bucketByTime(1, TimeUnit.DAYS) 
     .enableServerQueries() 
     .build(); 

PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(client, readRequest); 
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() { 
    @Override 
    public void onResult(@NonNull DataReadResult dataReadResult) { 
     List<Bucket> allBuckets = dataReadResult.getBuckets(); 

     for (Bucket bucket : allBuckets) { 
      long startAtSeconds = bucket.getStartTime(TimeUnit.SECONDS); 

      Value stepsValue = getValue(bucket, DataType.TYPE_STEP_COUNT_DELTA, Field.FIELD_STEPS); 
      int steps = stepsValue != null ? stepsValue.asInt() : 0; 

      Log.d(TAG, String.format("startAtSeconds %s, steps %s", startAtSeconds, steps)); 
     } 
    } 
}); 
Смежные вопросы