====== Sensors de moviment d'Android ====== {{ :android:eixos-accelerometre.jpg?200 }} Referències: * [[https://developer.android.com/develop/sensors-and-location/sensors/sensors_motion|Doc oficial: sensors de moviment en Android]]. * [[https://stackoverflow.com/questions/5271448/how-to-detect-shake-event-with-android|Com detectar sacsejos amb l'acceleròmetre]]. {{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 Android mobile java sensors acceleròmetre accelerometer }} \\ ===== Sensors ===== Quan parlem de "sensors" en Android solem referir-nos als de moviment: l'**acceleròmetre** i el **giroscopi** (brúixola 3D). També son sensors (però no de moviment) la càmera, el micro, la pantalla tàctil i el GPS. Si mirem la documentació oficial podrem veure que la llibreria Android disposa dels següents deteccions: * Sensor.TYPE_GRAVITY * Sensor.TYPE_LINEAR_ACCELERATION * Sensor.TYPE_ROTATION_VECTOR * Sensor.TYPE_SIGNIFICANT_MOTION * Sensor.TYPE_STEP_COUNTER * Sensor.TYPE_STEP_DETECTOR * Sensor.TYPE_ACCELEROMETER * Sensor.TYPE_GYROSCOPE Els dos darrers son les dades "en cru" tal i com arriben dels sensors. Els altres son mecanismes de la llibreria per facilitar-nos la programació. ===== Exemple amb dades de l'acceleròmetre ===== public class MainActivity extends AppCompatActivity { private SensorManager sensorManager; private Sensor sensor; SensorEventListener sensorListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { // Valors de l'acceleròmetre en m/s^2 float xAcc = sensorEvent.values[0]; float yAcc = sensorEvent.values[1]; float zAcc = sensorEvent.values[2]; // Processament o visualització de dades... } @Override public void onAccuracyChanged(Sensor sensor, int i) { // Es pot ignorar aquesta CB de moment } }; // Seleccionem el tipus de sensor (veure doc oficial) sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // registrem el Listener per capturar els events del sensor if( sensor!=null ) { sensorManager.registerListener(sensorListener,sensor, SensorManager.SENSOR_DELAY_NORMAL); } } } \\ ===== Exercici ===== Implementa una app que visualitzi els valors de l'acceleròmetre seguint l'exemple anterior on emprem el ''Sensor.TYPE_ACCELEROMETER''. Tens unes captures de pantalla més a baix de com pots fer la app. Compara amb el resultat de ''Sensor.TYPE_LINEAR_ACCELERATION''. Quina diferència veus? Llença l'app al teu dispositiu mòbil. Com has de col·locar el mòbil per aconseguir aquests valors (aproximats)?: {{:android:tapapp1.jpg?150}} {{:android:tapapp2.jpg?150}} {{:android:tapapp3.jpg?150}} **Double tap** Intenta implementar un detector de "double tap". No ha de reaccionar amb 1 sol "tap" ni tampoc si ens desplacem ràpid o fem una sola sacsejada del mòbil.