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:
- Android - Base de datos pre-poblada, insertada o pre-cargada?
- Cambiar el color de texto de ActionBar
- Android - Crash al generar un número aleatorio
- Android Framework?
- Android / Java regex match Más signo
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.
- La aplicación de Android sigue siendo miembro de datos estáticos de la clase de actividad
- Cómo ajustar la sensibilidad del micrófono mientras graba audio en android
- Last.fm no devolverá la imagen del artista
- ¿Cómo implementar la función de búsqueda con SearchView, Retrofit y RxJava (RxBindings)?
- No es accesible en el contexto actual
- Cómo obtener la cadena de base de datos firebase en tiempo real que contienen en clave única
- Android Webview: No se puede llamar a determinedVisibility () - nunca vio una conexión para el pid
- WakefulBroadcastReceiver no se puede resolver con un tipo
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 puedo apoyar el texto persa en persa en Android?
- ¿Cuál es la diferencia entre algunos "Android Development / SDK tools"?