Search code examples
androidgoogle-play-servicesgoogle-fitgoogle-fit-sdk

How to differentiate between manual added steps and sensor recorded steps in Google Fit Api


I am using Google Fit Api in my project to get user's daily steps. But the problem is, user can enter the steps manually by adding the activities. And when i retrieve the daily steps, Google Fit Api also returns the steps which were added manually. Is there any way to differentiate between manually added steps and sensor recorded steps.


Solution

  • This is how i solved this issue.

       final DataReadRequest readRequest = new DataReadRequest.Builder()
                .read(googleFitUtils.getEstimatedSteps())
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();
    
        DataReadResult dataReadResult =
                Fitness.HistoryApi.readData(mGoogleApiFitnessClient, readRequest).await(1, TimeUnit.MINUTES);
    
        DataSet stepData = dataReadResult.getDataSet(DataType.TYPE_STEP_COUNT_DELTA);
    
        int totalSteps = 0;
    
        for (DataPoint dp : stepData.getDataPoints()) {
            for(Field field : dp.getDataType().getFields()) {
                int steps = dp.getValue(field).asInt();
                if (!"user_input".equals(dp.getOriginalDataSource().getStreamName()))
                    totalSteps += steps;
            }
        }
    

    First Point - > Before i was getting the total steps using

    Fitness.HistoryApi.readDailyTotal
    

    which returns one data point with total daily steps. Second Point - > Then i changed the way to get the daily steps using

    Fitness.HistoryApi.readData
    

    It returns array of data points with the chunks of daily steps. Each data point has a property of

    dp.getOriginalDataSource().getStreamName()
    

    which returns you the type, either steps were recorded by sensor or it was a use input. That's how you can filter the user input steps to avoid steps hack in your application.