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.
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();
}

