Interfejs Sensors API umożliwia odczytywanie nieprzetworzonych danych z czujników w aplikacji w czasie rzeczywistym. Za pomocą tego interfejsu API możesz:
- Lista źródeł danych dostępnych na urządzeniu i na urządzeniach towarzyszących.
- Zarejestruj detektory, aby otrzymywać nieprzetworzone dane z czujnika.
- Wyrejestruj detektory, aby nie otrzymywały już nieprzetworzonych danych z czujników.
Wyświetlanie listy dostępnych źródeł danych
Aby uzyskać listę wszystkich dostępnych źródeł danych na urządzeniu i w aplikacji towarzyszącej
na urządzeniach mobilnych, użyj
SensorsClient.findDataSources
:
private val fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build()
// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(requireContext(), GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions))
.findDataSources(
DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
.setDataSourceTypes(DataSource.TYPE_RAW)
.build())
.addOnSuccessListener { dataSources ->
dataSources.forEach {
Log.i(TAG, "Data source found: ${it.streamIdentifier}")
Log.i(TAG, "Data Source type: ${it.dataType.name}")
if (it.dataType == DataType.TYPE_STEP_COUNT_DELTA) {
Log.i(TAG, "Data source for STEP_COUNT_DELTA found!")
...
}
}
}
.addOnFailureListener { e ->
Log.e(TAG, "Find data sources request failed", e)
}
FitnessOptions fitnessOptions = FitnessOptions.builder().addDataType(DataType.TYPE_STEP_COUNT_DELTA).build();
// Note: Fitness.SensorsApi.findDataSources() requires the
// ACCESS_FINE_LOCATION permission.
Fitness.getSensorsClient(getApplicationContext(), GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions))
.findDataSources(
new DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_STEP_COUNT_DELTA)
.setDataSourceTypes(DataSource.TYPE_RAW)
.build())
.addOnSuccessListener(dataSources -> {
dataSources.forEach(dataSource -> {
Log.i(TAG, "Data source found: ${it.streamIdentifier}");
Log.i(TAG, "Data Source type: ${it.dataType.name}");
if (dataSource.getDataType() == DataType.TYPE_STEP_COUNT_DELTA) {
Log.i(TAG, "Data source for STEP_COUNT_DELTA found!");
...
}
})})
.addOnFailureListener(e ->
Log.e(TAG, "Find data sources request failed", e));
Aby uzyskać informacje o urządzeniu ze źródła danych, użyj funkcji
DataSource.getDevice
. Informacje o urządzeniu są przydatne do odróżniania podobnych czujników na różnych urządzeniach, wyświetlania informacji o urządzeniu z czujnika użytkownikowi lub przetwarzania danych w różny sposób w zależności od urządzenia. Możesz na przykład:
chcesz odczytywać dane z czujnika na urządzeniu do noszenia.
urządzenia, ale nie z czujnika takiego samego typu jak w telefonie.
Aby uzyskać instancję Device
na urządzeniu, na którym wykonywana jest aktywność, użyj metody Device.getLocalDevice
. Jest to przydatne, gdy chcesz sprawdzić, czy źródło danych znajduje się w
na tym samym urządzeniu, na którym działa Twoja aplikacja.
Dodawanie słuchacza
Aby dodać detektora, który będzie otrzymywać nieprzetworzone dane określonego typu danych fitness lub z
określonego źródła danych, użyj funkcji
SensorsClient.add
:
val listener = OnDataPointListener { dataPoint ->
for (field in dataPoint.dataType.fields) {
val value = dataPoint.getValue(field)
Log.i(TAG, "Detected DataPoint field: ${field.name}")
Log.i(TAG, "Detected DataPoint value: $value")
}
}
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
.add(
SensorRequest.Builder()
.setDataSource(dataSource) // Optional but recommended for custom
// data sets.
.setDataType(dataType) // Can't be omitted.
.setSamplingRate(10, TimeUnit.SECONDS)
.build(),
listener
)
.addOnSuccessListener {
Log.i(TAG, "Listener registered!")
}
.addOnFailureListener {
Log.e(TAG, "Listener not registered.", task.exception)
}
OnDataPointListener listener = dataPoint -> {
for (Field field : dataPoint.getDataType().getFields()) {
Value value = dataPoint.getValue(field);
Log.i(TAG, "Detected DataPoint field: ${field.getName()}");
Log.i(TAG, "Detected DataPoint value: $value");
}
};
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
.add(
new SensorRequest.Builder()
.setDataSource(dataSource) // Optional but recommended
// for custom data sets.
.setDataType(dataType) // Can't be omitted.
.setSamplingRate(10, TimeUnit.SECONDS)
.build(),
listener
)
.addOnSuccessListener(unused ->
Log.i(TAG, "Listener registered!"))
.addOnFailureListener(task ->
Log.e(TAG, "Listener not registered.", task.getCause()));
}
Usuwanie słuchacza
Aby usunąć słuchacza z aktualizacji danych nieprzetworzonych, użyj metody SensorsClient.remove
:
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
.remove(listener)
.addOnSuccessListener {
Log.i(TAG, "Listener was removed!")
}
.addOnFailureListener {
Log.i(TAG, "Listener was not removed.")
}
Fitness.getSensorsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
.remove(listener)
.addOnSuccessListener(unused ->
Log.i(TAG, "Listener was removed!"))
.addOnFailureListener(e ->
Log.i(TAG, "Listener was not removed."));