Могу ли я получить калории и расстояние с помощью Google Fit Sensor Api?

Могу ли я получить калории и расстояние с помощью Google Fit Sensor Api? Я пишу фитнес-приложение в реальном времени, которое должно показывать текущие данные, которые должны обновляться каждую секунду.

Я думаю, что использование session Api или History Api на моем пути - не очень хорошая идея. Если я ошибаюсь, пожалуйста, поправьте меня. Я смог найти только ручное получение шагов в реальном времени

Добавлено: в приведенном ниже коде работает только TYPE_STEP_COUNT_CUMULATIVE, например, TYPE_DISTANCE_CUMULATIVE не работает

private void buildFitnessClient() {
    if (mClient == null) {
        mClient = new GoogleApiClient.Builder(getActivity())
                .addApi(Fitness.SENSORS_API)
                .addScope(new Scope(Scopes.FITNESS_LOCATION_READ))
                .addConnectionCallbacks(
                        new GoogleApiClient.ConnectionCallbacks() {
                            @Override
                            public void onConnected(Bundle bundle) {
                                Log.i(TAG, "Connected!!!");
                                findFitnessDataSources();
                            }

                            @Override
                            public void onConnectionSuspended(int i) {

                                if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                    Log.i(TAG, "Connection lost.  Cause: Network Lost.");
                                } else if (i
                                        == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                    Log.i(TAG,
                                            "Connection lost.  Reason: Service Disconnected");
                                }
                            }
                        }
                )
                .enableAutoManage((MainActivity)getActivity(), 0, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                        Log.i(TAG, "Google Play services connection failed. Cause: " +
                                result.toString());
                    }
                })
                .build();
    }
}

private void findFitnessDataSources() {

    Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_DISTANCE_CUMULATIVE)
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build())
            .setResultCallback(new ResultCallback<DataSourcesResult>() {
                @Override
                public void onResult(DataSourcesResult dataSourcesResult) {
                    for (DataSource dataSource : dataSourcesResult.getDataSources()) {
                        if (DataType.TYPE_DISTANCE_CUMULATIVE.equals(dataSource.getDataType())) {
                            registerFitnessDataListener(dataSource, DataType.TYPE_DISTANCE_CUMULATIVE);
                        }
                    }
                }
            });
}

private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
    mListener = new OnDataPointListener() {
        @Override
        public void onDataPoint(DataPoint dataPoint) {
            for (final Field field : dataPoint.getDataType().getFields()) {
                final Value val = dataPoint.getValue(field);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity(), "Field: " + field.getName() + " Value: " + val, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    };

    Fitness.SensorsApi.add(
            mClient,
            new SensorRequest.Builder()
                    .setDataSource(dataSource)
                    .setDataType(dataType)
                    .setSamplingRate(3, TimeUnit.SECONDS)
                    .build(),
            mListener)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        Log.i(TAG, "Listener registered!");
                    } else {
                        Log.i(TAG, "Listener not registered.");
                    }
                }
            });
}

person Devnock    schedule 31.03.2016    source источник


Ответы (1)


ДА! Вы можете

Вот документация, что можно делать, а что нельзя. Вы также можете делать пользовательские значения данных.

person maxadorable    schedule 31.03.2016
comment
Вы уверены, что с помощью Sensor Api (а не History Api или Session Api) я могу работать с такими типами, как TYPE_DISTANCE_CUMULATIV? - person Devnock; 01.04.2016
comment
Я не понимаю, почему не? Попробуй это. Я так считаю. - person maxadorable; 01.04.2016