2015-08-18 2 views
2

Я пытаюсь получить шагающие шаги с сегодняшнего дня. Поэтому я нашел 2 решения. 1)Google Fit History API - неправильные значения для шагов

private void getStepsToday() { 
    Calendar cal = Calendar.getInstance(); 
    Date now = new Date(); 
    cal.setTime(now); 
    long endTime = cal.getTimeInMillis(); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 00); 
    long startTime = cal.getTimeInMillis(); 

    final DataReadRequest readRequest = new DataReadRequest.Builder() 
      .read(DataType.TYPE_STEP_COUNT_DELTA) 
      .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) 
      .build(); 

    DataReadResult dataReadResult = 
      Fitness.HistoryApi.readData(mGoogleApiFitnessClient, readRequest).await(1, TimeUnit.MINUTES); 

    DataSet stepData = dataReadResult.getDataSet(DataType.TYPE_STEP_COUNT_DELTA); 

    int totalSteps = 0; 

    for (DataPoint dp : stepData.getDataPoints()) { 
     for(Field field : dp.getDataType().getFields()) { 
      int steps = dp.getValue(field).asInt(); 

      totalSteps += steps; 

     } 
    }} 

2)

private void getStepsToday() { 
    PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(mGoogleApiFitnessClient, DataType.TYPE_STEP_COUNT_DELTA); 
    DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS); 
    if (totalResult.getStatus().isSuccess()) { 
     DataSet totalSet = totalResult.getTotal(); 
     int total = totalSet.isEmpty() 
       ? 0 
       : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt(); 
     publishTodaysStepData(total); 
    } else { 
     publishTodaysStepData(0); 
    } 
} 

Используя первый я получить, например, 27, а с помощью второго шага 1 425 в качестве ответа. Правильный (после сравнения с Google app) должен быть 1425. Таким образом, почему первый не работает?

У меня также такая же проблема, попросив шаги с прошлой недели. Используя метод 1 для шагов с прошлой недели, я понял, что делаю шаги в течение правых дней (иногда даже правильных), но всякий раз, когда значение шагов больше 50 (я думаю), это значение неверно.

Есть ли у кого-нибудь ответ на это странное поведение?

ответ

1

Вы уверены, что TYPE_STEP_COUNT_DELTA подходит именно вам DataType. Из документов (их акцентом):

В типе com.google.step_count.delta данных, каждая точка данных представляет собой количество шагов, предпринятых с момента последнего чтения. При использовании этого типа данных каждый шаг сообщается только один раз, при чтении сразу же после шага. Объединяя все значения вместе в течение определенного периода времени, можно вычислить общее количество шагов за этот период.

В качестве примера, если пользователь прошел в общей сложности 5 шагов с тремя различными показаниями, значения для каждого показания могут быть [1, 2, 2].

Получите ожидаемые результаты, если вы используете вместо этого AGGREGATE_STEP_COUNT_DELTA?

2

Попробуйте

public int getStepsCount(long startTime, long endTime) { 
    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(); 
    PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi 
      .readData(
        fitnessClient, 
        new DataReadRequest.Builder() 
          .aggregate(ESTIMATED_STEP_DELTAS, 
            DataType.AGGREGATE_STEP_COUNT_DELTA) 
          .bucketByTime(1, TimeUnit.HOURS) 
          .setTimeRange(startTime, endTime, 
            TimeUnit.MILLISECONDS).build()); 
    int steps = 0; 
    DataReadResult dataReadResult = pendingResult.await(); 
    if (dataReadResult.getBuckets().size() > 0) { 
     //Log.e("TAG", "Number of returned buckets of DataSets is: " 
       //+ dataReadResult.getBuckets().size()); 
     for (Bucket bucket : dataReadResult.getBuckets()) { 
      List<DataSet> dataSets = bucket.getDataSets(); 
      for (DataSet dataSet : dataSets) { 
       for (DataPoint dp : dataSet.getDataPoints()) { 
        for (Field field : dp.getDataType().getFields()) { 
         steps += dp.getValue(field).asInt(); 
        } 
       } 
      } 
     } 
    } else if (dataReadResult.getDataSets().size() > 0) { 
     for (DataSet dataSet : dataReadResult.getDataSets()) { 
      for (DataPoint dp : dataSet.getDataPoints()) { 
       for (Field field : dp.getDataType().getFields()) { 
        steps += dp.getValue(field).asInt(); 
       } 
      } 
     } 
    } 
    return steps; 
} 
0

Если вам нужен шаг отсчеты от readDailyTotal() и readData(), чтобы быть равным, вы должны указать источник данных, как:

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(); 

Это количество будет соответствовать рассчитывать из приложения Google FIT. See here

Смежные вопросы