A plataforma Android oferece quatro sensores que permitem monitorar várias propriedades ambientais. Você pode usar esses sensores para monitorar a umidade, a iluminação e a pressão ambiente temperatura ambiente perto de um dispositivo Android. Todos os quatro sensores de ambiente são baseados em hardware e só estão disponíveis se o fabricante os tiver integrado ao dispositivo. Com a exceção de o sensor de luz, que a maioria dos fabricantes de dispositivos usa para controlar o brilho da tela, o ambiente nem sempre estão disponíveis nos dispositivos. Por isso, é particularmente importante que você verificar no tempo de execução se existe um sensor de ambiente antes de tentar coletar dados reimplantá-lo.
Diferente da maioria dos sensores de movimento e de posição, que retornam uma matriz multidimensional de sensores
valores para cada SensorEvent
, os sensores de ambiente vão retornar um único 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 precisam de valores passa-altos ou passa-baixos
os sensores de ambiente normalmente não exigem filtragem ou processamento de dados. Tabela
1 fornece um resumo dos sensores de ambiente com suporte na 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 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 que você adquire 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
Para coletar dados desses sensores, primeiro crie uma instância da classe SensorManager
, que pode ser usada para acessar 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()
. A
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, tenha
cancele o registro de um sensor quando uma atividade for pausada. Isso evita que um sensor
detectar dados continuamente e descarregar a bateria.
Usar o sensor de umidade
É possível coletar dados brutos de umidade relativa com o sensor de umidade da mesma forma que você usa
os sensores de luz, pressão e temperatura. No entanto, se o dispositivo tiver um sensor de umidade
(TYPE_RELATIVE_HUMIDITY
) e um sensor de temperatura (TYPE_AMBIENT_TEMPERATURE
), você pode usar esses dois fluxos de dados para calcular
o ponto de condensação 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, a constante pressão barométrica, para que o vapor de água se condense na água. A equação a seguir mostra como você para calcular o ponto de condensação:
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. Absoluta a umidade é medida em gramas/metro3. A equação a seguir mostra como você pode calcular a umidade absoluta:
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