Ver la Versión Completa : Aplicacion deteccion de caidas
Hola, estoy desarrollando una aplicación que detecta caídas por el acelerometro, lo he desarrollado con un móvil que tiene android 2.2 y ahora al ponerlo en android 4.0.3 en otro móvil no funciona correctamente, de hecho incluso cuando tengo el móvil encima de la mesa sin hacer nada con él detecta una caída y no tengo ni idea por qué me da ahora ese problema. A ver si alguien tiene alguna idea.
Gracias.
Arasthel
10/08/12, 20:45:37
Si no pones ni siquiera en planteamiento del algoritmo de las caídas, y absolutamente nada de código, pues la cosa está difícil. Yo para una app que usaba el acelerómetro siempre tenía que restarle la gravedad a los valores que me daba para tener un valor más conveniente. No sé si en tu caso es interesante o necesario hacer eso, la verdad. De todas formas, mi app que es parecida parece funcionar sin problemas en varias versiones y móviles, así que me resulta difícil decirte nada...
Un saludo.
Este es el código que funciona perfectamente en el android 2.2.
//Sensor de caida
protected void onResume() {
super.onResume();
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensors.size() > 0) {
sm.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_GAME);
}
}
protected void onStop() {
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
sm.unregisterListener(this);
super.onStop();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
@Override
public void onSensorChanged(SensorEvent event) {
if(Caidasid.equals("On") && x==0)
{
synchronized (this) {
long current_time = event.timestamp;
curX = event.values[0];
curY = event.values[1];
curZ = event.values[2];
if (prevX == 0 && prevY == 0 && prevZ == 0) {
last_update = current_time;
last_movement = current_time;
prevX = curX;
prevY = curY;
prevZ = curZ;
}
long time_difference = current_time - last_update;
if (time_difference > 0) {
float movement = Math.abs((curX + curY + curZ) - (prevX - prevY - prevZ)) / time_difference;
int limit = 1500;
float min_movement = (valorCaida);
if (movement > min_movement) {
if (current_time - last_movement >= limit) {
vibrator.vibrate(3000);
Toast.makeText(getApplicationContext(),"Se ha enviado un sms de ayuda" , Toast.LENGTH_SHORT).show();
}
}
last_movement = current_time;
}
prevX = curX;
prevY = curY;
prevZ = curZ;
last_update = current_time;
}
}
}
}
Bueno el valorCaida es un valor que elijo yo primero en la configuración y para el caso del android 4.0.3 LG Optimus L5 me va relativamente bien con el valor 0.00000375 (con el android 2.2 me va bien con el valor0.0000009) pero aunque al principio va bien pero luego se activa el solo y si esta el wifi desactivado y lo activo tb lo asocia como una caída.
Muchas gracias por la ayuda.
Arasthel
11/08/12, 16:13:38
¿No sería mejor coger el módulo de la aceleración, o en su defecto, tener en cuenta solo el valor Y? Te pongo el código que usa mi app por si te sirviese de ayuda:
private SensorEventListener accelerometerListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if(event.timestamp - lastUpdate >= 2000){
double modulo = Math.sqrt(Math.pow(event.values[0],2)+Math.pow(event.values[1],2)+Math.pow(event.values[2],2));
modulo -= 9.80665;
if(modulo >= aceleracion){
lastUpdate = event.timestamp;
Intent i = new Intent();
i.setClass(getApplicationContext(), LocAccelReceiver.class);
i.putExtra("modulo", modulo);
i.putExtra("dir", mDir);
i.putExtra("geo", mGeo[0]+","+mGeo[1]);
i.setAction("org.pmz.crashdroid.CHOQUE");
sendBroadcast(i);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
En mi caso no compruebo con valores anteriores, sino que busco picos puntuales mayores que "aceleracion", que es un valor relativamente grande. De todas formas, sería mucho más fácil entender tu código si estuviese indentado, así es bastante irritante tener que ir pensando dentro de qué bloque de código estás. Además, el método que usas para calcular "movement" me resulta muy raro.
Para empezar, si quieres restar uno a otro, ¿no sería así? (a+b+c)-(a'+b'+c'). Además, supongamos que los valores antiguos eran:
x=-3
y=-9.8
z= 0
Y los nuevos:
x=0
y=-9.8
z=-3
Según el método que usas, el movimiento del dispositivo no habría cambiado (-3-9.8+0) = (-9.8-3+0), pero realmente el cambio es bastante importante. Si quieres hacerlo así, lo mejor sería calcular la diferencia en cada coordenada. Además, un giro del dispositivo (apaisado a vertical, por ejemplo) se podría considerar una caída al cambiar las coordenadas de valor de forma rápida, así que quizás sería mejor que te guiases por el módulo.
Que conste que digo esto después de varios años sin dar física y fuerzas y aceleraciones, así que puedo estar metiendo la pata hasta el fondo. Sin embargo, el código que te he puesto de mi aplicación funciona sin problemas en varios dispositivos con distintas versiones de Android, comprobado.
Un saludo.
Muchas gracias, lo miraré mañana, lo pruebo y comento a ver como va.
La verdad es que tienes razón en cuanto a lo de la resta, igual por eso falla, no me había fijado bien, y tb en cuanto a lo de identar el código, lo haré de ahora en adelante, gracias. Para impedir que me detecte como caída un giro de pantalla añadí al código para que no se girase la pantalla, no lo puse ahí para no incluir demasiado código.
Al final, con lo de cambiar la resta que habías mencionado ya funciona perfectamente, así que muchas gracias, me voy a quedar con mí código que me parece más fácil de explicar y de aceleración no tengo ni idea xd. Espero que al finalizar la caída no acabe con el mismo valor con el que empezó variando las coordenadas, como señalaste, pq ahí sí que no funcionaría. Una pregunta,¿¿ de dónde sacaste esos conocimientos de android??, por un curso o leyendo algo, pq si tienes algún libro que recomendarme o algún curso por el estilo, ahora que creo que he dejado de ser "novato" respecto a esto, me gustaría seguir avanzando.
Arasthel
12/08/12, 14:30:36
Realmente he aprendido todo esto a base de tutoriales y prueba y error. De todas formas en esta página (sgoliver.net) tiene un curso de programación de Android que toca muchísimos temas y es realmente útil. Yo he hecho la donación porque me parece una currada impresionante y además nunca está de más tener el curso en pdf.
Un saludo.
Justo el que he seguido yo, tb tengo pensado hacer la donación que la verdad lo merece.
fernando.777a
28/11/13, 15:45:47
una consulta tengo el mismo problema de Arce13 y quisiera que me ayuden por favor debo hacer una aplicacion que pueda contar las caidas de un celular y registrarlo en una base de datos simple que detalle la fecha y la hora de la caida
no entiendo muy bien los codigos que publicaron anteriormente por que algunas variables no estan declaradas o no las publicaron completas
muchas gracias de antemano por su ayuda
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.