A plataforma Android oferece quatro sensores que permitem monitorar várias propriedades ambientais. Você pode usar esses sensores para monitorar a umidade relativa, iluminação, pressão ambiente e temperatura ambiente perto de um dispositivo Android. Os quatro sensores de ambiente são baseados em hardware e estarão disponíveis apenas se o fabricante os tiver integrado a um dispositivo. Com exceção do sensor de luz, que a maioria dos fabricantes usa para controlar o brilho da tela, os sensores de ambiente nem sempre estão disponíveis nos dispositivos. Por isso, é particularmente importante verificar no momento da execução se um sensor de ambiente existe antes de tentar coletar dados dele.
Ao contrário da maioria dos sensores de movimento e de posição, que retornam uma matriz multidimensional de valores
de sensor para cada SensorEvent
, os sensores de ambiente retornam um único valor
de sensor para cada evento de dados. Por exemplo, a temperatura em °C ou a pressão em hPa.
Além disso, ao contrário dos sensores de movimento e de posição, que geralmente exigem filtragem de passagem alta ou baixa, os sensores de ambiente normalmente não exigem filtragem ou processamento de dados. A Tabela
1 mostra um resumo dos sensores de ambiente compatíveis com a plataforma Android.
Tabela 1. Sensores de ambiente compatíveis com a plataforma Android.
Sensor | Dados de eventos do sensor | Unidades de medida | Descrição dos dados |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | Temperatura do ar ambiente. |
TYPE_LIGHT |
event.values[0] |
lx | Iluminamento. |
TYPE_PRESSURE |
event.values[0] |
hPa ou mbar | Pressão do ar ambiente. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | Umidade relativa ambiente. |
TYPE_TEMPERATURE |
event.values[0] |
°C | Temperatura do dispositivo.1 |
1 As implementações variam de acordo com o dispositivo. Esse sensor teve o uso suspenso no Android 4.0 (API nível 14).
Usar os sensores de luz, pressão e temperatura
Os dados brutos coletados dos sensores de luz, pressão e temperatura geralmente não exigem calibração, filtragem ou modificação, o que os torna alguns dos sensores mais fáceis de usar. Para coletar dados desses sensores, primeiro crie uma instância da classe SensorManager
, que pode ser usada para receber uma instância de um sensor físico.
Em seguida, registre um listener de sensor no método onResume()
e comece a processar os dados recebidos no método de callback onSensorChanged()
. O
código a seguir mostra como fazer isso:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var pressure: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val millibarsOfPressure = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL) } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor pressure; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float millibarsOfPressure = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
É preciso sempre incluir implementações dos métodos de callback onAccuracyChanged()
e onSensorChanged()
. Além disso, não se esqueça de sempre cancelar o registro de um sensor quando uma atividade for pausada. Isso impede que um sensor
detecte dados continuamente e descarregue a bateria.
Usar o sensor de umidade
É possível coletar dados brutos de umidade relativa usando o sensor de umidade da mesma forma que você usa os sensores de luz, pressão e temperatura. No entanto, se um dispositivo tiver um sensor de umidade
(TYPE_RELATIVE_HUMIDITY
) e um de temperatura (TYPE_AMBIENT_TEMPERATURE
), você poderá usar esses dois fluxos de dados para calcular
o ponto de orvalho e a umidade absoluta.
Ponto de condensação
O ponto de condensação é a temperatura em que um determinado volume de ar precisa ser resfriado, sob pressão barométrica constante, para que o vapor de água se condense. A equação abaixo mostra como calcular o ponto de orvalho:
![t_d(t,RH) = Tn · (ln(RH/100) + m·t/(T_n+t
))/(m - [ln(RH/100%) + m·t/(T_n+t)])](https://developer.android.com/static/images/guide/topics/sensors/dew_point.png?authuser=5&hl=pt)
Em que:
- td = temperatura do ponto de condensação em graus C
- t = temperatura real em graus C
- UR = umidade relativa real em porcentagem (%)
- m = 17,62
- Tn = 243,12
Umidade absoluta
A umidade absoluta é a massa de vapor de água em um determinado volume de ar seco. A umidade absoluta é medida em gramas/metro3. A equação a seguir mostra como calcular a umidade absoluta:
![d_v(t,RH) = (RH/100) · A · exp(m·
t/(T_n+t)/(273,15 + t)](https://developer.android.com/static/images/guide/topics/sensors/absolute_humidity.png?authuser=5&hl=pt)
Em que:
- dv = umidade absoluta em gramas/metro3
- t = temperatura real em graus C
- UR = umidade relativa real em porcentagem (%)
- m = 17,62
- Tn = 243,12 graus C
- A = 6,112 hPa