从Google Fit Android API检索最近的行走

从Google Fit Android API检索最近的行走,android,google-fit,Android,Google Fit,目前,我正在尝试开发一个本地Android应用程序,从History_API检索信息。我已经能够恢复卡路里,每天的步伐和活动时间。现在,我正在考虑将其提升到下一个级别,并尝试使用以下代码查看从历史api检索到的不同类型的活动: protected Void doInBackground(Void... params) { DataReadRequest readRequest = queryFitnessData(); DataReadResult da

目前,我正在尝试开发一个本地Android应用程序,从History_API检索信息。我已经能够恢复卡路里,每天的步伐和活动时间。现在,我正在考虑将其提升到下一个级别,并尝试使用以下代码查看从历史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;
                }
            }
        }
    }
我不明白为什么代码今天下午显示步行和跑步活动,突然只返回我开车时的活动。我能想到的一个可能的解决方案是,我的应用程序没有订阅任何数据类型。因此,我的问题是:

  • 我的应用程序是否需要订阅才能检索活动(如步行)
  • 我应该如何检索一天或一周内执行的所有活动
    我还不确定评论中建议的订阅是否有任何不同,但有一件事确实有助于达成解决方案,那就是更改下面的代码段:

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

    希望这也能帮助其他人

    根据这一点,您需要记录并从健身历史中读取每种健身数据类型。然后,要检索活动,您需要创建一个实例。有一个示例代码用于实现指南。希望这有帮助。如果我错了,请纠正我的错误,但因为我之前能够检索活动,但实际上仍然是(这只是检索“in_vehicle”健身数据类型。这不应该是问题吗?以防我在订阅中生成,结果保持不变。