Как мне получить инструкции из Google Fit API?

#android #api #google-fit #google-fit-sdk

#Android #API #google-fit #google-fit-sdk

Вопрос:

Простите за грубость, я совершенно новичок в 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 году). И несколько мест, в которых есть обновленная документация, предоставляют фрагменты кода, и я понятия не имею, как их использовать или куда их поместить.

Комментарии:

1. вы проверили, есть ли в fit api какие-либо данные?

2. Я не знаю, как это сделать. Как мне это проверить?

3. если вы попробуете это на реальном устройстве, установите приложение Google fit и откройте его. если он показывает некоторые данные

4. Теперь я смог проверить ваш запрос в своем приложении, он работает, и покажите мне это 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}

5. мой обратный вызов — .addOnSuccessListener(new OnSuccessListener<DataReadResponse>()

Ответ №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 ");
                    }
                });
  

Комментарии:

1. Я думаю, что это работает… но я все еще не уверен, как установить int stepNumber …… могу ли я сделать что-то вроде stepNumber = dataReadResponse.getDataSet(тип данных.TYPE_STEP_COUNT_DELTA)); Или мне нужно как-то извлечь его из fitnessOptions?

2. чтобы уточнить, как мне на самом деле преобразовать этот ответ в простое целое число или Long, которое я могу использовать в своем приложении?

3. легко)) вы вернетесь к .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA) и .addOnSuccessListener(new OnSuccessListener<DataSet>() . В вашем результирующем наборе данных вы можете получить: dataSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt());

4. Когда я пытаюсь установить int steps = DataSet.getDataPoints().get(0).GetValue (поле. FIELD_STEPS).asInt()); он компилируется и запускается… но сбой в той части, где я пытаюсь установить для TextView значение .setText (steps); Я думаю, что мусор хранится в steps? Нужно ли мне указывать ему где-то использовать ключ API? или Oauth? Потому что я еще нигде их не разместил, поскольку понятия не имею, куда они ведут.

5. ? Я также использую Android Studio на win 10, и у меня есть журналы на всех моих реальных устройствах.