从Google Fit Android API检索最近的漫步

时间:2017-07-28 20:26:52

标签: android google-fit

目前,我正在尝试开发一个从History_API中检索信息的原生Android应用程序。我已经能够检索卡路里,每日步数和活动时间。现在我正考虑将其提升到一个新的水平,并尝试使用以下代码查看从历史API中检索到的不同类型的活动:

    protected Void doInBackground(Void... params) {
        DataReadRequest readRequest = queryFitnessData();

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

        getData(dataReadResult);
        return null;
   }

这是定义请求的函数:

    private DataReadRequest queryFitnessData() {
        Calendar cal = Calendar.getInstance();
        Date now = new Date();
        cal.setTime(now);
        long endTime = cal.getTimeInMillis();
        cal.add(Calendar.WEEK_OF_MONTH, -1);
        long startTime = cal.getTimeInMillis();

        DataSource ACTIVITY_SEGMENT = new DataSource.Builder()
                .setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
                .setType(DataSource.TYPE_DERIVED)
                .build();

        DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
                .bucketByTime(5, TimeUnit.MINUTES)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();

        return readRequest;
    }

这似乎在下午工作正常,但是在刚刚进一步处理它时,它不再显示视图了。查看日志文件显示存储桶返回“in_vehicle”类型的所有位置。这是有道理的,为什么下面的代码不会将视图添加到我的数组。

    private void getData(DataReadResult result) {
        if (result.getBuckets().size() > 0) {
            Log.i(TAG, "Bucket size: " + result.getBuckets().size());
            for(Bucket bucket : result.getBuckets()) {
                long activeTime = bucket.getEndTime(TimeUnit.MINUTES) - bucket.getStartTime(TimeUnit.MINUTES);

                Log.i(TAG, bucket.getActivity());

                switch (bucket.getActivity()) {
                    case "walking":
                        Log.i(TAG, "Adding a walking card");
                        activityData.add(new CustomActivityCard("Walking","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
                        break;
                    case "running":
                        Log.i(TAG, "Adding a running card");
                        activityData.add(new CustomActivityCard("Running","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
                        break;
                    case "biking":
                        Log.i(TAG, "Adding a cycling card");
                        activityData.add(new CustomActivityCard("Cycling","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
                        break;
                }
            }
        }
    }

我无法理解为什么代码在今天下午显示步行和跑步活动,突然只返回我开车时的活动。我能想到的一个可能的解决方案是我的应用程序没有订阅任何数据类型。所以我的问题是:

  1. 我的应用是否需要订阅才能检索活动(例如步行)?
  2. 我应该如何检索一天或一周内执行的所有活动?

1 个答案:

答案 0 :(得分:0)

我不确定评论中建议的订阅是否有任何区别,但是为了找到解决方案肯定有帮助的一件事是改变下面的代码:

DataReadRequest readRequest = new DataReadRequest.Builder()
    .aggregate(ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
    .bucketByTime(5, TimeUnit.MINUTES)
    .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
    .build();

对于类似下面的DataRequest,这使我能够检索当天的步行活动

DataReadRequest readRequest = new DataReadRequest.Builder()
    .aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
    .bucketByActivitySegment(7, TimeUnit.MINUTES)
    .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
    .build();

希望这也有助于其他人!