Cómo contar la velocidad basada en pasos

Tengo una aplicación de contador de pasos en la que estoy ejecutando un servicio que cuenta pasos tomados y luego envía una difusión al fragmento que se actualiza a continuación en el fragmento. El recuento de pasos está funcionando bien, pero quiero calcular la velocidad basada en los pasos. Esto es lo que estoy tratando ahora mismo.

El receptor para obtener el número de pasos:

receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int steps = intent.getIntExtra(StepCounterService.STEP_INCREMENT_KEY, 0); if (firstStepTime.equals("0")) { firstStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY); } else if (secondStepTime.equals("0")) { secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY); } else { firstStepTime = secondStepTime; secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY); } updateAllUI(steps); } }; 

Así que lo que estoy haciendo es tan pronto como empiezo a obtener pasos, veo si la variable firstStepTime está vacía. Si es así, ahorro el tiempo en la variable firstStepTime . En el siguiente paso veo si secondStepTime está vacío, y si lo es, ahorro ese tiempo en la variable secondStepTime . Ahora para los pasos siguientes ambos se ponen al día.

 public void updateAllUI(int numberOfSteps) { if (!(firstStepTime.equals("0")) && !(secondStepTime.equals("0"))) { try { Calendar c = Calendar.getInstance(); SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS"); timeDifference = timeFormat.parse(secondStepTime).getTime() - timeFormat.parse(firstStepTime).getTime(); speed = (float) ((0.0254 / (timeDifference * 0.001)) * 3.6); } catch (Exception e) { timeDifference = 0; speed = 0; } textview.settext(speed +"Km/h); } } 

Así que en esto sólo comprobar si ambos no están vacíos, tomar los valores y calcular la diferencia en los tiempos. El problema aquí es que a veces no cuenta la velocidad correctamente. Y un problema más grande es si el usuario para, la velocidad permanece constante y no cae a cero.

Quiero saber si hay alguna mejor manera de hacer el cálculo de velocidad.

Como usted está contando solamente pasos y quisiera calcular la velocidad con los pasos tomados solamente estoy asumiendo que usted no quisiera utilizar el GPS para contar velocidad o usted quisiera proporcionar contador de la velocidad de reserva si el GPS no está allí.

Puede iniciar un nuevo hilo haciendo

  int interval=1*1000; //specifying interval to check steps Handler.postDelayed(mySpeedChecker(),1000); 

Tendrá que hacer esto por cada paso que tome

 public void mySpeedChecker(){ // assuming steps taken stored in a global variable // and there is one more variable which is updated by this function // to store number of steps before as global variable to calculate number of steps in time interval. // this should check if another step has been taken in the interval to check // if stepsTaken>0 then speed is not zero and you'll know how much steps are taken // if zero steps are taken then speed is zero // also it will tell you number of steps taken in last second // so you can use this to calculate and update speed // increase the interval for high accuracy but lower frequency of updates } 

También, es una buena idea calcular la longitud del paso del usuario cuando el GPS está disponible así que, cuando el usuario está utilizando el GPS la longitud del paso se puede calcular averiguando la distancia recorrida / número de medidas tomadas con la ayuda del GPS, esto ayudará a su sistema Calcular con precisión la distancia recorrida por el usuario con la ayuda del número de pasos dados.

La forma habitual de calcular la velocidad ideal sería usar Location.getSpeed ​​(), o algún análisis sobre los valores de Acelerómetro. Pero estoy asumiendo que desea obtenerlo basado en pasos contados.

Para resolver uno de los problemas: "si el usuario se detiene, la velocidad permanece constante y no baja a cero".

Puede utilizar el Api de reconocimiento de actividad de Android para ver la actividad actual de los usuarios. Utilizar

 ActivityRecognition.getMostProbableActivity() 

Si DetectedActivity es tipo STILL, puede establecer que su velocidad sea cero.

También puede obtener la confianza DetectedActivity.getConfidence () para estar seguro.

Para el otro problema cuando usted dijo que no cuenta la velocidad correctamente, ¿podría elaborar más sobre esa pregunta?

Cada información procedente de los sensores tiene una cantidad de error e incluso flojo de datos.

Debe almacenar la información recibida en una cola o base de datos incluyendo la marca de tiempo.

Periódicamente, recogerá los datos y los analizará, incluyendo el filtrado para obtener una información más precisa.

Espero eso ayude.

  • Cómo obtener versionCode y VersionName de Google Play
  • Cambio de color con LinearLayout y TextView en Java (Android)
  • ProGuard - ¿Cómo mantener los métodos y obfuscate ellos al mismo tiempo?
  • Dagger 2 dependencias de componentes
  • Android: ¿cuál es la diferencia entre las colecciones de Bundle Vs java.util como HashMap
  • ¿Hay alguna manera de hacer compresión de imágenes y ahorrar más rápido en Android?
  • Android: WebView cargar imagen / contenido en el centro
  • No se puede hacer clic en el botón Permitir en el diálogo de permisos en Android mediante Appium.
  • Android: ClassNotFoundException al pasar el objeto serializable a la actividad
  • Android: Objeto personalizado en AIDL
  • Android: ¿Cómo puedo cambiar la altura de un ProgressBar?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.