2013-02-19 3 views
0

Comment puis-je déterminer si un périphérique Android a été déplacé? Par "déplacé", je veux dire que s'il reste allongé sur une table et que quelqu'un le ramasse, je peux détecter qu'il a bougé. Je pensais utiliser le capteur de gyroscope, mais je ne suis pas sûr si c'est la meilleure solution.Déterminez si le périphérique a été déplacé

+0

Salut, avez-vous obtenu une solution? J'essaie de faire la même chose avec un service d'arrière-plan, mais l'accéléromètre ne fonctionne pas lorsque l'écran est éteint. – Nitish

Répondre

1

Je ne pense pas que vous ayez beaucoup de choix si vous voulez détecter un mouvement minimal. Le capteur gyroscope/accéléromètre est le chemin à parcourir. Même là, vous devez ajouter un peu de filtrage, car l'accéléromètre a une certaine hésitation.

Le GPS n'est pas assez précis pour être utilisé pour remarquer le mouvement de la table à la main.

La surveillance du capteur de proximité peut être utile, mais tout ce qui le bloque est déclenché, et il ne vous dit vraiment pas si le téléphone est en mouvement.

Si vous voulez consommer beaucoup de batterie, utilisez l'appareil photo. Diffusez une entrée via un filtre, qui détermine si l'image est en mouvement.

1

Vous pouvez utiliser l'accéléromètre pour résoudre ce problème. S'il n'y a pas de force externe sur l'appareil, la somme vectorielle des valeurs du capteur de l'accéléromètre sera seulement la gravité. S'il y a un changement dans le vectorsum de la gravité, alors il y a une force. Si cette force est significative, vous pouvez supposer que le périphérique est en mouvement.

Si la somme vectorielle est égale à la gravité avec +/- seuil, sa stabilité sur la table.

code ressemblera ci-dessous, (Note: MovingAverage ci-dessous des moyens de déplacement moyen de 50 échantillons de l'accéléromètre)

bool IsDeviceStill(const sensors_event_t& event) 
{ 
    if (event.type == SENSOR_TYPE_ACCELEROMETER) { 
     const vec3_t acc(event.data); 
     /*Avoiding square root for better performance*/ 
     float vecsum = acc.x*acc.x + acc.y*acc.y + acc.z*acc.z; 
     vec3_t variance = mVariance->movingAverage(vecsum); 

     vec3_t var = mOffsetAvg->movingAverage(abs(variance.x - vecsum)); 

     ALOGE("Current variance x:%f AvgVarianc:%f ",variance.x,var.x); 
     if(var.x < 2) /*Threshold is 2, Standard deviation should less than 2 */ 
      mDeviceStill = true; 
     else 
      mDeviceStill = false; 

    } 
    ALOGE("%s Device is still:%d\n", __FUNCTION__, mDeviceStill); 
    return mDeviceStill; 
} 
Questions connexes