2016-11-11 4 views
2

피트니스 활동으로 수면을 삽입하고 읽으려고합니다 (설명 된 주제와 같습니다). 주요 목표는 단일 세션에 대해 전체 수면을 분석하는 것입니다 (Light/Deep 수면과 얼마나 오래되었는지). GoogleFit에 연결하면 성공합니다. 하지만 Datapoint 및 데이터 세션에 문제가 있습니다. 아마도 나를 도울 수 있습니다. 감사합니다 얘들 아 : DGoogle 피트니스 API 잠자기 ​​세션에서 데이터 포인트 삽입 및 읽기

내가 약간 문제가 있다고 생각하는 코드. 명확하지 않은 코드를 알고 있습니다. 붙여 넣으려고했는데 복사하려고 했어. 어떤 부분에서는 이름이 맞지 않습니다. 그러나 나는 언급했다. 수면 중에 가벼운 수면 단계를 찾아 내려고 노력합니다. 내가 내 코드의 삽입 구글 핏에 세션 .... 해결하기 위해 2

private class InsertAndVerifySessionTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... params) { 
     //First, create a new session and an insertion request. 
     SessionInsertRequest insertRequest = insertFitnessSession(); 


     Log.i(TAG, "Inserting the session in the History API"); 
     com.google.android.gms.common.api.Status insertStatus = 
       Fitness.SessionsApi.insertSession(mClient, insertRequest) 
         .await(1, TimeUnit.MINUTES); 

     // Before querying the session, check to see if the insertion succeeded. 
     if (!insertStatus.isSuccess()) { 
      Log.i(TAG, "There was a problem inserting the session: " + 
        insertStatus.getStatusMessage()); 
      return null; 
     } 

     // At this point, the session has been inserted and can be read. 
     Log.i(TAG, "Session insert was successful!"); 
     // [END insert_session] 

     // Begin by creating the query. 
     SessionReadRequest readRequest = readFitnessSession(); 

     // [START read_session] 
     // Invoke the Sessions API to fetch the session with the query and wait for the result 
     // of the read request. Note: Fitness.SessionsApi.readSession() requires the 
     // ACCESS_FINE_LOCATION permission. 
     SessionReadResult sessionReadResult = 
       Fitness.SessionsApi.readSession(mClient, readRequest) 
         .await(1, TimeUnit.MINUTES); 

     // Get a list of the sessions that match the criteria to check the result. 
     Log.i(TAG, "Session read was successful. Number of returned sessions is: " 
       + sessionReadResult.getSessions().size()); 
     for (Session session : sessionReadResult.getSessions()) { 
      // Process the session 
      dumpSession(session); 

      // Process the data sets for this session 
      List<DataSet> dataSets = sessionReadResult.getDataSet(session); 
      for (DataSet dataSet : dataSets) { 
       dumpDataSet(dataSet); 
      } 
     } 
     // [END read_session] 

     return null; 
    } 
} 



private SessionInsertRequest insertFitnessSession() { 
    Log.i(TAG, "Creating a new session for an afternoon run"); 
    // Setting start and end times for our run. 
    Calendar cal = Calendar.getInstance(); 
    Date now = new Date(); 
    cal.setTime(now); 

    long endTime = cal.getTimeInMillis(); 
    cal.add(Calendar.MINUTE, -10); 
    long endWalkTime = cal.getTimeInMillis(); 
    cal.add(Calendar.MINUTE, -10); 
    long startWalkTime = cal.getTimeInMillis(); 
    cal.add(Calendar.MINUTE, -10); 
    long startTime = cal.getTimeInMillis(); 




    DataSource activitySegmentDataSource = new DataSource.Builder() 
      .setAppPackageName(this.getPackageName()) 
      .setDataType(DataType.TYPE_ACTIVITY_SEGMENT) 
      .setName(SAMPLE_SESSION_NAME + "-activity segments") 
      .setType(DataSource.TYPE_RAW) 
      .build(); 
    DataSet activitySegments = DataSet.create(activitySegmentDataSource); 

    DataPoint firstRunningDp = activitySegments.createDataPoint() 
      .setTimeInterval(startTime, startWalkTime, TimeUnit.MILLISECONDS); 
    firstRunningDp.getValue(Field.FIELD_ACTIVITY).setActivity(FitnessActivities.SLEEP_LIGHT); 
    activitySegments.add(firstRunningDp); 

    DataPoint walkingDp = activitySegments.createDataPoint() 
      .setTimeInterval(startWalkTime, endWalkTime, TimeUnit.MILLISECONDS); 
    walkingDp.getValue(Field.FIELD_ACTIVITY).setActivity(FitnessActivities.SLEEP_DEEP); 
    activitySegments.add(walkingDp); 

    DataPoint secondRunningDp = activitySegments.createDataPoint() 
      .setTimeInterval(endWalkTime, endTime, TimeUnit.MILLISECONDS); 
    secondRunningDp.getValue(Field.FIELD_ACTIVITY).setActivity(FitnessActivities.SLEEP_LIGHT); 
    activitySegments.add(secondRunningDp); 

    // [START build_insert_session_request] 
    // Create a session with metadata about the activity. 
    Session session = new Session.Builder() 
      .setName(SAMPLE_SESSION_NAME) 
      .setDescription("Long run around Shoreline Park") 
      .setIdentifier("UniqueIdentifierHere") 
      .setActivity(FitnessActivities.SLEEP) 
      .setStartTime(startTime, TimeUnit.MILLISECONDS) 
      .setEndTime(endTime, TimeUnit.MILLISECONDS) 
      .build(); 

    // Build a session insert request 
    SessionInsertRequest insertRequest = new SessionInsertRequest.Builder() 
      .setSession(session) 
      .addDataSet(activitySegments) 
      .build(); 

    // [END build_insert_session_request] 
    // [END build_insert_session_request_with_activity_segments] 

    return insertRequest; 
} 

/** 
* Return a {@link SessionReadRequest} for all speed data in the past week. 
*/ 
private SessionReadRequest readFitnessSession() { 
    Log.i(TAG, "Reading History API results for session: " + SAMPLE_SESSION_NAME); 
    // [START build_read_session_request] 
    // Set a start and end time for our query, using a start time of 1 week before this moment. 
    Calendar cal = Calendar.getInstance(); 
    Date now = new Date(); 
    cal.setTime(now); 
    long endTime = cal.getTimeInMillis(); 
    cal.add(Calendar.WEEK_OF_YEAR, -1); 
    long startTime = cal.getTimeInMillis(); 

    // Build a session read request 
    SessionReadRequest readRequest = new SessionReadRequest.Builder() 
      .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) 
      .read(DataType.TYPE_ACTIVITY_SEGMENT) 
      .setSessionName(SAMPLE_SESSION_NAME) 
      .build(); 


    // [END build_read_session_request] 

    return readRequest; 
} 

private void dumpDataSet(DataSet dataSet) { 
    Log.i(TAG, "Data returned for Data type: " + dataSet.getDataType().getName()); 
    for (DataPoint dp : dataSet.getDataPoints()) { 
     DateFormat dateFormat = getTimeInstance(); 
     Log.i(TAG, "Data point:"); 
     Log.i(TAG, "\tType: " + dp.getDataType().getName()); 
     Log.i(TAG, "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS))); 
     Log.i(TAG, "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS))); 
     for(Field field : dp.getDataType().getFields()) { 
      Log.i(TAG, "\tField: " + field.getName() + 
        " Value: " + dp.getValue(field)); 
     } 
    } 
} 

private void dumpSession(Session session) { 
    DateFormat dateFormat = getTimeInstance(); 
    Log.i(TAG, "Data returned for Session: " + session.getName() 
      + "\n\tDescription: " + session.getDescription() 
      + "\n\tStart: " + dateFormat.format(session.getStartTime(TimeUnit.MILLISECONDS)) 
      + "\n\tEnd: " + dateFormat.format(session.getEndTime(TimeUnit.MILLISECONDS))); 
} 
+0

여전히 활동 기록/기록 방법에 따라 달라질 수 있습니다 (https://developers.google.com/fit/android/using-sessions). 이러한 문서를 기반으로 - [Garmin 기기는 수면과 수면을 어떻게 측정합니까?] (https://www.quora.com/How-do-Garmin-devices-measure-deep-sleep-vs-light-sleep), [수면 추적의 4 가지 기본 사항] (http://blog.withings.com/2015/03/17/the-4- basics-of-sleep-tracking/) 및 [수면 모니터 설명 : 더 오래 쉬고 기분이 나아졌습니다. ] (http://www.wareable.com/fitness-trackers/sleep-monitors-explained-more-deep-sleep); 그것은 여전히 ​​기록에 의존하고 깊고 가벼운 수면을 계산할 수 있습니다. –

+0

마지막으로 수면 데이터를 읽으려면 정상 피트니스 활동 (예 : https://developers.google.com/fit/android/releases)과 마찬가지로 수면 활동 세그먼트에 대한 수면 세션을 쿼리하십시오. 희망이 도움이됩니다. –

답변

1

오일 sonyband이 날짜를 수집 :

Log.d (iKcal.TAG를 + "/"+ TAG, "Google 피트니스에 세션 삽입 ...");

DataSource activitySegmentDataSource = new DataSource.Builder() 
      .setAppPackageName(fragmentActivity.getPackageName()) 
      .setDataType(DataType.TYPE_ACTIVITY_SEGMENT) 
      .setName("Activity") 
      .setType(DataSource.TYPE_RAW) 
      .build(); 

    DataSource kcalSegmentDataSource = new DataSource.Builder() 
      .setAppPackageName(fragmentActivity.getPackageName()) 
      .setDataType(DataType.AGGREGATE_CALORIES_EXPENDED) 
      .setName("Kcal burned") 
      .setType(DataSource.TYPE_RAW) 
      .build(); 

    DataSet activityDataSet = DataSet.create(activitySegmentDataSource); 
    DataSet kcalDataSet = DataSet.create(kcalSegmentDataSource); 

    DataPoint activityDataPoint = activityDataSet.createDataPoint().setTimeInterval(fitness.getStart().getTime(), fitness.getEnd().getTime(), TimeUnit.MILLISECONDS); 
    activityDataPoint.getValue(Field.FIELD_ACTIVITY).setActivity(fitness.getFitnessActivity().getFitnessActivity()); 
    activityDataSet.add(activityDataPoint); 

    DataPoint kcalDataPoint = kcalDataSet.createDataPoint().setTimeInterval(fitness.getStart().getTime(), fitness.getEnd().getTime(), TimeUnit.MILLISECONDS); 
    kcalDataPoint.getValue(Field.FIELD_CALORIES).setFloat((float) (fitness.getKcal())); 
    kcalDataSet.add(kcalDataPoint); 

    Session session = new Session.Builder() 
      .setName(fragmentActivity.getResources().getString(fitness.getFitnessActivity().getName())) 
      .setIdentifier(fragmentActivity.getString(R.string.app_name) + "_" + fitness.getFitnessID()) // ID FITNESS DB 
      .setDescription(fitness.getComments()) 
      .setStartTime(fitness.getStart().getTime(), TimeUnit.MILLISECONDS) 
      .setEndTime(fitness.getEnd().getTime(), TimeUnit.MILLISECONDS) 
      .setActivity(fitness.getFitnessActivity().getFitnessActivity()) 
      .build(); 

    SessionInsertRequest insertRequest = new SessionInsertRequest.Builder() 
      .setSession(session) 
      .addDataSet(kcalDataSet)  // Inserimento kcal 
      //.addDataSet(activityDataSet) // Inserimento attività 
      .build(); 

    PendingResult<com.google.android.gms.common.api.Status> pendingResult = Fitness.SessionsApi.insertSession(mGoogleApiClient, insertRequest); 

    pendingResult.setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() { 
     @Override 
     public void onResult(@NonNull com.google.android.gms.common.api.Status status) { 
      if (status.isSuccess()) 
       onPostExecuteInsert(true); 
      else 
       onPostExecuteInsert(false); 
     } 
    }); 
} 

private void onPostExecuteInsert (boolean value){ 
    FitnessActivity fitnessActivity = (FitnessActivity) fragmentActivity; 
    fitnessActivity.getLoadingDialog().dismiss(); 

    if(value) { 
     Log.d(iKcal.TAG + "/" + TAG, "Session inserted on GoogleFit!"); 
     Toast.makeText(fragmentActivity, R.string.aggiunto_fitness_db_fit, Toast.LENGTH_SHORT).show(); 
    } else { 
     Log.d(iKcal.TAG + "/" + TAG, "Failed to insert session on GoogleFit!"); 
     Toast.makeText(fragmentActivity, R.string.aggiunto_fitness_solo_db, Toast.LENGTH_SHORT).show(); 
    } 

    fragmentActivity.startActivity(new Intent(fragmentActivity, MainActivity.class)); 
} 

결국 나는 대화 상자를 닫고 새로운 활동을 호출하지만 모든 것을 할 수 있습니다. 결과는 400-500 밀리 초 후에 반환되므로 결과를받지 못합니다.

완벽하게 작동하지만 잘 읽지 못합니다. onCreate 또는 onResume에서 읽으려고하면 처음에는 작동하지 않지만 새 세션을 삽입하고 읽으면 완벽하게 작동합니다.

+1

고마워요. Stefano Cristoni –