2017-09-13 33 views
0

현재 해당 피트니스 앱과 관련된 Android 앱을 개발 중입니다. Step_Count, HEART_RATE_BPM, 수면 시간 및 운동 데이터를 가져와야합니다. 시간별 데이터를 가져와야합니다. 그래서 1 시간으로 bucketByTime을 사용하고 있으며, 1 시간 동안 모든 활동에 대한 활동 요약 데이터를 얻기 위해 AGGREGATE_ACTIVITY_SUMMARY를 사용하고 있습니다. API에서 나열된 운동 유형이 너무 많기 때문에 운동 데이터를 필터링 할 수도 있습니다. 대체 솔루션을 찾고 있습니다.Google 피트니스가 Android에서 1 시간 이내에 운동 데이터를받습니다.

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

    } 

답변

1

당신은 상세하고 집계 데이터를 읽는 방법에 대한이 documentation로 참조 할 수 있습니다. 샘플 코드에서이 순간 1 주 전에 범위를 사용하여 시작일과 종료일을 설정해야합니다. cal.add(Calendar.WEEK_OF_YEAR, -1);. 1 시간 만 사용하려면 cal.add(Calendar.HOUR_OF_DAY, -1);을 사용하십시오. DataReadRequest 인스턴스를 만든 후에는 [HistoryApi.readData()] (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) 메소드를 사용하고 동 기적으로 대기하거나 피트니스 기록에서 데이터를 처리하는 콜백 메소드를 제공하십시오.