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

问题描述:

当前我正在尝试开发一个从History_API检索信息的本机Android应用程序。我已经能够检索卡路里,每日步骤和活动时间。现在,我想它取到一个新的水平,并尝试使用下面的代码来查看不同类型的从历史API检索活动:从Google Fit 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. 我应该如何检索一天或一周内进行的所有活动?
+0

根据此相关的[SO帖子](https://*.com/a/39774258/5995040),您需要[创建订阅](https://developers.google.com/fit/android/记录#subscribe_to_fitness_data)为您想记录并从健身历史中读取的每种健身数据类型。然后检索您需要创建['DataReadRequest'](http://developer.android.com/reference/com/google/android/gms/fitness/request/DataReadRequest.html)实例的活动。有一个实现指南的示例代码。希望这可以帮助。 –

+0

纠正我,如果我错了,但因为我早先能够检索活动,实际上仍然是(它只是检索'in_vehicle'健身数据类型。这不应该是问题吗?以防万一我建立一个订阅和结果保持不变。 – Styl3r

我不知道但如果在评论中提出的订阅所做的任何区别,但有一点,为了得到解决一定帮助是通过改变下面的代码块:

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

希望这将帮助其他人也!