¿Cómo crear una aplicación de conteo de pasos en Android Studio?

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.

Publicación traducida automáticamente

Artículo escrito por kunalmali y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *