Les API Google Fit, y compris l'API REST Google Fit, seront abandonnées en 2026. Depuis le 1er mai 2024, les développeurs ne peuvent plus s'inscrire pour utiliser ces API.
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Les objectifs sont des cibles dans Google Fit
l'appli
que les utilisateurs peuvent définir eux-mêmes. Elles aident à motiver les utilisateurs à rester actifs chaque
jour. À partir de leur profil, les utilisateurs peuvent définir le nombre de pas et
Les points cardio qu'ils souhaitent atteindre
pour chaque jour. La plate-forme Fit enregistre ses objectifs et suit leur
l'activité physique les concernant.
Créer une meilleure expérience utilisateur avec des objectifs
Votre application peut lire les objectifs d'un utilisateur pour effectuer le suivi de ses objectifs personnels. Ce
peut contribuer à créer une expérience plus attrayante. Pour commencer, utilisez la
GoalsClient
pour lire les objectifs de pas et de points cardio d'un utilisateur. Utilisez ensuite la méthode
HistoryClient
pour vérifier s'ils sont proches de ces objectifs.
Utiliser ces données pour aider les utilisateurs à passer de Google Fit à votre application
facilement, et d'obtenir des informations cohérentes entre les deux applications sur leur progression.
pour atteindre ses objectifs de remise en forme.
Inciter les utilisateurs à atteindre leurs objectifs quotidiens en leur fournissant des informations et des insights
liés à leur progression.
Lire un objectif
L'exemple suivant montre comment créer un client Fitness et obtenir le
l'objectif de points cardio de l'utilisateur, ou null s'il n'a pas d'objectif défini.
Kotlin
privatevalfitnessOptions:FitnessOptionsbylazy{FitnessOptions.builder().addDataType(DataType.TYPE_HEART_POINTS,FitnessOptions.ACCESS_READ).build()}privatevalgoalsReadRequest:GoalsReadRequestbylazy{GoalsReadRequest.Builder().addDataType(DataType.TYPE_HEART_POINTS).build()}privatefungetGoogleAccount():GoogleSignInAccount=GoogleSignIn.getAccountForExtension(requireContext(),fitnessOptions)privatefunreadGoals(){Fitness.getGoalsClient(requireContext(),getGoogleAccount()).readCurrentGoals(goalsReadRequest).addOnSuccessListener{goals->
// There should be at most one heart points goal currently.goals.firstOrNull()?.apply{// What is the value of the goalvalgoalValue=metricObjective.valueLog.i(TAG,"Goal value: $goalValue")// How is the goal measured?Log.i(TAG,"Objective: $objective")// How often does the goal repeat?Log.i(TAG,"Recurrence: $recurrenceDetails")}}}privatevalGoal.objective:Stringget()=when(objectiveType){OBJECTIVE_TYPE_DURATION->
"Duration (s): ${durationObjective.getDuration(TimeUnit.SECONDS)}"OBJECTIVE_TYPE_FREQUENCY->
"Frequency : ${frequencyObjective.frequency}"OBJECTIVE_TYPE_METRIC->
"Metric : ${metricObjective.dataTypeName} - ${metricObjective.value}"else->"Unknown objective"}privatevalGoal.recurrenceDetails:Stringget()=recurrence?.let{valperiod=when(it.unit){Recurrence.UNIT_DAY->"days"Recurrence.UNIT_WEEK->"weeks"Recurrence.UNIT_MONTH->"months"else->"Unknown"}"Every ${recurrence!!.count}$period"}?:"Does not repeat"
Java
privatefinalFitnessOptionsfitnessOptions=FitnessOptions.builder().addDataType(DataType.TYPE_HEART_POINTS,FitnessOptions.ACCESS_READ).build();privatefinalGoalsReadRequestgoalsReadRequest=newGoalsReadRequest.Builder().addDataType(DataType.TYPE_HEART_POINTS).build();privateGoogleSignInAccountgetGoogleAccount(){GoogleSignIn.getAccountForExtension(getApplicationContext(),fitnessOptions);}privatevoidreadGoals(){Fitness.getGoalsClient(getApplicationContext(),getGoogleAccount()).readCurrentGoals(goalsReadRequest).addOnSuccessListener(goals->{// There should be at most one heart points goal currently.Optional<Goal>optionalGoal=goals.stream().findFirst();if(optionalGoal.isPresent()){// What is the value of the goaldoublegoalValue=optionalGoal.get().getMetricObjective().getValue();Log.i(TAG,"Goal value: $goalValue");// How is the goal measured?Log.i(TAG,"Objective: ${getObjective(optionalGoal.get())}");// How often does the goal repeat?Log.i(TAG,"Recurrence: ${getRecurrenceDetails(optionalGoal.get())}");}});}privateStringgetObjective(Goalgoal){switch(goal.getObjectiveType()){caseOBJECTIVE_TYPE_DURATION:return"Duration (s): ${goal.getDurationObjective().getDuration(TimeUnit.SECONDS)}";caseOBJECTIVE_TYPE_FREQUENCY:return"Frequency : ${goal.getFrequencyObjective().getFrequency()}";caseOBJECTIVE_TYPE_METRIC:return"Metric : ${goal.getMetricObjective().getDataTypeName()} - ${goal.getMetricObjective().getValue()}";default:return"Unknown objective";}}privateStringgetRecurrenceDetails(Goalgoal){Goal.Recurrencerecurrence=goal.getRecurrence();if(recurrence==null){return"Does not repeat";}StringBuilderrecurrenceMessage=newStringBuilder("Every ${recurrence.getCount()}");switch(recurrence.getUnit()){caseUNIT_DAY:recurrenceMessage.append("days");break;caseUNIT_WEEK:recurrenceMessage.append("weeks");break;caseUNIT_MONTH:recurrenceMessage.append("months");break;default:recurrenceMessage.delete(0,recurrenceMessage.length());recurrenceMessage.append("Unknown");break;}returnrecurrenceMessage.toString();}
Vérifier la progression
Une fois l'objectif de points cardio atteint, vous pouvez utiliser
HistoryClient pour vérifier sa progression. Les éléments suivants :
exemple montre comment vérifier le nombre de Points cardio d'un utilisateur.
Si vous divisez le total de l'exemple Check progress (Vérifier la progression)
par la cible dans l'exemple de lecture d'un objectif, vous pouvez calculer le
progrès vers l’objectif, sous forme de pourcentage.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/31 (UTC).
[null,null,["Dernière mise à jour le 2025/08/31 (UTC)."],[[["\u003cp\u003eGoogle Fit goals, encompassing Steps and Heart Points, motivate users to maintain daily activity.\u003c/p\u003e\n"],["\u003cp\u003eYour app can utilize the \u003ccode\u003eGoalsClient\u003c/code\u003e and \u003ccode\u003eHistoryClient\u003c/code\u003e to access user goals and activity history, fostering a more personalized user experience.\u003c/p\u003e\n"],["\u003cp\u003eBy integrating with Google Fit goals, your app can seamlessly provide users with consistent progress updates and encourage them to achieve their fitness objectives.\u003c/p\u003e\n"],["\u003cp\u003eCode examples in Kotlin and Java demonstrate how to read user goals, track progress, and calculate the percentage of goal completion.\u003c/p\u003e\n"]]],[],null,["# Work with fitness goals\n\nGoals are targets in the [Google Fit\napp](https://play.google.com/store/apps/details?id=com.google.android.apps.fitness)\nthat users can set for themselves. They help motivate users to stay active every\nday. From within their profile, users can adjust how many Steps and\n[Heart Points](https://support.google.com/fit/answer/7619539) they want to aim\nfor each day. The Fit platform records their goals and tracks their daily\nactivity against these.\n\nCreate a better user experience with goals\n------------------------------------------\n\nYour app can read a user's goals to keep track of their personal targets. This\ncan help create a more engaging experience. To start, use the\n[`GoalsClient`](/android/reference/com/google/android/gms/fitness/GoalsClient)\nclient to read a user's Steps and Heart Points goals. Then use the\n[`HistoryClient`](/android/reference/com/google/android/gms/fitness/HistoryClient)\nclient to check how close they are to those goals.\n\nUse this data to help users switch between Google Fit and your app\nseamlessly, and get consistent information across both apps about their progress\ntowards their fitness goals.\n\nMotivate users to reach their daily goals by giving them updates and insights\nrelated to their progress.\n\nRead a goal\n-----------\n\nThe following example shows how to create a new Fitness client and get the\nuser's Heart Points goal, or `null` if they don't have a goal set. \n\n### Kotlin\n\n```kotlin\nprivate val fitnessOptions: FitnessOptions by lazy {\n FitnessOptions.builder()\n .addDataType(DataType.TYPE_HEART_POINTS, FitnessOptions.ACCESS_READ)\n .build()\n}\n\nprivate val goalsReadRequest: GoalsReadRequest by lazy {\n GoalsReadRequest.Builder()\n .addDataType(DataType.TYPE_HEART_POINTS)\n .build()\n}\n\nprivate fun getGoogleAccount(): GoogleSignInAccount =\n GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions)\n\n\nprivate fun readGoals() {\n Fitness.getGoalsClient(requireContext(), getGoogleAccount())\n .readCurrentGoals(goalsReadRequest)\n .addOnSuccessListener { goals -\u003e\n // There should be at most one heart points goal currently.\n goals.firstOrNull()?.apply {\n // What is the value of the goal\n val goalValue = metricObjective.value\n Log.i(TAG, \"Goal value: $goalValue\")\n\n // How is the goal measured?\n Log.i(TAG, \"Objective: $objective\")\n\n // How often does the goal repeat?\n Log.i(TAG, \"Recurrence: $recurrenceDetails\")\n }\n }\n}\n\nprivate val Goal.objective: String\n get() = when (objectiveType) {\n OBJECTIVE_TYPE_DURATION -\u003e\n \"Duration (s): ${durationObjective.getDuration(TimeUnit.SECONDS)}\"\n OBJECTIVE_TYPE_FREQUENCY -\u003e\n \"Frequency : ${frequencyObjective.frequency}\"\n OBJECTIVE_TYPE_METRIC -\u003e\n \"Metric : ${metricObjective.dataTypeName} - ${metricObjective.value}\"\n else -\u003e \"Unknown objective\"\n }\n\nprivate val Goal.recurrenceDetails: String\n get() = recurrence?.let {\n val period = when (it.unit) {\n Recurrence.UNIT_DAY -\u003e \"days\"\n Recurrence.UNIT_WEEK -\u003e \"weeks\"\n Recurrence.UNIT_MONTH -\u003e \"months\"\n else -\u003e \"Unknown\"\n }\n \"Every ${recurrence!!.count} $period\"\n } ?: \"Does not repeat\"\n```\n\n### Java\n\n```java\nprivate final FitnessOptions fitnessOptions = FitnessOptions.builder()\n .addDataType(DataType.TYPE_HEART_POINTS, FitnessOptions.ACCESS_READ)\n .build();\n\n\nprivate final GoalsReadRequest goalsReadRequest = new GoalsReadRequest.Builder()\n .addDataType(DataType.TYPE_HEART_POINTS)\n .build();\n\nprivate GoogleSignInAccount getGoogleAccount() {\n GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions);\n}\n\n\nprivate void readGoals() {\n Fitness.getGoalsClient(getApplicationContext(), getGoogleAccount())\n .readCurrentGoals(goalsReadRequest)\n .addOnSuccessListener(goals -\u003e {\n // There should be at most one heart points goal currently.\n Optional\u003cGoal\u003e optionalGoal = goals.stream().findFirst();\n if (optionalGoal.isPresent()) {\n // What is the value of the goal\n double goalValue = optionalGoal.get().getMetricObjective().getValue();\n Log.i(TAG, \"Goal value: $goalValue\");\n\n // How is the goal measured?\n Log.i(TAG, \"Objective: ${getObjective(optionalGoal.get())}\");\n\n // How often does the goal repeat?\n Log.i(TAG, \"Recurrence: ${getRecurrenceDetails(optionalGoal.get())}\");\n }\n\n });\n}\n\nprivate String getObjective(Goal goal) {\n switch (goal.getObjectiveType()) {\n case OBJECTIVE_TYPE_DURATION:\n return \"Duration (s): ${goal.getDurationObjective().getDuration(TimeUnit.SECONDS)}\";\n case OBJECTIVE_TYPE_FREQUENCY:\n return \"Frequency : ${goal.getFrequencyObjective().getFrequency()}\";\n case OBJECTIVE_TYPE_METRIC:\n return \"Metric : ${goal.getMetricObjective().getDataTypeName()} - ${goal.getMetricObjective().getValue()}\";\n default:\n return \"Unknown objective\";\n }\n}\n\nprivate String getRecurrenceDetails(Goal goal) {\n Goal.Recurrence recurrence = goal.getRecurrence();\n if (recurrence == null) {\n return \"Does not repeat\";\n }\n\n StringBuilder recurrenceMessage = new StringBuilder(\"Every ${recurrence.getCount()}\");\n\n switch (recurrence.getUnit()) {\n case UNIT_DAY:\n recurrenceMessage.append(\"days\");\n break;\n case UNIT_WEEK:\n recurrenceMessage.append(\"weeks\");\n break;\n case UNIT_MONTH:\n recurrenceMessage.append(\"months\");\n break;\n default:\n recurrenceMessage.delete(0, recurrenceMessage.length());\n recurrenceMessage.append(\"Unknown\");\n break;\n }\n\n return recurrenceMessage.toString();\n}\n```\n\nCheck progress\n--------------\n\nAfter you have the user's Heart Points goal, you can use the\n[`HistoryClient`](/fit/android/history) to check their progress. The following\nexample shows how to check how many Heart Points the user has.\n**Note:** The time range for a goal is calculated based on its frequency. For example, for a daily goal, the current time is used to calculate when the day starts and ends. Where the goal is a daily goal, the code can be simplified by using [`HistoryClient.readDailyTotal()`](/android/reference/com/google/android/gms/fitness/HistoryClient#public-taskdataset-readdailytotal-datatype-datatype) instead of [`HistoryClient.readData()`](/android/reference/com/google/android/gms/fitness/HistoryClient#public-taskdatareadresponse-readdata-datareadrequest-request). This example only uses `HistoryClient.readData()` to show how Goal objects can be used to identify the start and end times of the current recurrence when you query for progress. \n\n### Kotlin\n\n```kotlin\nval current = Calendar.getInstance()\nval request = DataReadRequest.Builder()\n .read(DataType.TYPE_HEART_POINTS)\n .setTimeRange(\n goal.getStartTime(current, TimeUnit.NANOSECONDS),\n goal.getEndTime(current, TimeUnit.NANOSECONDS),\n TimeUnit.NANOSECONDS\n )\n .build()\n\nFitness.getHistoryClient(requireContext(), getGoogleAccount())\n .readData(request)\n .addOnSuccessListener { response -\u003e\n val heartPointsSet = response.dataSets.first()\n val totalHeartPoints = heartPointsSet.dataPoints.sumBy {\n it.getValue(Field.FIELD_INTENSITY).asFloat().toInt()\n }\n Log.i(TAG, \"Total heart points: $totalHeartPoints\")\n }\n```\n\n### Java\n\n```java\nCalendar current = Calendar.getInstance();\nDataReadRequest request = new DataReadRequest.Builder()\n .read(DataType.TYPE_HEART_POINTS)\n .setTimeRange(\n goal.getStartTime(current, TimeUnit.NANOSECONDS),\n goal.getEndTime(current, TimeUnit.NANOSECONDS),\n TimeUnit.NANOSECONDS\n )\n .build();\n\n\nFitness.getHistoryClient(getApplicationContext(), getGoogleAccount())\n .readData(request)\n .addOnSuccessListener(response -\u003e {\n Optional\u003cDataSet\u003e heartPointsSet = response.getDataSets().stream().findFirst();\n if (heartPointsSet.isPresent()) {\n int totalHeartPoints = 0;\n for (DataPoint dp : heartPointsSet.get().getDataPoints()) {\n totalHeartPoints += (int) dp.getValue(Field.FIELD_INTENSITY).asFloat();\n }\n\n Log.i(TAG, \"Total heart points: $totalHeartPoints\");\n }\n });\n```\n\nCalculate progress as a percentage\n----------------------------------\n\nIf you divide the total from the [check progress](#check-progress) example\nby the target in the [read a goal](#read-a-goal) example, you can calculate the\nprogress towards the goal as a percentage. \n\n### Kotlin\n\n```kotlin\nprivate fun calculateProgressPercentage(goal: Goal, response: DataReadResponse): Double {\n val goalValue = goal.metricObjective.value\n val currentTotal = response.dataSets.first().dataPoints.sumBy {\n it.getValue(Field.FIELD_INTENSITY).asFloat().toInt()\n }\n\n return (currentTotal.div(goalValue)).times(100.0)\n}\n```\n\n### Java\n\n```java\nprivate double calculateProgressPercentage(Goal goal, DataReadResponse response) {\n double goalValue = goal.getMetricObjective().getValue();\n Optional\u003cDataSet\u003e firstDataSet = response.getDataSets().stream().findFirst();\n if (!(firstDataSet.isPresent())) {\n return NaN;\n }\n double currentTotal = 0;\n for (DataPoint dp : firstDataSet.get().getDataPoints()) {\n currentTotal += (int)dp.getValue(Field.FIELD_INTENSITY).asFloat();\n }\n\n return (currentTotal / goalValue) * 100.0;\n}\n```"]]