|

|  How to Access Google Fit REST API in Android Apps

How to Access Google Fit REST API in Android Apps

October 31, 2024

Explore easy steps to integrate Google Fit REST API in Android apps. Learn to access fitness data, authenticate users, and enhance app functionality.

How to Access Google Fit REST API in Android Apps

 

Integrate Google Fit API

 

  • Start by adding the Google Fit API dependency in your `build.gradle` file. Use the following dependency for your `app` module: ``` dependencies { implementation 'com.google.android.gms:play-services-fitness:21.0.1' } ```
  •  

  • Sync your project with Gradle files by clicking on "Sync Now" in the notification bar at the top or going to `File -> Sync Project with Gradle Files`.

 

Request Permissions

 

  • Google Fit requires explicit user permission to access fitness data. Define permission constants that your app will use to access data: ``` import com.google.android.gms.fitness.data.DataType; import com.google.android.gms.fitness.data.Scopes;

    Set fitnessOptions = FitnessOptions.builder()
    .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE, FitnessOptions.ACCESS_READ)
    .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
    .build();

    </li>
    
    &nbsp;
    
    <li>Use the GoogleSignIn API to request permissions from the user. Check if the user already has granted permissions:
    

    GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(this, fitnessOptions);

    if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {
    GoogleSignIn.requestPermissions(
    this,
    REQUEST_OAUTH_REQUEST_CODE,
    account,
    fitnessOptions);
    } else {
    accessGoogleFitData();
    }

    </li>
    
    </ul>
    
    &nbsp;
    
    <b>Access Data from Google Fit</b>
    
    &nbsp;
    
    <ul>
    
    <li>Once permissions are granted, you can use the `HistoryClient` to access fitness data. Here's an example of how to read the daily step count data:
    

    private void accessGoogleFitData() {
    GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(this, fitnessOptions);

    Fitness.getHistoryClient(this, account)
        .readDailyTotal(DataType.TYPE_STEP_COUNT_DELTA)
        .addOnSuccessListener(response -> {
            long totalSteps = response.isEmpty()
                ? 0
                : response.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
            Log.i(TAG, "Total steps: " + totalSteps);
        })
        .addOnFailureListener(e -> Log.w(TAG, "There was an error reading data from Google Fit", e));
    

    }

    </li>
    
    &nbsp;
    
    <li>Make sure to handle cases where there is no step data returned or when there is an error in accessing the data.</li>
    
    </ul>
    
    &nbsp;
    
    <b>Handling User Authentication Response</b>
    
    &nbsp;
    
    <ul>
    
    <li>Handle the result of the authentication request in your `onActivityResult` method:
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            accessGoogleFitData();
        } else {
            Log.e(TAG, "User denied fitness access");
        }
    }
    

    }

    </li>
    
    </ul>
    
    &nbsp;
    
    <b>Optimize for Best Practices</b>
    
    &nbsp;
    
    <ul>
    
    <li>Ensure that you handle user opt-out scenarios gracefully. Prompt users with clear rationale and a detailed explanation of why accessing their fitness data will enhance their experience.</li>
    
    &nbsp;
    
    <li>Instead of constantly reading from Google Fit, cache results locally and update periodically to save battery life and network bandwidth.</li>
    
    </ul>
    
    &nbsp;