2015-07-22 72 views
0

我正在使用一个外部设备,它假定发送TYPE_HEART_RATE_BPMSENSORS_API。 我可以检索步骤与此代码:用Google-Fit传感器api检索HR-bpm

客户

mClient = new GoogleApiClient.Builder(ApLifeAid.getAppContext()) 
      .addApi(Fitness.SENSORS_API) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

请求

SensorRequest request = new SensorRequest.Builder() 
      .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
      .setSamplingRate(1, TimeUnit.SECONDS) 
      .build(); 

,然后使用Fitness.SensorsApi.add(mClient, request, this);。在这种情况下,this是专用于服务中的传感器API的类。

但我似乎无法得到任何价值可言,onDataPoint()不运行,当我改变我的要求:

SensorRequest request = new SensorRequest.Builder() 
      .setDataType(DataType.TYPE_HEART_RATE_BPM) 
      .setSamplingRate(1, TimeUnit.SECONDS) 
      .build(); 

如果有人知道是什么问题,请告诉我。如果你能在我的代码中看到其他任何奇怪的东西,请告诉我。

谢谢!

+1

您使用的是Fitness.SensorsApi.findDataSources知道如果心脏速率传感器是提供给您的应用程序? –

+0

我不是。我一直在试图找到使用Fitness API的好资源,但我无法找到它。官方的结论是不确定的和分割的。 当我回到它时,会给它一个看看! – Yokich

回答

1

我找到了解决方案。显然我需要找到并注册我想要的数据来源。

所以我仍然使用客户端的“相同”构造,请求等,而不是使用SensorsApi.add我使用findDataSources。 (另外,FITNESS_BODY_READ似乎更准确,效果很好)

private void buildSensors() { 
    mClient = new GoogleApiClient.Builder(ApLifeAid.getAppContext()) 
      .addApi(Fitness.SENSORS_API) 
      .addScope(new Scope(Scopes.FITNESS_BODY_READ)) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

    DataSourcesRequest dataSourcesRequest = new DataSourcesRequest.Builder() 
      .setDataTypes(DataType.TYPE_HEART_RATE_BPM/*, 
        DataType.TYPE_STEP_COUNT_DELTA*/) 
      .setDataSourceTypes(DataSource.TYPE_RAW) // data type, raw or derived? 
      .build(); 

    Fitness.SensorsApi.findDataSources(mClient, dataSourcesRequest).setResultCallback(this); 
} 

setResultCallback(this)然后调用下面,我找到一个合格的来源并添加一个侦听器,并为它的采样率。

@Override 
public void onResult(DataSourcesResult dataSourcesResult) { 
    // On New Source Result 
    for (final DataSource dataSource : dataSourcesResult.getDataSources()) { 

     // Request updates from this source, samplingRate 
     SensorRequest sensorRequest = new SensorRequest.Builder() 
       .setDataSource(dataSource) // Optional but recommended for custom data sets. 
       .setDataType(dataSource.getDataType()) // Can't be omitted. 
       .setSamplingRate(1, TimeUnit.SECONDS) 
       .build(); 

     Log.i(TAG, "Fitness.SensorsApi.add for " + dataSource.toString() + " and type " + dataSource.getDataType().getName()); 
     Fitness.SensorsApi.add(mClient, sensorRequest, this) 
       //Can be removed later 
       .setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(Status status) { // This might be important later on "Cannot register listener to source" 
         if (status.isSuccess()) { 
          Log.i(TAG, "Listener registered!"); 
         } else { 
          Log.e(TAG, "Unable to register listener for source: " + dataSource.toString()); 
         } 
        } 
       }); 
    } 
} 

这是现在的阅读,我已经发现心脏率最简单和干净的方式;)

1

首先你必须检查你的数据源是否可用。 如果数据源不可用,而您的传感器是蓝牙传统设备,并且不支持蓝牙GATT配置文件,则需要实施FitnessSensorService以注册您的数据源。

您可以从以下链接阅读有关FitnessSensorService的内容。 https://developers.google.com/fit/android/new-sensors

+0

我没有使用FitnessSensorService,但我没有使用findDataSources。将发布我的解决方案 – Yokich