2016-06-02 1 views
1

Я играл с API Google FIT, поэтому я могу прочитать общие шаги, сделанные шаги, пройденное расстояние, общее количество калорий и т. Д. Когда я запускаю приложение, ничего не происходит. Я думал, что для получения данных из каждой категории вам потребуется создать отдельный приемник данных для каждого. Они, кажется, не вызываются - я не получаю никаких тостов с обновленными значениями.Google Fit: как использовать несколько источников данных, а onDataPoint не называется

Вот мой код:

private void getFitnessDataSources() 
{ 
    Fitness.SensorsApi.findDataSources(googleApiClient, new DataSourcesRequest.Builder() 
      .setDataTypes(dataTypes[0]).setDataTypes(dataTypes[1]).setDataTypes(dataTypes[2]) 
      .setDataTypes(dataTypes[3]).setDataTypes(dataTypes[4]).setDataTypes(dataTypes[5]) 
      .setDataTypes(dataTypes[6]).setDataTypes(dataTypes[7]) 
      .setDataSourceTypes(DataSource.TYPE_DERIVED) 
      .build()) 
      .setResultCallback(new ResultCallback<DataSourcesResult>() { 
     @Override public void onResult(@NonNull DataSourcesResult dataSourcesResult) { 

       for (DataSource dataSource : dataSourcesResult.getDataSources()) { 
        displayToast("Data source found: "+dataSource.getName()); 

        if (dataSource.getDataType() == dataTypes[0]) { 
         caloriesListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field : dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName() + "Value: " + 
              ""+fieldValue); 
            totalTimeTextView.setText(fieldValue.toString()); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[0], caloriesListener); 
        } else if (dataSource.getDataType().equals(dataTypes[1])) { 
         currentCaloriesListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
            distanceCoveredTextView.setText(fieldValue.toString()); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[1], currentCaloriesListener); 
        } else if (dataSource.getDataType().equals(dataTypes[2])) { 
         stepCountsListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 

           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[2], stepCountsListener); 
        } else if (dataSource.getDataType().equals(dataTypes[3])) { 
         totalStepCountsListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[3], totalStepCountsListener); 

        } else if (dataSource.getDataType().equals(dataTypes[4])) { 
         distanceListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[4], distanceListener); 
        } else if (dataSource.getDataType().equals(dataTypes[5])){ 
         totalDistanceListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[5], totalDistanceListener); 
        } else if (dataSource.getDataType().equals(dataTypes[6])) { 
         speedListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[6], speedListener); 
        } else if (dataSource.getDataType().equals(dataTypes[7])) { 
         speedSummaryListener = new OnDataPointListener() { 
          @Override 
          public void onDataPoint(DataPoint dataPoint) { 
           for (Field field: dataPoint.getDataType().getFields()) { 
            Value fieldValue = dataPoint.getValue(field); 
            displayToast("Field Name: "+field.getName()+"Value: "+fieldValue); 
           } 
          } 
         }; 
         registerFitnessDataListener(dataSource, dataTypes[7], speedSummaryListener); 
        } 
       } 
     } 
    }); 
} 

Это код, который инициализирует типы данных массива творю использование:

private void initializeSessionDataTypes() 
{ 
    dataTypes = new DataType[] {DataType.AGGREGATE_CALORIES_EXPENDED, DataType 
      .TYPE_CALORIES_EXPENDED, DataType.TYPE_STEP_COUNT_DELTA, DataType 
      .TYPE_STEP_COUNT_CUMULATIVE, DataType.TYPE_DISTANCE_DELTA, DataType 
      .AGGREGATE_DISTANCE_DELTA, DataType.TYPE_SPEED, DataType.AGGREGATE_SPEED_SUMMARY}; 
} 

Это код, я использую для регистрации каждого источника данных фитнеса :

private void registerFitnessDataListener(DataSource dataSource, DataType dataType, 
             OnDataPointListener listener) { 
    Fitness.SensorsApi.add(googleApiClient, new SensorRequest.Builder().setDataSource 
      (dataSource).setDataType(dataType).setSamplingRate(1, TimeUnit.SECONDS).build(), 
      listener).setResultCallback(new ResultCallback<Status>() { 
     @Override 
     public void onResult(@NonNull Status status) { 
      if (status.isSuccess()) { 
       displayToast("Listener is registered"); 
      } else { 
       displayToast("Listener is not registered"); 
      } 
     } 
    }); 
    subscribeToFitnessData(dataType); 
} 

Мой Google API клиент:

private void buildFitnessApi() { 

    Scope activityRead = new Scope(Scopes.FITNESS_ACTIVITY_READ); 
    Scope fitnessActivityReadWrite = new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE); 
    Scope bodyRead = new Scope(Scopes.FITNESS_BODY_READ); 
    Scope bodyReadWrite = new Scope(Scopes.FITNESS_BODY_READ_WRITE); 
    Scope locationRead = new Scope(Scopes.FITNESS_LOCATION_READ); 
    Scope locationReadWrite = new Scope(Scopes.FITNESS_LOCATION_READ_WRITE); 

     googleApiClient = new GoogleApiClient.Builder(this.getActivity()).addApi(LocationServices.API) 
       .addApi(Fitness.SENSORS_API).addApi(Fitness.HISTORY_API).addApi(Fitness.SESSIONS_API) 
         .addApi(Fitness 
         .RECORDING_API).addScope(activityRead).addScope 
         (fitnessActivityReadWrite).addScope(bodyRead).addScope(bodyReadWrite) 
       .addScope(locationRead).addScope(locationReadWrite) 
         .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this).build(); 
} 

Может кто-нибудь мне помочь? Какой был бы лучший способ использовать api google fit api, если вы пытаетесь получить несколько потоков данных (количество шагов, сжигаемые калории и т. Д.).

Благодаря

ответ

1

Я не думаю, что вам нужно, что многие еще, если заявления для различных источников данных. Я бы просто позвонить registerFitnessDataListener по каждому источнику данных, и вам нужен этот кусок коды перед добавлением слушателей с использованием SensorsAPI ...

final DataType dataType = dataSource.getDataType(); 
    if (dataType.equals(DataType.TYPE_STEP_COUNT_DELTA) || 
      dataType.equals(DataType.TYPE_CALORIES_EXPENDED) || 
      dataType.equals(DataType.TYPE_DISTANCE_DELTA) || 
      dataType.equals(DataType.TYPE_ACTIVITY_SEGMENT)){ 

Я подозреваю, что проблема заключается в регистрации нескольких onDataPointListeners для нескольких источников данных. Я проверил это, и результат: Поскольку каждый onDataPointListener имеет этот метод onDataPoint

@Override 
         public void onDataPoint(DataPoint dataPoint) { 
          for (Field field : dataPoint.getDataType().getFields()) { 
           Value fieldValue = dataPoint.getValue(field); 
           displayToast("Field Name: "+field.getName() + "Value: " + 
             ""+fieldValue); 
           totalTimeTextView.setText(fieldValue.toString()); 
          } 
         } 

последний (или может быть первым) onDataPointerListener регистрируется только в состоянии слушать точки данных, полученных , поэтому методы OnDataPoint для других слушателей не вызываются.

Итак, это проблема параллелизма, и мы должны создать поток для каждого слушателя. Я не знаю, как это сделать, но я надеюсь, что кто-то еще сможет нам помочь.

 Смежные вопросы

  • Нет связанных вопросов^_^