android - 通过 Google Fit Android API 检索的每周步数与 Google Fit 官方应用中显示的步数不匹配

标签 android android-studio google-fit google-fit-sdk google-fit-api

我正在尝试从 google fit API 检索用户的每周步数数据,但我从官方 google fit App 数据中获得了不同的步数结果。例如:星期四通过 google fit api 检索到的步数是 5244 而在官方 google fit 应用程序中,星期四的步数是 5134 .一周中每一天的步数略有不同,但我想要准确的结果。我正在使用 google fit History API 来检索每周步数并显示在条形图中。
我的代码如下所示:

    fitnessOptions = FitnessOptions.builder()
            .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_LOCATION_SAMPLE, FitnessOptions.ACCESS_READ)
            .build();

    @RequiresApi(api = Build.VERSION_CODES.O)
private void invokeHistoryApiForWeeklySteps() {


    // Read the data that's been collected throughout the past week.
    ZonedDateTime endTime = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        endTime = LocalDateTime.now().atZone(ZoneId.systemDefault());
    }
    ZonedDateTime startTime = endTime.minusWeeks(1);

    Log.i(TAG, "Range Start: $startTime");
    Log.i(TAG, "Range End: $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();

    DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
            .enableServerQueries()
            .build();


    Fitness.getHistoryClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
            .readData(readRequest)
            .addOnSuccessListener(response -> {


                // The aggregate query puts datasets into buckets, so convert to a
                // single list of datasets
                for (Bucket bucket : response.getBuckets()) {

                    //convert days in bucket to milliseconds
                    long days = bucket.getStartTime(TimeUnit.MILLISECONDS);
                    //convert milliseconds to date
                    Date stepsDate = new Date(days);
                    //convert date to day of the week eg: monday, tuesday etc
                    @SuppressLint("SimpleDateFormat")
                    DateFormat df = new SimpleDateFormat("EEE");
                    String weekday = df.format(stepsDate);

                    Log.i(TAG, stepsDate.toString());
                    theDates.add(weekday);

                    for (DataSet dataSet : bucket.getDataSets()) {
                        totalAvgSteps.add(dumpDataSet(dataSet));



                    }
                }
                Log.i(TAG, theDates.toString());
                Log.i(TAG, totalAvgSteps.toString());
                displayBarChart();
            })
            .addOnFailureListener(e ->
                    Log.w(TAG, "There was an error reading data from Google Fit", e));

}

    private int dumpDataSet(DataSet dataSet) {
    Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name}");
    int totalSteps = 0;
    for (DataPoint dp : dataSet.getDataPoints()) {
        Log.i(TAG, "Data point:");
        Log.i(TAG, "\tType: ${dp.dataType.name}");
        Log.i(TAG, "\tStart: ${dp.getStartTimeString()}");
        Log.i(TAG, "\tEnd: ${dp.getEndTimeString()}");


        for (Field field : dp.getDataType().getFields()) {
            String fieldName = field.getName();
            totalSteps += dp.getValue(field).asInt();

            Log.i(TAG, "\tfield: " + fieldName + "value: " + dp.getValue(field));

        }
    }
    return totalSteps;
}
这是我通过这段代码得到的结果:
我的代码结果:
enter image description here
这就是 google Fit Official App 中的数据
Google Fit 应用程序中的步数计数:
enter image description here
Google Fit 应用程序中的步数:
enter image description here

最佳答案

所以我解决了步数差异的问题,因此在这里分享它是否也可以帮助其他人。
我犯的错误是我没有计算从昨天午夜 12:00 到上周午夜 12:00 的数据,这导致每天的步数不同。
这是正确的日期和时间计算:

  Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.set(Calendar.HOUR_OF_DAY,0);
    cal.set(Calendar.MINUTE,0);
    cal.set(Calendar.SECOND,0);
    long endTime = cal.getTimeInMillis();

    cal.add(Calendar.WEEK_OF_MONTH, -1);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    long startTime = cal.getTimeInMillis();
    Log.i(TAG, String.valueOf(endTime));
    Log.i(TAG,String.valueOf(startTime) );
并且我们需要在几秒钟内请求它的地方稍微更改数据请求,现在我请求以毫秒为单位,这为我提供了作为 google fit 官方应用程序的确切数据。
 DataReadRequest readRequest = new DataReadRequest.Builder()
            .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA)
            .bucketByTime(1, TimeUnit.DAYS)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();
其余代码与我在问题中发布的一样。

关于android - 通过 Google Fit Android API 检索的每周步数与 Google Fit 官方应用中显示的步数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69025760/

相关文章:

android - 带有改造 2 的流媒体服务器 - 分块

java - 如果之前没有完成,如何防止 gcmTaskService periodicTask 再次运行?

android - 无法在 Android Studio 上解析配置 ':classpath' 的所有依赖项

java - 如何从 zip 文件的内容 uri 获取文件路径?

php - Google Fit API 无法添加大部分范围

android - Google Fit History API - 步数值不正确

java - 膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错

java - Android onClickListener 实现最佳实践

java - 使用相机时 Android 中的权限被拒绝

android - 无法解析 GOOGLE_FIT_PERMISSIONS_REQUEST_CODE