Android: Aprenda a usar o acelerómetro

O acelerómetro é um sensor cada vez mais utilizado em aparelhos portáteis, como os tablets ou smartphones. Permitem medir a aceleração de um corpo em relação à gravidade. Para percebermos o funcionamento dos acelerómetros, devemos dar uma vista de olhos nas leis da física. Partindo da segunda lei de Newton,

A mudança de movimento é proporcional à força motora imprimida, e é produzida na direção de linha reta na qual aquela força é aplicada

podemos imaginar o funcionamento de um copo que tenha água pela sua metade e, em uma superfície plana, deslocá-lo em uma das direcções e verificamos que a água se move.

newton2lei

O exemplo acima demonstra um acelerómetro caseiro.

Programar funcionalidades em Android que permitam obter os resultados das forças aplicadas ao dispositivo é bastante simples. Existem classes que nos permitem obter os dados directamente dos sensores.

O Acelerómetro é um sensor muito sensível, pelo que no exemplo que irá ser demonstrado, os valores apresentados irão ser constantemente alterados.

Acelerómetro (Android Studio):

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    // SensorManager - Lets you access the device's sensors
    private SensorManager sensorManager;
    // Sensor - Sensor that we will use, in this case will be Accelerometer
    private Sensor accelerometer;
    private float bestOfX = 0, bestOfY = 0, bestOfZ = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // Getting the Accelerometer sensor
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

        listSensors();
    }

public void listSensors(){
    List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
    for(Sensor s: deviceSensors){
        Log.d("Sensors: ", s.getName());
    }
}

O código acima, para além de listar todos os sensores do dispositivo (ver logcat) e instanciar o acelerómetro, obriga o programador a inserir algumas funções de forma automática.

  • onSensorChanged(SensorEvent event) – Detecta todas as alterações a nível do sensor. É esta função que estará a ser chamada vezes sem conta;
  • onAccuracyChanged(Sensor sensor, int accuracy) – Detecta todas as alterações a nível de precisão;

As funções onResume() e onPause() são importantes para que se possa activar e desactivar os listeners do sensor. Caso a aplicação fique em pausa, os valores deixaram de ser escritos para ecrã.

@Override
public void onSensorChanged(SensorEvent event) {
    // We will get the values X, Y and Z
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];

    if(x > bestOfX) {
        bestOfX = x;
    }
    if(y > bestOfY) {
        bestOfY = y;
    }
    if(z > bestOfZ) {
        bestOfZ = z;
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // do something
}

@Override
protected void onResume() {
    super.onResume();
    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    sensorManager.unregisterListener(this);
    super.onPause();
}

Fonte das imagens