Только пройденное расстояние Google Fit (не общая прогулка + езда на велосипеде + бег)

Я получаю расстояние Google Fit для своего приложения, но я заметил, что оно включает в себя езду на велосипеде и бег. Есть ли способ получить только пройденное расстояние?

Это пример моего приложения: https://github.com/francislainy/fit

введите здесь описание изображения

// ----------- Google Fit Daily DISTANCE -----------
public static void subscribeDailyDistance() {


    Log.d(LOG_TAG, "subscribeDailyDistance was called");

    if (client != null) {

        // To create a subscription, invoke the Recording API.
        // As soon as the subscription is active, fitness data will start recording
        Fitness.RecordingApi.subscribe(client, DataType.TYPE_DISTANCE_DELTA)
                .setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(@NonNull Status status) {

                        if (status.isSuccess()) {

                            if (status.getStatusCode() == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                                Log.d(LOG_TAG, "Existing subscription for activity detected.");

                            } else {
                                Log.d(LOG_TAG, "Successfully subscribed");

                            }

                            // :)
                            readDistanceToday();

                        } else {
                            Log.e(LOG_TAG, "There was a problem subscribing");
                        }

                    }
                });

    }

}


public static class VerifyDataTaskDistance extends AsyncTask<GoogleApiClient, Void, Void> {

    float total = 0;

    protected Void doInBackground(GoogleApiClient... clients) {

        PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(clients[0], DataType.TYPE_DISTANCE_DELTA);
        DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS);
        if (totalResult.getStatus().isSuccess()) {
            DataSet totalSet = totalResult.getTotal();
            total = totalSet.isEmpty()
                    ? 0
                    : totalSet.getDataPoints().get(0).getValue(Field.FIELD_DISTANCE).asFloat();
        } else {
            Log.e(LOG_TAG, "There was a problem getting the distance count");
        }

        Log.i(LOG_TAG, "Total distance: " + total);


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {

        // UI
        updateDistanceGoogle(total, MainActivity.mainActivity.getSupportFragmentManager());

    }

}

Это похоже на этот другой вопрос SO, на который нет ответа:

расстояние бега Google Fit SDK

Спасибо за вашу помощь. :)

PS: добавление дополнительного кода в соответствии с предложением ginnyhuang использовать ведро по сегментам

 private static DataReadRequest getDataDistanceReadRequest(int numberOfDaysPast) {

    Calendar cal = new GregorianCalendar();
    cal.setTime(new Date());
    cal.add(Calendar.DAY_OF_YEAR, -numberOfDaysPast);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    long endTime = cal.getTimeInMillis();

    cal.add(Calendar.DAY_OF_YEAR, -1);

    long startTime = cal.getTimeInMillis();

    DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder()
            .setDataType(DataType.TYPE_DISTANCE_DELTA)
            .setType(DataSource.TYPE_DERIVED)
            .setStreamName("merge_distance_delta")
            .setAppPackageName("com.google.android.gms")
            .build();

    return new DataReadRequest.Builder()
            .aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_DISTANCE_DELTA)
            //.bucketByTime(1, TimeUnit.DAYS) //todo
            .bucketByActivitySegment(7, TimeUnit.DAYS)
            .aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
            .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
            .build();

}

А также

protected Void doInBackground(Integer... params) {

        daysIndex = params[0];

        DataReadRequest dataReadRequest = getDataDistanceReadRequest(daysIndex);

        // Invoke the History API to fetch the data with the query and await the result of
        // the read request.
        DataReadResult dataReadResult =
                Fitness.HistoryApi.readData(client, dataReadRequest).await(1, TimeUnit.MINUTES);

        List<Bucket> bucketList = dataReadResult.getBuckets();

        for (Bucket bucket : bucketList) {

            if (bucket.getActivity().equals("walking")) {

                dataSet = (bucket.getDataSet(DataType.TYPE_DISTANCE_DELTA));
            }
        }

        return null;
    }

person Francislainy Campos    schedule 07.06.2018    source источник
comment
Какой объект содержит ответ значений расстояния, отображаемый в вашем пользовательском интерфейсе?   -  person noogui    schedule 08.06.2018
comment
Привет @noogui, спасибо за ваш ответ. Не уверен, правильно ли я понял ваш вопрос, но значение, отображаемое для расстояния в моем пользовательском интерфейсе, происходит из этой строки: totalSet.getDataPoints().get(0).getValue(Field.FIELD_DISTANCE).asFloat();. По какой-то причине я продолжаю получать совокупное значение.   -  person Francislainy Campos    schedule 08.06.2018
comment
Привет @noogui. Я создал пример проекта, аналогичный моему приложению, на случай, если это поможет? Еще раз спасибо за изучение этого. :)   -  person Francislainy Campos    schedule 14.06.2018


Ответы (1)


bucketByActivitySegment — это ключ к сортировке результатов по активности. Вы можете отсортировать ведра по разным типам активности.

Предпосылка заключается в том, что сохраненное значение содержит сегмент активности.

Вот аналогичный ответ, который я опубликовал.

DataReadRequest readRequest = new DataReadRequest.Builder()
        .aggregate(DataType.TYPE_DISTANCE_DELTA, DataType.AGGREGATE_DISTANCE_DELTA)
        .bucketByActivitySegment( 1, TimeUnit.MINUTES) // just segement time over 1 minute will be list 
        .setTimeRange(startTimeLong, endTimeLong, TimeUnit.MILLISECONDS)
        .enableServerQueries()
        .build();

Fitness.getHistoryClient(context, GoogleSignIn.getLastSignedInAccount(context))
       .readData(readRequest)
       .addOnSuccessListener()
       .addOnFailureListener();
person ginnyhuang    schedule 15.06.2018
comment
Привет @ginnyhuang, большое спасибо за ваш ответ. Я попытался использовать BucketbySegment в соответствии с вашим предложением и добавил свой код в описание проблемы, но мой набор данных теперь равен нулю? Я также пытался сохранить ведро по времени и получить его активность, но оно продолжает возвращать «in_vehicle», хотя я только либо шел, либо ехал на велосипеде. - person Francislainy Campos; 15.06.2018
comment
Вы запустили обнаружение движения с помощью Google Fit? Если вы начнете обнаружение самостоятельно, вы можете потерять что-то для записи. Логин и разрешение, запрашиваемые у меня, сильно отличаются от ваших. Я не уверен, что это повлияет. Я делаю это с помощью руководства здесь: developers.google.com/fit/android/get -запущено. В FitnessOptions меня попросили разрешить чтение/запись для DataType.TYPE_ACTIVITY_SEGMENT, DataType.TYPE_ACTIVITY_SAMPLES. Если вам нужно расстояние, вы можете добавить TYPE_DISTANCE_DELTA, AGGREGATE_DISTANCE_DELTA. - person ginnyhuang; 19.06.2018
comment
Спасибо @ginnyhuang. Да, похоже, есть много вариантов кода, и мой код немного отличается от официальной документации. К сожалению, действительно не могу заставить эту часть работать. DataReadRequest readRequest = new DataReadRequest.Builder() .aggregate(ESTIMATED_STEP_DELTAS,DataType.AGGREGATE_DISTANCE_DELTA) .bucketByActivitySegment(7, TimeUnit.DAYS) .aggregate(ACTIVITY_SEGMENT,DataType.AGGREGATE_ACTIVITY_SUMMARY) .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) .build(); Мы будем продолжать работать над этим. Спасибо. - person Francislainy Campos; 20.06.2018
comment
Привет, нет, я никогда не мог понять, как это сделать, нет, извините. - person Francislainy Campos; 25.10.2020