Я использую Google Fit API, чтобы получить частоту сердечных сокращений. Я использую Sensor Client, но он всегда возвращает -3.0. Я добавил разрешение в манифесте и получил разрешение на вход в Google too.listener регистрируется, но всегда будет давать -3.0 , Я использую тип данных TYPE_HEART_RATE_BPM и источник данных TYPE_RAW.
private DataType dataType = DataType.TYPE_HEART_RATE_BPM;
private int dataSource = DataSource.TYPE_RAW;
private void getFitnessData() {
Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.findDataSources(
new DataSourcesRequest.Builder()
.setDataTypes(dataType)
.setDataSourceTypes(dataSource)
.build())
.addOnSuccessListener(
new OnSuccessListener<List<DataSource>>() {
@Override
public void onSuccess(List<DataSource> dataSources) {
for (DataSource dataSource : dataSources) {
Log.i(TAG, "Data source found: " + dataSource.toString());
Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());
// Let's register a listener to receive Activity data!
if (dataSource.getDataType().equals(dataType)
&& mListener == null) {
registerFitnessDataListener(dataSource, dataType);
}
}
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "failed", e);
}
});
}
Слушатель: он регистрируется, но один раз вернет -3.0.
private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
// [START register_data_listener]
mListener =
new OnDataPointListener() {
@Override
public void onDataPoint(DataPoint dataPoint) {
for (Field field : dataPoint.getDataType().getFields()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
DataSource val = dataPoint.getDataSource();
Log.i(TAG, "Detected DataPoint field: " + field.getName());
Log.i(TAG, "Detected DataPoint value: " + dataPoint.getValue(field));
}
});
}
}
};
Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.add(
new SensorRequest.Builder()
.setDataType(dataType)
.setSamplingRate(1, TimeUnit.SECONDS)
.setMaxDeliveryLatency(3, TimeUnit.SECONDS)
.setFastestRate(1, TimeUnit.SECONDS)
.build(),
mListener)
.addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Listener registered");
} else {
Log.e(TAG, "Listener not registered", task.getException());
}
}
});
}