Доступ к необработанным данным датчика

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

  • Перечислите источники данных, доступные на устройстве и сопутствующих устройствах.
  • Зарегистрируйте слушателей для получения необработанных данных датчиков.
  • Отмените регистрацию слушателей, чтобы они больше не получали необработанные данные датчиков.

Список доступных источников данных

Чтобы получить список всех доступных источников данных на устройстве и на сопутствующих устройствах, используйте метод 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));

Чтобы получить информацию об устройстве для источника данных, используйте метод DataSource.getDevice . Информация об устройстве полезна для отличия от аналогичных датчиков на разных устройствах, отображения информации об устройстве от датчика пользователю или обработки данных по-разному в зависимости от устройства. Например, вас может заинтересовать считывание данных именно с датчика на носимом устройстве, а не с датчика того же типа на телефоне.

Чтобы получить экземпляр Device для устройства, на котором выполняется ваше действие, используйте метод Device.getLocalDevice . Это полезно, когда вы хотите проверить, находится ли источник данных на том же устройстве, на котором запущено ваше приложение.

Добавить слушателя

Чтобы добавить прослушиватель для получения необработанных данных определенного типа данных о пригодности или из определенного источника данных, используйте метод 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()));
}

Удалить слушателя

Чтобы удалить прослушиватель из обновлений необработанных данных, используйте метод 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."));