Atenção: esse artigo tem um vídeo complementar. Clique e assista!
Este artigo demonstra como obter informações dos sensores dos aparelhos Android através da Sensor API. Com ela podemos capturar informações como aceleração e orientação do aparelho.
Em que situação o tema é útil:
Muitos aplicativos podem
fazer uso dos sensores. Jogos podem utilizá-los para melhorar a jogabilidade e
torná-los mais divertidos, e aplicativos podem utilizar as informações para melhorar
a experiência do usuário, assim como notificá-lo sobre características do
ambiente, tais como: temperatura, velocidade, luminosidade, pressão etc.
Resumo DevMan: Os dispositivos Android contam com diversos sensores que permitem obter informações sobre o ambiente onde o aparelho se encontra, além de servir como um mecanismo de interação com o usuário. Podemos constatar isso através dos diversos jogos que utilizam os sensores de aceleração e de orientação, assim como aplicativos que utilizam sensores de luminosidade e temperatura, que além de informar o usuário, podem mudar seu aspecto visual de acordo com essas características.
Autores: Luiz Artur Botelho da Silva, Edilson Mendes Bizerra Junior e Nelson Glauber de Vasconcelos Leal
Os aparelhos modernos, tais como smartphones e tablets, são muito mais que simples dispositivos de comunicação com uma conexão à Internet. Eles fornecem uma gama de recursos como microfones, câmeras, acelerômetros, bússolas, medidores de temperatura e luminosidade. Muitos desses recursos utilizam informações captadas por um sensor.
Um sensor é uma designação comum de dispositivos elétricos, eletrônicos, mecânicos ou biológicos, capaz de responder a estímulos da natureza física (temperatura, pressão, umidade, velocidade, aceleração, luminosidade, etc.). Desta forma, os sensores proporcionam uma série de novas possibilidades de interagir com dispositivos, tais como realidade aumentada e entrada baseada em movimentos.
O Android fornece suporte a uma série de sensores, dentre eles: acelerômetro, orientação, gravidade, giroscópio, luz, pressão e temperatura. Atualmente, estes sensores são bastante explorados nas aplicações. Como exemplo, podemos citar o sensor de orientação, usado pelo próprio sistema operacional para alterar o modo de visualização da tela, de portrait (retrato) para landscape (paisagem) e vice-versa. No contexto de jogos, os sensores de movimento desempenham um papel muito importante, podendo ser responsáveis por controlar os movimentos dos personagens. Isto se torna particularmente útil tendo em vista que muitos dos smartphones e tablets não possuem um teclado físico. Deste modo, o acelerômetro se torna uma ótima alternativa de interação com o usuário. Outro exemplo é o uso do sensor de proximidade. Ele é fundamental para a redução do consumo de bateria do aparelho durante as ligações, pois desabilita o display do dispositivo quando o usuário o aproxima da orelha.
Diante da diversidade de sensores disponibilizados pela plataforma Android, este artigo se propõe a descrever a API focando nos sensores de aceleração (acelerômetro) e de orientação como elementos centrais.
API de sensores do Android
O acesso aos sensores do aparelho é feito através da classe SensorManager. Através dela é possível registrar um listener que será responsável por tratar os eventos gerados pelo sensor. A API de sensores do Android disponibiliza duas interfaces: SensorListener e SensorEventListener. A primeira foi disponibilizada na versão 1.1 do Android, e desde a primeira versão oficial (Cupcake) está obsoleta, sendo então substituída pela segunda, que trataremos neste artigo.
Para obter uma instância da classe SensorManageré feita uma chamada ao método getSystemService (service_name) da classe Context, passando como parâmetro Context.SENSOR_SERVICE. Com essa instância em mãos, deve-se registrar um listenerpara sermos notificados sobre alterações nos valores do sensor desejado. Isso é feito através da chamada ao método registerListener()da própria SensorManager. Este método recebe os seguintes parâmetros: uma referência para uma instância de uma classe que implemente a interface SensorEventListener; uma instância de um objeto da classe Sensor(ou uma de suas subclasses); e a velocidade desejada de atualização dos dados do sensor.
A classe que implementar a interface SensorEventListener deve usar dois métodos: onAccuracyChanged()e onSensorChanged(). O primeiro é responsável por tratar as informações referentes à precisão quando há mudanças no sensor. Ele recebe como parâmetro um objeto do tipo Sensor e o tipo de calibração do sensor. O tipo de calibração é definido como constantes inteiras na classe SensorManager, que são:
- SENSOR_STATUS_ACCURACY_HIGH: A informação do sensor é tratada com o máximo de precisão;
- SENSOR_STATUS_ACCURACY_LOW: A informação do sensor é tratada com baixa precisão, sendo necessária calibração com o ambiente em que o sensor está sendo usado;
- SENSOR_STATUS_ACCURACY_MEDIUM: A informação do sensor é tratada com um determinado nível de precisão e a calibração com o ambiente em que o sensor está sendo usado pode melhorar a precisão;
- SENSOR_STATUS_UNRELIABLE: A informação tratada pelo sensor não é confiável e é necessária calibração com o ambiente em que o sensor será usado.
Quando necessário, a calibração será feita pelo programador através de algum mecanismo de controle que possa aumentar ou diminuir o número de vezes em que a informação do sensor será tratada pela aplicação.
Já o método onSensorChanged()é invocado toda vez que houver alguma mudança no sensor. Este método possui como parâmetro um objeto do tipo SensorEvent, usado para capturar valores do sensor.
O segundo parâmetro do método registerListener()é um objeto que representa o tipo de sensor (aceleração, orientação, temperatura, etc.) que queremos tratar. Para obter tal objeto, invoca-se o método getDefaultSensor() da classe SensorManager passando como parâmetro o tipo do sensor. A classe Sensor possui a relação de todos os tipos de sensores, representados por constantes inteiras, suportados pelo Android.
Por fim, o último parâmetro é a velocidade com que as atualizações do sensor serão efetuadas. A velocidade de atualização também é representada por uma constante do objeto SensorManager. Essas constantes basicamente são responsáveis por controlar a velocidade com que a informação sobre o sensor é recuperada. Essas constantes são:
- SENSOR_DELAY_FASTEST: Recupera a informação do sensor da forma mais rápida possível;
- SENSOR_DELAY_GAME: Recupera a informação do sensor em uma taxa adequada para jogos;
- SENSOR_DELAY_NORMAL: Essa constante é a padrão caso não seja informada nenhuma;
- SENSOR_DELAY_UI: Recupera a informação do sensor em uma taxa adequada para o uso de interface gráfica.
A Listagem 1 demonstra o uso da classe SensorManager. O objetivo deste trecho de código é registrar um sensor do tipo orientação e obter suas informações relacionadas aos valores das coordenadas x, y e ...