Цель - Получить непрерывный обратный вызов активности (например, ходьба, бег и т. Д.), Прочитать реальные данные для действий.
Я могу читать данные в реальном времени для TYPE_LOCATION_SAMPLEдля того же кода, что и ниже, просто изменив на TYPE_ACTIVITY_SEGMENT. я не могу прочитать реальные данные для таких действий, как - ходьба, бег и т. д. Пример - https://developers.google.com/fit/rest/v1/reference/activity-types [Google fit - чтение с использованием getSensorsClient]
чтение примера - ходьба *7 Ходьба (фитнес) 93
После - https://developers.google.com/fit/android/sensors
OnDataPointListener mListener = dataPoint -> {
// this call back i want every time - i walk or move as per firebase documentation
Util.showToastLong(context, " ACTIVITY CONTINUOUS data point---- dataType " + dataType + " " + dataPoint);
};
Мои наблюдения - я могу получить обратный вызов OnDataPointListener для данных о местоположениитип, но тот же образец не работает для данных активности.
Вывод я хочу - Из блока кода C - registerFitnessDataListener - метод - OnDataPointListener - должен вернуть непрерывный вызов в течение 5секунд, как написано в коде Но это не работает, почему не работает, я не знаю, пожалуйста, помогите
Код - A. Ниже опция входа - я подписываюуспешно -
public static FitnessOptions getFitnessSignInOptions() {
return FitnessOptions.builder()
.addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE)
.build(); }
B.
public void readSensorsActivity(Context context) {
Timber.d("readSensorsActivity ");
GoogleSignInAccount lastSignedInAccount = GoogleSignIn.getLastSignedInAccount(context);
if (lastSignedInAccount == null) {
return;
}
Fitness.getSensorsClient(context, lastSignedInAccount)
.findDataSources(
new DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_ACTIVITY_SEGMENT)
.setDataSourceTypes(DataSource.TYPE_DERIVED)
.build())
.addOnSuccessListener(
dataSources -> {
Timber.d("activity data---" + dataSources);
DataSource ds = new DataSource.Builder()
.setAppPackageName(context.getPackageName())
.setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
.setType(DataSource.TYPE_RAW)
.build();
Util.showToastLong(context, " ACTIVITY DATA----" + dataSources);
registerFitnessDataListener(context, ds, DataType.TYPE_ACTIVITY_SEGMENT);
})
.addOnFailureListener(
e -> {
e.printStackTrace();
Timber.d("failed" + e);
});
}
C. Код слушателя -
private static void registerFitnessDataListener(Context context, DataSource dataSource, DataType dataType) {
OnDataPointListener mListener = dataPoint -> {
Util.showToastLong(context, " ACTIVITY CONTINUOUS data point---- dataType " + dataType + " " + dataPoint);
for (Field field : dataPoint.getDataType().getFields()) {
Value val = dataPoint.getValue(field);
Util.showToastLong(context, " register continuous---- dataType " + dataType + " " + val);
Timber.d("Detected DataPoint field: " + field.getName());
Timber.d("Detected DataPoint value: " + val);
}
};
Fitness.getSensorsClient(context, GoogleSignIn.getLastSignedInAccount(context))
.add(
new SensorRequest.Builder()
.setDataSource(dataSource) // Optional but recommended for custom data sets.
.setDataType(dataType) // Can't be omitted.
.setSamplingRate(5, TimeUnit.SECONDS)
.build(),
mListener)
.addOnCompleteListener(
task -> {
Util.showToastLong(context, " REGISTER ACTIVITY listener---- dataType " + dataType + " " + task);
if (task.isSuccessful()) {
Timber.d("Listener registered!");
} else {
Timber.d("Listener not registered." + task.getException());
}
});
}
Примечание для достижения того же результата - другой подход -
Google Fitness API, данные датчика Android не могутt читать - с помощью клиента Fitness Sensor - с использованием сегмента активности телефона / устройства Android, OnDataPointListener
Цель - невозможно получить данные в реальном времени TYPE_ACTIVITY_SEGMENT.
Отслеживание - https://developers.google.com/android/reference/com/google/android/gms/fitness/SensorsClient.html
это работает хорошо, я могу прочитать дельту типа шага подсчета для того же кода, что и ниже, просто изменив TYPE_STEP_COUNT_DELTA на TYPE_ACTIVITY_SEGMENT. Но это не работает для TYPE_ACTIVITY_SEGMENT.
Требуется вывод - Из блока Code 2 - OnDataPointListener - должен дать спорный обратный вызов в течение 1 секунды, как записано в коде.
OnDataPointListener myStepCountListener = dataPoint -> {
Но это не работает, почему не работает? Не знаю, пожалуйста, помогите
Код - 1. Ниже приведена опция входа - я вхожу успешно -
public static FitnessOptions getFitnessSignInOptions() {
return FitnessOptions.builder()
.addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE)
.build(); }
Код - 2
public void readSensorActivity(Context context) {
GoogleSignInAccount googleSignInAccount = GoogleSignIn.getLastSignedInAccount(context);
if (googleSignInAccount == null) {
return;
}
OnDataPointListener myStepCountListener = dataPoint -> {
Util.showToastLong(context, dataPoint.toString());
Timber.d(dataPoint.toString());
Util.showToastLong(context, " CONTINUOUS data point---- " + " " + dataPoint);
for (Field field : dataPoint.getDataType().getFields()) {
Value val = dataPoint.getValue(field);
Util.showToastLong(context, " register continuous---- " + " " + val);
Timber.d("Detected DataPoint field: " + field.getName());
Timber.d("Detected DataPoint value: " + val);
}
};
Fitness.getSensorsClient(context, googleSignInAccount)
.add(
new SensorRequest.Builder()
.setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
.setSamplingRate(1, TimeUnit.SECONDS) // sample once per minute
.build(),
myStepCountListener).
addOnFailureListener(
e -> {
e.printStackTrace();
Timber.d("failed" + e);
})
.addOnCompleteListener(
task -> {
Util.showToastLong(context, " REGISTER listener---- " + " " + task);
if (task.isSuccessful()) {
Timber.d("Listener registered!");
} else {
Timber.d("Listener not registered." + task.getException());
}
});
}