Dostęp do nieprzetworzonych danych z czujników

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 :

KotlinJava
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 :

KotlinJava
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:

KotlinJava
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."));