फ़िटनेस के लक्ष्यों के साथ काम करें

लक्ष्य Google Fit ऐप्लिकेशन में ऐसे टारगेट होते हैं जिन्हें उपयोगकर्ता अपने लिए सेट कर सकते हैं. वे उपयोगकर्ताओं को हर दिन सक्रिय रहने के लिए प्रेरित करने में मदद करते हैं. उपयोगकर्ता अपनी प्रोफ़ाइल में, यह तय कर सकते हैं कि हर दिन वे कितने कदम और हार्ट पॉइंट पाना चाहते हैं. Fit प्लेटफ़ॉर्म उनके लक्ष्यों को रिकॉर्ड करता है और उनके लिए उनकी दैनिक गतिविधि को ट्रैक करता है.

लक्ष्यों के साथ एक बेहतर उपयोगकर्ता अनुभव बनाएं

आपका ऐप्लिकेशन किसी उपयोगकर्ता के निजी टारगेट पर नज़र रखने के लिए, उसके लक्ष्यों को पढ़ सकता है. इसकी मदद से, कॉन्टेंट को ज़्यादा दिलचस्प बनाया जा सकता है. शुरुआत करने के लिए, उपयोगकर्ता के कदमों और 'हार्ट पॉइंट' के लक्ष्यों को पढ़ने के लिए, GoalsClient क्लाइंट का इस्तेमाल करें. इसके बाद, HistoryClient क्लाइंट का इस्तेमाल करके पता लगाएं कि वे उन लक्ष्यों के कितने करीब हैं.

इस डेटा का इस्तेमाल Google Fit और अपने ऐप्लिकेशन के बीच आसानी से स्विच करने में उपयोगकर्ताओं की मदद करने के लिए करें. साथ ही, दोनों ऐप्लिकेशन पर फ़िटनेस के लक्ष्यों को पूरा करने की उनकी प्रोग्रेस के बारे में लगातार जानकारी पाएं.

उपयोगकर्ताओं को उनकी प्रोग्रेस से जुड़े अपडेट और इनसाइट देकर, उन्हें उनके रोज़ के लक्ष्यों को पूरा करने के लिए प्रेरित करें.

किसी लक्ष्य को पढ़ना

नीचे दिए गए उदाहरण में, नया फ़िटनेस क्लाइंट बनाने और उपयोगकर्ता के'हार्ट पॉइंट' का लक्ष्य पाने का तरीका बताया गया है. इसके अलावा, अगर उन्होंने कोई लक्ष्य सेट नहीं किया है, तो null के बारे में भी बताया गया है.

Kotlin

private val fitnessOptions: FitnessOptions by lazy {
    FitnessOptions.builder()
        .addDataType(DataType.TYPE_HEART_POINTS, FitnessOptions.ACCESS_READ)
        .build()
}

private val goalsReadRequest: GoalsReadRequest by lazy {
    GoalsReadRequest.Builder()
        .addDataType(DataType.TYPE_HEART_POINTS)
        .build()
}

private fun getGoogleAccount(): GoogleSignInAccount =
    GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions)


private fun readGoals() {
    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 goal
                val goalValue = metricObjective.value
                Log.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")
            }
        }
}

private val Goal.objective: String
    get() = 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"
    }

private val Goal.recurrenceDetails: String
    get() = recurrence?.let {
        val period = 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

private final FitnessOptions fitnessOptions = FitnessOptions.builder()
            .addDataType(DataType.TYPE_HEART_POINTS, FitnessOptions.ACCESS_READ)
            .build();


private final GoalsReadRequest goalsReadRequest = new GoalsReadRequest.Builder()
            .addDataType(DataType.TYPE_HEART_POINTS)
            .build();

private GoogleSignInAccount getGoogleAccount() {
    GoogleSignIn.getAccountForExtension(getApplicationContext(), fitnessOptions);
}


private void readGoals() {
    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 goal
                    double goalValue = 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())}");
                }

    });
}

private String getObjective(Goal goal) {
    switch (goal.getObjectiveType()) {
        case OBJECTIVE_TYPE_DURATION:
            return "Duration (s): ${goal.getDurationObjective().getDuration(TimeUnit.SECONDS)}";
        case OBJECTIVE_TYPE_FREQUENCY:
            return "Frequency : ${goal.getFrequencyObjective().getFrequency()}";
        case OBJECTIVE_TYPE_METRIC:
            return "Metric : ${goal.getMetricObjective().getDataTypeName()} - ${goal.getMetricObjective().getValue()}";
        default:
            return "Unknown objective";
    }
}

private String getRecurrenceDetails(Goal goal) {
    Goal.Recurrence recurrence = goal.getRecurrence();
    if (recurrence == null) {
        return "Does not repeat";
    }

    StringBuilder recurrenceMessage = new StringBuilder("Every ${recurrence.getCount()}");

    switch (recurrence.getUnit()) {
        case UNIT_DAY:
            recurrenceMessage.append("days");
            break;
        case UNIT_WEEK:
            recurrenceMessage.append("weeks");
            break;
        case UNIT_MONTH:
            recurrenceMessage.append("months");
            break;
        default:
            recurrenceMessage.delete(0, recurrenceMessage.length());
            recurrenceMessage.append("Unknown");
            break;
    }

    return recurrenceMessage.toString();
}

प्रोग्रेस देखें

उपयोगकर्ता के 'हार्ट पॉइंट' का लक्ष्य हासिल करने के बाद, आप HistoryClient का इस्तेमाल करके उनकी प्रोग्रेस देख सकते हैं. यहां दिए गए उदाहरण में, यह पता लगाने का तरीका बताया गया है कि किसी व्यक्ति के पास कितने 'हार्ट पॉइंट' हैं.

Kotlin

val current = Calendar.getInstance()
val request = DataReadRequest.Builder()
    .read(DataType.TYPE_HEART_POINTS)
    .setTimeRange(
        goal.getStartTime(current, TimeUnit.NANOSECONDS),
        goal.getEndTime(current, TimeUnit.NANOSECONDS),
        TimeUnit.NANOSECONDS
    )
    .build()

Fitness.getHistoryClient(requireContext(), getGoogleAccount())
    .readData(request)
    .addOnSuccessListener { response ->
        val heartPointsSet = response.dataSets.first()
        val totalHeartPoints = heartPointsSet.dataPoints.sumBy {
            it.getValue(Field.FIELD_INTENSITY).asFloat().toInt()
        }
        Log.i(TAG, "Total heart points: $totalHeartPoints")
    }

Java

Calendar current = Calendar.getInstance();
DataReadRequest request = new DataReadRequest.Builder()
        .read(DataType.TYPE_HEART_POINTS)
        .setTimeRange(
                goal.getStartTime(current, TimeUnit.NANOSECONDS),
                goal.getEndTime(current, TimeUnit.NANOSECONDS),
                TimeUnit.NANOSECONDS
        )
        .build();


Fitness.getHistoryClient(getApplicationContext(), getGoogleAccount())
        .readData(request)
        .addOnSuccessListener(response -> {
            Optional<DataSet> heartPointsSet = response.getDataSets().stream().findFirst();
            if (heartPointsSet.isPresent()) {
                int totalHeartPoints = 0;
                for (DataPoint dp : heartPointsSet.get().getDataPoints()) {
                    totalHeartPoints += (int) dp.getValue(Field.FIELD_INTENSITY).asFloat();
                }

                Log.i(TAG, "Total heart points: $totalHeartPoints");
            }
        });

प्रतिशत के रूप में प्रोग्रेस की गणना करना

अगर जांच की प्रोग्रेस के उदाहरण से कुल संख्या को लक्ष्य पढ़ें के उदाहरण में दिए गए टारगेट से भाग दिया जाता है, तो लक्ष्य की प्रोग्रेस का हिसाब प्रतिशत के रूप में लगाया जा सकता है.

Kotlin

private fun calculateProgressPercentage(goal: Goal, response: DataReadResponse): Double {
    val goalValue = goal.metricObjective.value
    val currentTotal = response.dataSets.first().dataPoints.sumBy {
        it.getValue(Field.FIELD_INTENSITY).asFloat().toInt()
    }

    return (currentTotal.div(goalValue)).times(100.0)
}

Java

private double calculateProgressPercentage(Goal goal, DataReadResponse response) {
    double goalValue = goal.getMetricObjective().getValue();
    Optional<DataSet> firstDataSet = response.getDataSets().stream().findFirst();
    if (!(firstDataSet.isPresent())) {
        return NaN;
    }
    double currentTotal = 0;
    for (DataPoint dp : firstDataSet.get().getDataPoints()) {
        currentTotal += (int)dp.getValue(Field.FIELD_INTENSITY).asFloat();
    }

    return (currentTotal / goalValue) * 100.0;
}