Разработка приложения для трекинга кардиотренировок

Сегодня я хотел бы рассказать вам историю из моего прошлого. Пару лет назад, перед тем как окончить университет и начать работать, у меня было множество свободного времени для того чтобы ходить в тренажерный зал.

Пробуя большое количество приложений я сделал для себя вывод, что во многих приложениях все крутые функции доступны только за отдельную плату. В то время как все чего хотел я, это всего лишь иметь возможность записывать свои упражнения и показывать график прогресса. Это вдохновило меня на то, чтобы начать использовать мое свободное время для разработки Android приложения.

Приложение которое я начал разрабатывать я назвал Gymify. В то время это было простое приложение со списком, где пользователь мог добавлять упражнения и отмечать их галочкой.

Однажды мое свободное время подошло к концу. Я закончил университет и стал слишком занят, чтобы уделять достаточно времени разработке приложения. Тогда я постарался вернуть себя к работе. Попытался выработать привычку кодить каждый день хотя бы по 30 минут. Это позволило мне лучше сосредоточиться на работе над приложением и забыть о рабочей рутине. Одним из улучшений, которые я добавил в приложение была возможность хранения данных о кардиотренировках. Для этого мне потребовалось разработать функционал отслеживания расстояния, времени и количества шагов. Это заставило меня задуматься о том, как к примеру посчитать шаги, если пользователь предпочел использовать беговую дорожку вместо того чтобы бегать по улице? GPS в данной ситуации никак не поможет. Так как объект не будет передвигаться в пространстве. В этой статье я постараюсь описать то, как может быть использована простая библиотека для подсчета количества шагов. А также покажу как я использовал эту информацию для того чтобы примерно определить дистанцию бега без использования GPS.

Трекаем количество шагов используя SensorEventListener

Вы вероятно думаете что подсчет количества шагов с достаточно высокой точностью будет сложным в реализации? Но Google не могли оставить нас один на один с данной проблемой. Они разработали библиотеку SensorEventListener. Просто реализуя два переопределенных метода onSensorChanged и onAccuracyChanged вы можете начать считать количество шагов.

Для начала необходимо инициализировать SensorManager

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.app.Activity;
public class StepActivity extends Activity implements SensorEventListener{
	SensorManager sManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
	Sensor stepSensor = sManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
	...
}

Sensor инициализирован как TYPE_STEP_DETECTOR. Это означает что он будет записывать шаги. SensorManager будет использоваться для регистрации слушателя и отписки в момент, когда Activity остановлено. Мы можем реализовать все это переопределив методы onResume и onPause.

@Override
    protected void onResume() {
        super.onResume();
        sManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_FASTEST);
    }
    @Override
    protected void onStop() {
        super.onStop();
        sManager.unregisterListener(this, stepSensor);
    }

Теперь после инициализации Sensor и SensorManager мы можем приступить к реализации методов onSensorChanged который получает событие SensorEvent в момент когда тип датчика изменился. В нашем случае мы используем TYPE_STEP_DETECTOR.

private long steps = 0;
	@Override
    public void onSensorChanged(SensorEvent event) {
        Sensor sensor = event.sensor;
        float[] values = event.values;
        int value = -1;
        if (values.length > 0) {
            value = (int) values[0];
        }
        if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
            steps++;
        }
    }

Все что я делаю в этом участке кода, просто инкремент переменной в момент когда датчик реагирует на шаг. В этот момент к примеру вы можете обновлять TextView в реальном времени.

Измерение расстояния

После того как у нас есть возможность записывать шаги, мы хотим использовать эти данные для расчетов того, как много кто — то прошел/пробежал. Как я говорил ранее, человек использующий приложение может не бежать по улице. В этом случае GPS никак нам не поможет. Вместо этого мы можем использовать среднюю длину шага вместе с количеством шагов и это даст нам возможность подсчитать приблизительную дистанцию.

Здесь есть множество вариантов, как именно определить длину шага. Вы можете измерить это самостоятельно используя простую формулу. Умножить свой рост в сантиметрах на 0,415 для мужчин и 0,413 для женщин. Если вы не слишком озабочены крайней точностью ваших измерений то вы можете использовать средние значения. Такие как 78 см для мужчин и 70 см для женщин. Я нашел это по запросу в Google на первых страницах поисковой выдачи.

К примеру я планирую использовать значение шага равное 78 см так как я мужчина.

Когда мы получим количество шагов умноженное на 78 и затем разделим их на 100000, то получим расстояние в километрах. Например я пробежал медленным бегом 6.6 км. В Google Fit это равно 8405 шагам, что получается после вычисления (8,504 * 78) / 100000 = 6.633. Что черт возьми очень близко к реальности!

//function to determine the distance run in kilometers using average step length for men and number of steps
public float getDistanceRun(long steps){
    float distance = (float)(steps*78)/(float)100000;
    return distance;
}

Надеюсь вы нашли эту статью полезной для себя. Эта тема для меня была крайне привлекательной, чтобы начать в ней разбираться. Вы можете использовать мои наработки, пойти чуть чуть дальше. Посчитать к примеру количество калорий затраченных на активность или то, с какой интенсивностью пользователь будет терять вес.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: