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