Фитнес getSensorsClient Не может прочитать данные в реальном времени TYPE_ACTIVITY_SEGMENT - PullRequest
0 голосов
/ 28 октября 2019

Цель - Получить непрерывный обратный вызов активности (например, ходьба, бег и т. Д.), Прочитать реальные данные для действий.

Я могу читать данные в реальном времени для 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());
                        }
                    });
}
...