2017-07-28 37 views
0

現在、私は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つの可能な解決策は、私のアプリケーションがどのデータ型にも加入していないということです。だから私の質問は次のとおりです:

  1. アクティビティ(歩行など)を取得するには、アプリを購読する必要がありますか?
  2. 1日または1週間以内に実行されたすべてのアクティビティを取得するにはどうすればよいですか?
+0

この[SO post](https://stackoverflow.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

答えて

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

を取得する私はでき作られたが、これは同様に他人を助けることを願っています!

関連する問題