2015-03-21 4 views
1

Я пытаюсь получить данные счетчика шага на ежедневной основе из Google Fit для отображения в моем приложении. Кажется, что код, который я использую, верен, поскольку я получаю некоторые данные, но цифры уходят, когда я сравниваю данные, которые я получаю с приложением Google Fit. Например, в Google Fit (как в Интернете, так и в приложении для Android) 19 марта отображается 2269 шагов. В моем приложении за 19 марта он показывает 64 шага. Данные, которые я получаю в моем приложении, постоянно ниже на 10. Я запрашиваю данные неправильно? Соответствующий код ниже.Получение данных Google Fit, соответствующих Google Fit

Клиент строитель код

GoogleApiClient.Builder builder = new GoogleApiClient.Builder(Main.instance) 
       .addApi(Fitness.API) 
       .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)); 

Запрос строитель код

private DataReadRequest queryFitnessData(long date) 
{ 
    // Build a single day range. 
    Calendar cal = Calendar.getInstance(); 
    cal.setTimeInMillis(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    long startTime = cal.getTimeInMillis(); 
    cal.add(Calendar.DATE, 1); 
    cal.add(Calendar.MILLISECOND, -1); 
    long endTime = cal.getTimeInMillis(); 

    DataReadRequest readRequest = new DataReadRequest.Builder() 
    .enableServerQueries() 
    .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA) 
    .bucketByTime(1, TimeUnit.DAYS) 
    .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) 
    .build(); 
    return readRequest; 
} 

Выполнение запроса

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

if(dataReadResult.getBuckets().size() > 0) 
{ 
    Bucket bucket = dataReadResult.getBuckets().get(0); 
    for(DataSet dataSet : bucket.getDataSets()) 
    { 
     for(DataPoint dp : dataSet.getDataPoints()) 
     { 
      if(dp.getDataType().equals(DataType.TYPE_STEP_COUNT_DELTA)) 
      { 
       for(Field field : dp.getDataType().getFields()) 
       { 
        if(field.getName().equals(Field.FIELD_STEPS.getName())) 
        { 
         if(listener != null) 
         { 
          listener.onStepCount(dp.getValue(field).asInt()); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

ответ

0

Первое, что я бы, наверное, попробовать это, чтобы избавиться от enableServerQueries() и запрашивать локальные данные, это может быть проблема времени синхронизации.

Вне этого трудно сказать, не видя некоторых других данных, которые возвращаются в dataReadResult. У меня возникнет соблазн внести несколько записей журнала, чтобы узнать, что происходит.

Мой код показан ниже, который работает для меня

for (Bucket bucket : dataReadResult.getBuckets()) { 

    Log.d(TAG, "Bucket start time: " + bucket.getStartTime(TimeUnit.SECONDS)); 

    List<DataSet> dataSets = bucket.getDataSets(); 

    totalStepsValue = 0; 

    for (DataSet dataSet : dataSets) { 
     for (DataPoint dp : dataSet.getDataPoints()) { 
      for (Field field : dp.getDataType().getFields()) { 
       if (field.getName().equals("steps")) { 
        totalStepsValue += dp.getValue(field).asInt(); 
       } 
      } 
     } 
    } 

    Log.d(TAG, "totalStepsValue: " + totalStepsValue); 
} 

Также попытайтесь получить дни данные, используя 30-минутные ведер и посмотреть, если вы получаете что-нибудь другое.

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