Получение данных Google Fit, соответствующих Google Fit

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

Код разработчика клиента

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

person Matt McMinn    schedule 21.03.2015    source источник


Ответы (1)


Первое, что я, вероятно, попробую, - это избавиться от 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-минутные сегменты, и посмотрите, получится ли что-нибудь другое.

person Longmang    schedule 09.04.2015