Acelerometro no Android!

Introdução

O acelerometro é aquele sensor que permite a identificação da posição física do dispositivo.
Ou seja, através dele conseguimos saber quando um dispositivo esta inclinado para a esquerda ou direita, para frente ou para traz, pra baixo ou para cima e a partir dessas informação realizar eventos.
O uso do acelerometro é um recurso muito empregado em aplicativos Android, principalmente em Jogos. Um bom exemplo são os jogos de corrida em que o celular se transforma no volante do carro, onde o usuário executa curvas inclinando o celular para o local desejado.
Essa funcionalidade e muitas outras são alcançadas graças ao recurso do Acelerometro.

Agora que sabemos um pouco da teoria do Acelerometro, vamos partir para a prática.

No eclipse, crie um projeto Android e o chame de ExemploAcelerometro. Este projeto terá apenas uma Activity e um Layout XML.

No Layout XML teremos quatro componentes TextView, que vão mostrar os valores capturados pelos os sensores do acelerómetro.

Podemos ver esse arquivo logo abaixo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/text_view_x"
        />
    
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/text_view_y"
        />
     
      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/text_view_z"
        />
      
           
      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/text_view_detail"
        />

</LinearLayout>

Agora vamos a Activity

Para que a nossa aplicação trate eventos do acelerometro, dois passos devem ser feitos:

– O primeiro é a implementação da interface SensorEventListener, essa interface implica na implementação de dois métodos: O onAccuracyChanged(Sensor sensor, int accuracy) que será acionado quando acontecer mudanças na precisão do sensor do acelerómetro. E o onSensorChanged(SensorEvent event) que por sua vez será acionado sempre que o sensor identificar uma mudança na posição do dispositivo.
É com esse último método que iremos trabalhar, veja que ele recebe como parâmetro um objeto do tipo SensorEvent, que nos fornece informações referentes a posição física do dispositivo. Com base nesses dados podemos realizar ações no nosso aplicativo, mais a frente no artigo vamos explicar esse método mais pronfundamente.

– O outro passo importante para utilizar o acelerómetro. É a forma de iniciar as capturas de posições.
Fazemos isso através do método: registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL) que esta presente na classe SensorManager. Conseguimos criar uma instância da Classe SensorManager através do método: getSystemService(Context.SENSOR_SERVICE) da própria classe Activity.

Obs: Veja que o método getSystemService é muito utilizado para recuperar estruturas que permitem acesso a recursos próprios do hardware do dispositivo. Por exemplo, para recuperar o GPS Manager responsável por iniciar a captura do GPS também devemos fazer uso desse método.

Agora que sabemos os principais passos de como acionar o recurso de acelerómetro veremos a Activity que cumpre os passos descritos acima.

public class MainActivity extends Activity implements SensorEventListener {
	
	private TextView textViewX;
	private TextView textViewY;
	private TextView textViewZ;
	private TextView textViewDetail;
	
	private SensorManager mSensorManager;
	private Sensor mAccelerometer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textViewX = (TextView) findViewById(R.id.text_view_x);
        textViewY = (TextView) findViewById(R.id.text_view_y);
        textViewZ = (TextView) findViewById(R.id.text_view_z);
        textViewDetail = (TextView) findViewById(R.id.text_view_detail);
        
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        
    }
      
    @Override
    protected void onResume() {
    	super.onResume();
    	mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    
    @Override
    protected void onPause() {
    	super.onPause();
    	mSensorManager.unregisterListener(this);
    }
    
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		Float x = event.values[0];
		Float y = event.values[1];
		Float z = event.values[2];
		
         /*
	    Os valores ocilam de -10 a 10.
	    Quanto maior o valor de X mais ele ta caindo para a esquerda - Positivo Esqueda 
	    Quanto menor o valor de X mais ele ta caindo para a direita  - Negativo Direita
	    Se o valor de  X for 0 então o celular ta em pé - Nem Direita Nem Esquerda
	    Se o valor de Y for 0 então o cel ta "deitado"
         Se o valor de Y for negativo então ta de cabeça pra baixo, então quanto menor y mais ele ta inclinando pra ir pra baixo
	    Se o valor de Z for 0 então o dispositivo esta reto na horizontal.
	    Quanto maioro o valor de Z Mais ele esta inclinado para frente
	    Quanto menor o valor de Z Mais ele esta inclinado para traz.
		*/
		textViewX.setText("Posição X: " + x.intValue() + " Float: " + x);
		textViewY.setText("Posição Y: " + y.intValue() + " Float: " + y);
		textViewZ.setText("Posição Z: " + z.intValue() + " Float: " + z);
		
		if(y < 0) { // O dispositivo esta de cabeça pra baixo
			if(x > 0)  
				textViewDetail.setText("Virando para ESQUERDA ficando INVERTIDO");
			if(x < 0)  
				textViewDetail.setText("Virando para DIREITA ficando INVERTIDO");	
		} else {
			if(x > 0)  
				textViewDetail.setText("Virando para ESQUERDA ");
			if(x < 0)  
				textViewDetail.setText("Virando para DIREITA ");
		}	
	}
}

Pontos a serem observados:

– O método onResume, Iniciará o processo de captura do acelerómetro através do método mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL). Por sua vez, o método onPause, irá para-lo acionando o método mSensorManager.unregisterListener(this). Esse procedimento é uma medida para economizar bateria, se não fizermos isso, o aplicativo vai continuar capturando informações do acelerómetro mesmo se o usuário não estiver interagindo com a mesma.
Esses métodos são da classe Activity e são utilizados no ciclo de vida da mesma. Para saber mais sobre o ciclo de vida, veja o link.

– Quando chamamos o método mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL). Passamos como parâmetro, uma implementação da interface SensorEventListener, no nosso caso a nossa própria Activity implementa essa interface. O Segundo parâmetro define o sensor que será utilizado, no nosso caso passamos o Sensor referente ao acelerómetro (Sensor.TYPE_ACCELEROMETER), outras opções são:
Sensor.TYPE_GYROSCOPE, Sensor.TYPE_MAGNETIC_FIELD, Sensor.TYPE_ORIENTATION.
O terceiro parâmetro por sua vez define a velocidade da captura das informações de giroscópio. Esse parâmetro é definido por constantes, e neste exemplo passamos o tipo SensorManager.SENSOR_DELAY_NORMAL. Podemos ver que existem outros tipos como SENSOR_DELAY_GAME próprio para games e o SENSOR_DELAY_FASTEST referente ao delay mais rápido. Cabe ao desenvolver entender esses delays e utilizar o melhor em cada situação.

– Analisando a implementação do onSensorChanged(SensorEvent event), percebemos que esse método possui o parâmetro SensorEvent, é nesse objeto que esta localizado as informações mais importantes para o funcionamento do acelerómetro. São elas:
As posições X, Y e Z ambos do tipo Float.
Cada variável acima representa uma posição física do dispositivo.

Quando movimento meu dispositivo lateralmente, ou para esquerda ou para direita, você verá movimentações da posição X. Quanto maior o valor dele, mais o dispositivo esta inclinado para esquerda, consequentemente quanto menor X mais ele esta inclinado para direita.

Por sua vez, Y representa a posição horizontal. Se o dispositivo estiver de cabeça pra baixo estará o máximo negativo e se estiver na posição normal estará o máximo positivo, consequentemente atingirá 0 se estiver “deitado”.

Por úlitmo, a posição Z, indicará se o dispositivo esta inclinado para frente ou para traz.

Os TextViews são preenchidos com o valor de cada posição demonstrada acima, para facilitar a visualização também o demonstrei na forma de Inteiro.

No final do método, preenchemos um TextView com um texto de acordo com a posição do celular, isso foi feito para demonstrar uma forma de empregar o acelerómetro em aplicações.

No próprio código existem comentários que podem ajudar a esclarecer ainda mais a utilidade de cada posição.

Nossa APP ficará assim:

Conclusão

Podemos fazer muita coisa legal utilizando o acelerometro, não somente na área de games mas também em aplicativos.
Preocupe-se em surpreender o seu usuário de um modo positivo, a concorrência é pesada, e somente desta maneira conseguirá fazer o seu aplicativo se destacar no mercado.

Abraço e até o próximo.

Anúncios

, , ,

  1. #1 by ramonsantospe on Setembro 12, 2014 - 4:10 am

    Reblogged this on defcode.

  2. #2 by Thiago on Fevereiro 9, 2014 - 5:40 am

    Parabéns pelo blog amigo!
    Também possuo um blog sobre Arduino e Android.
    Sempre que posso integro aplicações Android com o Arduino

    Abraço!

  3. #3 by Gerson Júnior on Outubro 17, 2013 - 3:27 pm

    Massa o tutorial, parabéns!

  4. #4 by lol on Abril 1, 2013 - 11:16 am

    =] vlw

  5. #5 by Leonardo Casasanta on Fevereiro 15, 2013 - 1:45 pm

    Opa, obrigado pelo comentário.

    Com base no código acima vc consegue detectar esse evento de agitar,
    Por exemplo, sabendo que:

    Quanto maior o valor de X mais ele ta caindo para a esquerda – Positivo Esqueda
    logo
    Quanto menor o valor de X mais ele ta caindo para a direita – Negativo Direita

    Se eles ocilarem com rapidez vc sabe que houve um “Movimento de agitar”.
    Porém, já existe algumas implementações prontas para capturar esse evento, veja os links abaixo:

    http://android.hlidskialf.com/blog/code/android-shake-detection-listener

    http://stackoverflow.com/questions/5271448/how-to-detect-shake-event-with-android

    • #6 by Wellington on Fevereiro 15, 2013 - 2:16 pm

      Muito bom vlw!

  6. #7 by Wellington on Fevereiro 15, 2013 - 10:37 am

    O meu ta dando erro no onResume e onPause o eclipse me deu a opção Let main activity implement “SensorListner”, só que eu já tinha colocado o implement SensorListner na activity, quando eu corrijo com essa opção ele coloca lá na frente do meu implements android.hardware.SensorEventListener… Isso tá certo?

    • #8 by Leonardo Casasanta on Fevereiro 15, 2013 - 11:06 am

      Deve estar havendo algum problema no seu eclipse para importar essa interface (SensorEventListener). Escreva o comando import você mesmo,
      import android.hardware.SensorEventListener (la no alto da sua classe onde estão os outros imports). Em seguida pressione CTRL + Shift + O e deve resolver.

      • #9 by Wellington on Fevereiro 15, 2013 - 11:38 am

        Vlw tá dando certo, ótimo site parabéns following ^^. Sabe me dizer como faço para pegar o movimento agitar de um lado pra outro (direita para esquerda por exemplo), a partir disso queria disparar um evento. Desde já agradeço.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: