Google fit получает данные о упражнениях в Android за час

В настоящее время я разрабатываю приложение для Android, связанное с данными о фитнесе, для этого приложения мне нужно получить Step_Count, HEART_RATE_BPM, продолжительность сна и данные об упражнениях. Мне нужно получать данные ежечасно, поэтому я использую bucketByTime как 1 час, и я используя AGGREGATE_ACTIVITY_SUMMARY для получения сводных данных об активности всех действий за 1 час. Я также могу отфильтровать данные об упражнениях, но это нецелесообразно, потому что в API указано слишком много типов упражнений. Я ищу альтернативное решение.

        DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA,
                        DataType.AGGREGATE_STEP_COUNT_DELTA)
                .aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
                .aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
                .bucketByTime(1, TimeUnit.HOURS)
                .setTimeRange(starttime, endtime, TimeUnit.MILLISECONDS)
                .build();
        DataReadResult dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await(1, TimeUnit.MINUTES);

        //Used for aggregated data
        if (dataReadResult.getBuckets().size() > 0) {
            Log.i("History", "Number of buckets: " + dataReadResult.getBuckets().size());
            for (Bucket bucket : dataReadResult.getBuckets()) {
                List<DataSet> dataSets = bucket.getDataSets();
                for (DataSet dataSet : dataSets) {
                    showDataSet(dataSet);
                }
            }
        }


        return null;
    }
}

private void readData() {
    new VerifyDataTask().execute();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the main; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
    private void showDataSet(DataSet dataSet) {
        Log.e("History", "Data returned for Data type: " + dataSet.getDataType().getName());
        DateFormat dateFormat = DateFormat.getDateInstance();
        DateFormat timeFormat = DateFormat.getTimeInstance();
        String sleepHours = "0";

        for (DataPoint dp : dataSet.getDataPoints()) {
            Log.i("History", "Data point:");
            Log.i("History", "\tType: " + dp.getDataType().getName());
            Log.i("History", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
            Log.i("History", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
            for(Field field : dp.getDataType().getFields()) {

                if(dp.getOriginalDataSource().getAppPackageName().toString().contains("sleep") && field.getName().contains("duration")){
                    Value value = dp.getValue(field);
                    long h = TimeUnit.MILLISECONDS.toHours(value.asInt());
                    long m =TimeUnit.MILLISECONDS.toMinutes(value.asInt());
                    m = m - (h*60);
                    sleepHours  =h +" h  " + m + " m";
                    Log.i(TAG, "\tField: Sleep duration : " + sleepHours);

                }

                Log.i("History", "\tField: " + field.getName() +
                        " Value: " + dp.getValue(field));
            }
        }

    }

person pixylife    schedule 13.09.2017    source источник


Ответы (1)


Вы можете обратиться к этой документации о том, как читать подробные и агрегированные данные. В примере кода вам нужно установить дату начала и дату окончания, используя диапазон за 1 неделю до этого момента. cal.add(Calendar.WEEK_OF_YEAR, -1);. Если вы хотите иметь только 1 час, используйте cal.add(Calendar.HOUR_OF_DAY, -1);. После создания экземпляра DataReadRequest используйте [_4 _] (https://developer.android.com/reference/com/google/android/gms/fitness/HistoryApi.html#readData(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.fitness.request.DataReadRequest)) и подождите синхронно или предоставьте метод обратного вызова для обработки данных из истории фитнеса.

person abielita    schedule 17.09.2017