ফিটনেস লক্ষ্য নিয়ে কাজ করুন

লক্ষ্যগুলি হল Google Fit অ্যাপের লক্ষ্য যা ব্যবহারকারীরা নিজেদের জন্য সেট করতে পারে৷ তারা ব্যবহারকারীদের প্রতিদিন সক্রিয় থাকতে অনুপ্রাণিত করতে সহায়তা করে। তাদের প্রোফাইলের মধ্যে থেকে, ব্যবহারকারীরা প্রতিদিন কতগুলি পদক্ষেপ এবং হার্ট পয়েন্ট লক্ষ্য করতে চান তা সামঞ্জস্য করতে পারেন। Fit প্ল্যাটফর্ম তাদের লক্ষ্য রেকর্ড করে এবং এর বিরুদ্ধে তাদের দৈনন্দিন কার্যকলাপ ট্র্যাক করে।

লক্ষ্য সহ একটি ভাল ব্যবহারকারীর অভিজ্ঞতা তৈরি করুন

আপনার অ্যাপ তাদের ব্যক্তিগত লক্ষ্য ট্র্যাক রাখতে একটি ব্যবহারকারীর লক্ষ্য পড়তে পারে. এটি আরও আকর্ষক অভিজ্ঞতা তৈরি করতে সাহায্য করতে পারে। শুরু করতে, ব্যবহারকারীর পদক্ষেপ এবং হার্ট পয়েন্ট লক্ষ্যগুলি পড়তে GoalsClient ক্লায়েন্ট ব্যবহার করুন। তারপরে HistoryClient ক্লায়েন্ট ব্যবহার করুন তারা সেই লক্ষ্যগুলির কতটা কাছাকাছি তা পরীক্ষা করতে।

ব্যবহারকারীদের Google ফিট এবং আপনার অ্যাপের মধ্যে নির্বিঘ্নে স্যুইচ করতে এবং তাদের ফিটনেস লক্ষ্যে তাদের অগ্রগতি সম্পর্কে উভয় অ্যাপ জুড়ে সামঞ্জস্যপূর্ণ তথ্য পেতে এই ডেটা ব্যবহার করুন।

ব্যবহারকারীদের তাদের অগ্রগতি সম্পর্কিত আপডেট এবং অন্তর্দৃষ্টি দিয়ে তাদের দৈনন্দিন লক্ষ্যে পৌঁছাতে অনুপ্রাণিত করুন।

একটি লক্ষ্য পড়ুন

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি নতুন ফিটনেস ক্লায়েন্ট তৈরি করতে হয় এবং ব্যবহারকারীর হার্ট পয়েন্টের লক্ষ্য পেতে হয়, বা তাদের লক্ষ্য সেট না থাকলে null

কোটলিন

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"

জাভা

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 ব্যবহার করতে পারেন। ব্যবহারকারীর কতগুলি হার্ট পয়েন্ট আছে তা কীভাবে পরীক্ষা করবেন তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

কোটলিন

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")
    }

জাভা

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");
            }
        });

শতাংশ হিসাবে অগ্রগতি গণনা করুন

যদি আপনি একটি লক্ষ্য উদাহরণ পড়ুন লক্ষ্যের দ্বারা চেক অগ্রগতি উদাহরণ থেকে মোট ভাগ করেন, আপনি শতাংশ হিসাবে লক্ষ্যের দিকে অগ্রগতি গণনা করতে পারেন।

কোটলিন

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)
}

জাভা

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;
}