Как найти шаги с помощью Google Fit API для Android?

Я провел пару дней исследований по этому поводу. Все, что мне нужно, это область Simple TextView в моем приложении для отображения сегодняшних шагов.

Мне удалось заставить аутентификацию работать с кодом ниже. Он всплывает, запрашивает разрешение и думает, что я выбрал правильный.

Но я не могу понять, как просто получить информацию о подсчете шагов. Надеюсь, это всего пара строк кода. Любая помощь будет оценена по достоинству. Спасибо

РЕДАКТИРОВАТЬ 1: Мне просто нужно получить число шагов. Я могу понять, как отобразить его позже. У меня также есть тосты, чтобы помочь мне понять, что происходит.

private void buildFitnessClient() {
    if (mClient == null) {
        mClient = new GoogleApiClient.Builder(this)
                .addApi(Fitness.SENSORS_API)
                .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
                .addConnectionCallbacks(
                        new GoogleApiClient.ConnectionCallbacks() {
                            @Override
                            public void onConnected(Bundle bundle) {
                                Log.i(TAG, "Connected!!!");
                                // Now you can make calls to the Fitness APIs.
                                Toast.makeText(getBaseContext(), "Connected!", Toast.LENGTH_LONG).show();


                            }

                            @Override
                            public void onConnectionSuspended(int i) {
                                // If your connection to the sensor gets lost at some point,
                                // you'll be able to determine the reason and react to it here.
                                if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
                                    Log.i(TAG, "Connection lost.  Cause: Network Lost.");
                                    Toast.makeText(getBaseContext(), "Connection lost.  Cause: Network Lost.", Toast.LENGTH_LONG).show();

                                } else if (i
                                        == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
                                    Log.i(TAG,
                                            "Connection lost.  Reason: Service Disconnected");
                                }
                            }
                        }
                )
                .enableAutoManage(this, 0, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                        Log.i(TAG, "Google Play services connection failed. Cause: " +
                                result.toString());
                        Toast.makeText(getBaseContext(), "Google Play services connection failed. Cause: " +
                                result.toString(), Toast.LENGTH_LONG).show();

                    }
                })
                .build();
    }
}

person Rueben    schedule 20.01.2016    source источник
comment
Пробовали ли вы использовать HistoryAPI для Google Fitness API. К сведению: developers.google.com/fit/android/history   -  person zIronManBox    schedule 20.01.2016


Ответы (2)


Ознакомьтесь с этой официальной документацией от Google о том, как считывать данные из Fit:

// Setting a start and end date using a range of 1 week before this moment.
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.WEEK_OF_YEAR, -1);
long startTime = cal.getTimeInMillis();

java.text.DateFormat dateFormat = getDateInstance();
Log.i(TAG, "Range Start: " + dateFormat.format(startTime));
Log.i(TAG, "Range End: " + dateFormat.format(endTime));

DataReadRequest readRequest = new DataReadRequest.Builder()
        // The data request can specify multiple data types to return, effectively
        // combining multiple data queries into one call.
        // In this example, it's very unlikely that the request is for several hundred
        // datapoints each consisting of a few steps and a timestamp.  The more likely
        // scenario is wanting to see how many steps were walked per day, for 7 days.
        .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
        // Analogous to a "Group By" in SQL, defines how data should be aggregated.
        // bucketByTime allows for a time span, whereas bucketBySession would allow
        // bucketing by "sessions", which would need to be defined in code.
        .bucketByTime(1, TimeUnit.DAYS)
        .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
        .build();

Пример приложения History API на GitHub:

Посмотрите пример проекта на GitHub здесь.

Прямая ссылка на MainActivity.java (в приведенном выше примере проекта), содержащая необходимый код: Ссылка

person AndroidMechanic - Viral Patel    schedule 20.01.2016
comment
Хорошо, устал от этого, и он не возвращает никаких ошибок. После этого я использовал этот код, чтобы передать его в результат. DataReadResult dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await(1, TimeUnit.MINUTES); Я все еще не могу передать это в TextView или даже в тост. - person Rueben; 20.01.2016
comment
Это дало вам данные? - person AndroidMechanic - Viral Patel; 20.01.2016
comment
Я понятия не имею, как проверить. Как я могу прочитать результат данных. Я пробовал это, но мне не повезло, так как я не могу передать в него набор данных. developers.google.com/fit/android/history#read_daily_total_data - person Rueben; 20.01.2016
comment
добавил ссылку на образец проекта в ответ. Проверь это - person AndroidMechanic - Viral Patel; 20.01.2016

GoogleApiClient устарел в соответствии с новыми обновлениями. Как и HistoryApi, он также устарел. Поэтому сначала нужно использовать GoogleSignInAccount вместо GoogleApiClient, а также использовать HistoryClient Google Fit вместо HistoryApi.

Настройка параметров фитнеса

 val fitnessOptions: GoogleSignInOptionsExtension = FitnessOptions.builder()
        .addDataType(TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ).build()

Настройка параметра входа в Google

val googleSignInOptions =
        GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .addExtension(fitnessOptions).requestEmail().build()
    val googleSignInClient = GoogleSignIn.getClient(requireActivity(), googleSignInOptions)
    val signIntent = googleSignInClient.signInIntent
    startActivityForResult(signIntent, 0)

Получение учетной записи

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        val account = task.getResult(ApiException::class.java)
        if (account != null) {
            getGoogleFitData(account)
        }
    }
}

Теперь для получения данных шага

val response: Task<DataReadResponse> =
            Fitness.getHistoryClient(mContext, mSignInAccount)
                .readData(
                    DataReadRequest.Builder()
                        .read(TYPE_STEP_COUNT_DELTA)
                        .setTimeRange(
                            startTime,
                            endTime,
                            TimeUnit.MILLISECONDS
                        )
                        .build()
                )

        val readDataResult: DataReadResponse? = Tasks.await(response)
        val dataSet: DataSet = readDataResult!!.getDataSet(TYPE_STEP_COUNT_DELTA)

        var total = 0
        if (!dataSet.isEmpty) {
            val dataPoints = dataSet.dataPoints
            if (dataPoints.size > 0) {
                for (i in 0 until dataPoints.size) {
                    total += dataSet.dataPoints[i].getValue(Field.FIELD_STEPS).asInt()
                }
                Log.e(TAG, "Total Steps : $total")
            }
        }
  • Здесь startTime и endTime — это мельницы времени любой даты и времени.

Благодарю вас.

person Geek Tanmoy    schedule 21.04.2020
comment
у вас есть код ссылки?? - person grooot; 28.01.2021
comment
Да, конечно. Я обновил свой ответ, проверьте его, вы обязательно найдете какое-то решение. Спасибо - person Geek Tanmoy; 28.01.2021
comment
Спасибо друг. не могли бы вы проверить это один раз и посмотреть, есть ли у вас какие-либо подсказки stackoverflow.com/questions/65933509/ - person grooot; 28.01.2021
comment
Я ответил на ваш вопрос, пожалуйста, проверьте его. - person Geek Tanmoy; 29.01.2021
comment
Спасибо, бро!! Я ввел данные вручную в своем приложении Google Fit. Но мои значения точек данных History API, похоже, возвращаются пустыми. Даже если я добавлю какие-либо данные, они не отразятся в приложении Google Fit. есть ли какой-то вариант синхронизации, который мне не хватает?? - person grooot; 05.02.2021