====== 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.