Как получить шаги из Google Fit API?

Извините, новичок, я совершенно новичок в Android и API Google. У меня есть следующий код, который подключается к GoogleFit. У меня также есть ключ API и Oauth.

Где/как использовать ключ API и Oauth? Много руководств о том, как их получить, но нет информации о том, куда их поместить/как их использовать в приложении.

И как мне на самом деле использовать возвращенные шаги. Я установил глобальный:

private int steps;

а затем попробуйте установить его через:

steps = (int)total;

но это ничего не делает.

Вот остальная часть функции. Как мне на самом деле получить количество шагов из него.

 private void accessGoogleFit() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        long endtime = cal.getTimeInMillis();
        cal.add(Calendar.YEAR, -1);
        long starttime = cal.getTimeInMillis();

        DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                .bucketByTime(1, TimeUnit.DAYS)
                .setTimeRange(starttime, endtime, TimeUnit.MILLISECONDS)
                .build();

        Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this))
                .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
                .addOnSuccessListener(new OnSuccessListener<DataSet>() {
                    @Override
                    public void onSuccess(DataSet dataSet) {
                        Log.d("Status", "Success");
                        long total = dataSet.isEmpty()
                                ? 0
                                : dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
                        Log.d("Steps ", String.valueOf(total));
                        steps = (int)total; //Trying to get steps here
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d("Status", "Failure", e);
                    }
                })
                .addOnCompleteListener(new OnCompleteListener<DataSet>() {
                    @Override
                    public void onComplete(@NonNull Task<DataSet> task) {
                        Log.d("Status", "Complete");

                    }
                });

    }

Я просматривал официальную документацию и StackOverflow. Но похоже, что Google внес большие изменения в API в прошлом году, и поэтому большинство вещей устарели, включая собственные учебные пособия Google (опубликованные в 2015 году). И несколько мест с обновленной документацией содержат фрагменты кода, и я понятия не имею, как их использовать или куда их поместить.


person Duxa    schedule 06.03.2019    source источник
comment
Вы проверяли, есть ли у подходящего API какие-либо данные?   -  person Vadim Eksler    schedule 06.03.2019
comment
Я не знаю, как это сделать. Как мне это проверить?   -  person Duxa    schedule 06.03.2019
comment
если вы попробуете это на реальном устройстве, установите приложение Google Fit и откройте его. если он показывает некоторые данные   -  person Vadim Eksler    schedule 06.03.2019
comment
Теперь я смог проверить ваш запрос в своем приложении, он работает, и покажите мне это dataReadResponse.getBuckets().get(0));: мой журнал Bucket{startTime=1551260296979, endTime=1551865096979, activity=0, dataSets=[DataSet{d:step_count.delta:gms:aggregated [RawDataPoint{[21648]@[1551260985001540984, 1551864350023920959](0,1)}]}], bucketType=time, serverHasMoreData=false}   -  person Vadim Eksler    schedule 06.03.2019
comment
мой обратный звонок - .addOnSuccessListener(new OnSuccessListener<DataReadResponse>()   -  person Vadim Eksler    schedule 06.03.2019
comment
Пробовал работать на телефоне Android, на котором установлен Google Fit, и, поскольку логарифма нет, я не уверен, есть ли данные или нет... У меня есть textView, установленный на число, если ›0, а textView пустое... так что я предполагая, что он не может прочитать шаги ?? Этот запрос, который вы разместили выше... что он означает и как я могу использовать эту информацию? У меня такое чувство, что я неправильно получаю шаг #... например, мне нужен еще один вызов функции или что-то в этом роде?   -  person Duxa    schedule 06.03.2019
comment
откройте приложение Google Fit. он покажет, есть ли у вас какие-то данные в вашем API   -  person Vadim Eksler    schedule 06.03.2019
comment
о, да, у него есть шаги и калории (сегодня я носил его с собой весь день специально, чтобы получить некоторые данные)..   -  person Duxa    schedule 06.03.2019
comment
посмотри мой ответ   -  person Vadim Eksler    schedule 06.03.2019


Ответы (1)


Вот как я делаю запрос Google Fit API: запрос с FitnessOptions, например

    FitnessOptions fitnessOptions = FitnessOptions.builder()
            .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_DISTANCE_DELTA, FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
            .build();

вам нужно будет запросить GoogleSignIn.requestPermissions

И моя функция запроса

Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        long endTime = cal.getTimeInMillis();
        cal.add(Calendar.WEEK_OF_YEAR, -1);
        long startTime = cal.getTimeInMillis();

        DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
//                .read(DataType.TYPE_STEP_COUNT_DELTA)
                .bucketByTime(8, TimeUnit.DAYS)
                .enableServerQueries()
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();

        Fitness.getHistoryClient(
                this,
                GoogleSignIn.getLastSignedInAccount(this))
                .readData(readRequest)
                .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                    @Override
                    public void onSuccess(DataReadResponse dataReadResponse) {
                        Log.d("TAG_F", "onSuccess: 1 " + dataReadResponse.toString());
                        Log.d("TAG_F", "onSuccess: 1 " + dataReadResponse.getStatus());
                        Log.d("TAG_F", "onSuccess: 1 " + dataReadResponse.getDataSet(DataType.TYPE_STEP_COUNT_DELTA));
                        Log.d("TAG_F", "onSuccess: 1 " + dataReadResponse.getBuckets().get(0));
                        Log.d("TAG_F", "onSuccess: 1 " + dataReadResponse.getBuckets().get(0).getDataSets().size());

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d("TAG_F", "onFailure: 1 " + e.getMessage());
                    }
                })
                .addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<DataReadResponse> task) {
                        Log.d("TAG_F", "onComplete: 1 ");
                    }
                });
person Vadim Eksler    schedule 06.03.2019
comment
Я думаю, что это работает... но я все еще не знаю, как установить int stepNumber...... могу ли я сделать что-то вроде stepNumber = dataReadResponse.getDataSet(DataType.TYPE_STEP_COUNT_DELTA)); Или мне нужно как-то извлечь его из FitnessOptions? - person Duxa; 06.03.2019
comment
чтобы уточнить, как мне на самом деле превратить этот ответ в простое целое или длинное число, которое я могу использовать в своем приложении? - person Duxa; 06.03.2019
comment
легко)) вы вернетесь к .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA) и .addOnSuccessListener(new OnSuccessListener<DataSet>(). В вашем результате DataSet вы можете получить: dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt()); - person Vadim Eksler; 06.03.2019
comment
Когда я пытаюсь установить int steps = dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt()); он компилируется и запускается... но падает в той части, где я пытаюсь установить для TextView значение .setText(steps); Я думаю, мусор хранится в шагах? Нужно ли мне где-то указывать, чтобы он использовал ключ API? или Оаут? Потому что мне еще предстоит разместить их где-нибудь, так как я понятия не имею, куда они идут. - person Duxa; 07.03.2019
comment
? Я также использую Android Studio на Win 10, и у меня есть журналы на всех моих реальных устройствах. - person Vadim Eksler; 07.03.2019
comment
Давайте продолжим обсуждение в чате. - person Duxa; 07.03.2019
comment
Я получаю dataSet.getDataPoints() с нулевым размером, не могли бы вы помочь мне понять, почему я каждый раз получаю ноль? - person Maradiya Krupa; 08.08.2020