Muchos de nosotros hemos usado el contador de pasos en nuestros teléfonos mientras salíamos a caminar o correr. Cuenta el total de pasos que ha caminado el usuario y lo muestra en pantalla. El otro nombre para el contador de pasos es podómetro. Pero, ¿alguna vez has pensado en cómo una aplicación puede contar nuestros pasos? ¿Cuál es la codificación detrás del funcionamiento de esta aplicación? Encontremos la respuesta a estas preguntas haciendo una.
¿Qué vamos a construir en este artículo?
Construiremos una aplicación que muestre los pasos que ha dado el usuario. Usaremos TextView en nuestro archivo XML que mostrará el conteo de pasos y un encabezado en la pantalla, y un ImageView para mostrar el círculo alrededor del texto. Cuando el usuario toque durante mucho tiempo en la pantalla, se restablecerá a 0. A continuación se proporciona un GIF de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar la aplicación utilizando el lenguaje Kotlin .
Implementación paso a paso
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación.
Paso 2: trabajar con AndroidManifest.xml para obtener el permiso del usuario
Vaya a app/manifests/AndroidManifest.xml y escriba el código que se proporciona a continuación en el manifiesto para obtener el permiso del usuario para el Reconocimiento de actividad:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
Paso 3: agregar un archivo de recursos dibujable
Vaya a app/res/drawable y haga clic con el botón derecho en la carpeta dibujable y vaya a Nuevo/Archivo de recursos dibujable .
Nombre el archivo como el círculo y con la configuración predeterminada, haga clic en el botón Aceptar.
Paso 4: trabajar con un archivo de recursos dibujable
En este paso, agregaremos el código al archivo de recursos. Estamos haciendo un trazo circular para usarlo, en ImageView en el archivo XML principal de la aplicación. A continuación se muestra el código para el archivo de recursos circle.xml que creamos en el paso anterior.
XML
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <!-- creates an oval shape --> <shape android:shape="oval"> <!-- giving the color and width to the stroke --> <stroke android:color="#0F9D58" android:width="3dp"/> <!-- giving the width and the height to the shape --> <size android:width="120dp" android:height="120dp"/> </shape> </item> </selector>
Paso 5: trabajar con el archivo activity_main.xml
Navegue a app/res/layout/activity_main.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!--Text View for the "Steps" displayed--> <TextView android:id="@+id/steps" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="290dp" android:text="Steps" android:textSize="45sp" android:textColor="@color/black" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!--Text View for the step count--> <TextView android:id="@+id/tv_stepsTaken" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="30dp" android:text="0" android:textSize="37sp" android:textColor="@color/black" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/steps" /> <!--Image View for the circle--> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="264dp" android:background="@drawable/circle" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.497" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Paso 6: trabajar con el archivo MainActivity.kt
Vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.
Kotlin
import android.content.Context import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.TextView import android.widget.Toast class MainActivity : AppCompatActivity(), SensorEventListener { // Added SensorEventListener the MainActivity class // Implement all the members in the class MainActivity // after adding SensorEventListener // we have assigned sensorManger to nullable private var sensorManager: SensorManager? = null // Creating a variable which will give the running status // and initially given the boolean value as false private var running = false // Creating a variable which will counts total steps // and it has been given the value of 0 float private var totalSteps = 0f // Creating a variable which counts previous total // steps and it has also been given the value of 0 float private var previousTotalSteps = 0f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loadData() resetSteps() // Adding a context of SENSOR_SERVICE aas Sensor Manager sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onResume() { super.onResume() running = true // Returns the number of steps taken by the user since the last reboot while activated // This sensor requires permission android.permission.ACTIVITY_RECOGNITION. // So don't forget to add the following permission in AndroidManifest.xml present in manifest folder of the app. val stepSensor = sensorManager?.getDefaultSensor(Sensor.TYPE_STEP_COUNTER) if (stepSensor == null) { // This will give a toast message to the user if there is no sensor in the device Toast.makeText(this, "No sensor detected on this device", Toast.LENGTH_SHORT).show() } else { // Rate suitable for the user interface sensorManager?.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_UI) } } override fun onSensorChanged(event: SensorEvent?) { // Calling the TextView that we made in activity_main.xml // by the id given to that TextView var tv_stepsTaken = findViewById<TextView>(R.id.tv_stepsTaken) if (running) { totalSteps = event!!.values[0] // Current steps are calculated by taking the difference of total steps // and previous steps val currentSteps = totalSteps.toInt() - previousTotalSteps.toInt() // It will show the current steps to the user tv_stepsTaken.text = ("$currentSteps") } } fun resetSteps() { var tv_stepsTaken = findViewById<TextView>(R.id.tv_stepsTaken) tv_stepsTaken.setOnClickListener { // This will give a toast message if the user want to reset the steps Toast.makeText(this, "Long tap to reset steps", Toast.LENGTH_SHORT).show() } tv_stepsTaken.setOnLongClickListener { previousTotalSteps = totalSteps // When the user will click long tap on the screen, // the steps will be reset to 0 tv_stepsTaken.text = 0.toString() // This will save the data saveData() true } } private fun saveData() { // Shared Preferences will allow us to save // and retrieve data in the form of key,value pair. // In this function we will save data val sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE) val editor = sharedPreferences.edit() editor.putFloat("key1", previousTotalSteps) editor.apply() } private fun loadData() { // In this function we will retrieve data val sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE) val savedNumber = sharedPreferences.getFloat("key1", 0f) // Log.d is used for debugging purposes Log.d("MainActivity", "$savedNumber") previousTotalSteps = savedNumber } override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { // We do not have to write anything in this function for this app } }
Ahora ejecute la aplicación y vea el resultado del código a continuación:
Producción:
Note: We have to allow the permission required for the app by going to app settings and then enabling it. It will not count the steps in the emulator, you have to use a real android device to test it.