Platforma Android jest wyposażona w 4 czujniki, które umożliwiają monitorowanie różnych właściwości środowiskowych. Możesz ich używać do monitorowania wilgotności otoczenia, oświetlenia, ciśnienia otoczenia i temperatury otoczenia w pobliżu urządzenia z Androidem. Wszystkie 4 czujniki środowiska są sprzętowe i są dostępne tylko wtedy, gdy producent urządzenia wbudowa je w urządzenie. Z wyjątkiem czujnika światła, którego większość producentów urządzeń używa do sterowania jasnością ekranu, czujniki otoczenia nie zawsze są dostępne na urządzeniach. Z tego względu przed próbą pobrania z niego danych należy sprawdzić w czasie działania, czy taki czujnik istnieje.
W odróżnieniu od większości czujników ruchu i czujników pozycji, które zwracają wielowymiarowy zestaw wartości z czujników dla każdego obiektu SensorEvent
, czujniki środowiska zwracają jedną wartość z czujnika dla każdego zdarzenia związanego z danymi. Na przykład temperatura w °C lub ciśnienie w hPa.
Poza tym, w przeciwieństwie do czujników ruchu i czujników pozycji, które często wymagają filtrowania wysokoprzepustowego lub dolnoprzepustowego, czujniki otoczenia zwykle nie wymagają filtrowania ani przetwarzania danych. Tabela 1 zawiera podsumowanie czujników środowiska obsługiwanych przez platformę Androida.
Czujnik | Dane zdarzeń z czujnika | Jednostki miary | Opis danych |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | Temperatura powietrza otoczenia. |
TYPE_LIGHT |
event.values[0] |
lx | Natężenie oświetlenia |
TYPE_PRESSURE |
event.values[0] |
hPa lub mbar | Ciśnienie otoczenia. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | Wilgotność względna otoczenia. |
TYPE_TEMPERATURE |
event.values[0] |
°C | Temperatura urządzenia1. |
1 Implementacje różnią się w zależności od urządzenia. Ten czujnik został wycofany w Androidzie 4.0 (poziom interfejsu API 14).
Używaj czujników światła, ciśnienia i temperatury
Nieprzetworzone dane z czujników światła, ciśnienia i temperatury zwykle nie wymagają kalibracji, filtrowania ani modyfikacji, co sprawia, że są to jedne z najłatwiejszych w użyciu czujników. Aby pobrać dane z tych czujników, musisz najpierw utworzyć instancję klasy SensorManager
, której możesz użyć do pobrania wystąpienia czujnika fizycznego.
Następnie rejestrujesz odbiornik czujnika w metodzie onResume()
i rozpoczynasz obsługę przychodzących danych z czujnika w metodzie wywołania zwrotnego onSensorChanged()
. Poniższy kod pokazuje, jak to zrobić:
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); } }
Musisz zawsze uwzględniać implementacje wywołań zwrotnych onAccuracyChanged()
i onSensorChanged()
. Pamiętaj też, aby zawsze wyrejestrowywać czujnik, gdy aktywność jest wstrzymywana. Zapobiega to ciągłemu wykrywaniu danych przez czujnik i tym samym rozładowywaniu baterii.
Używanie czujnika wilgotności
Nieprzetworzone dane o wilgotności względnej możesz uzyskać za pomocą czujnika wilgotności w taki sam sposób jak czujniki światła, ciśnienia i temperatury. Jeśli jednak urządzenie ma zarówno czujnik wilgotności (TYPE_RELATIVE_HUMIDITY
), jak i czujnik temperatury (TYPE_AMBIENT_TEMPERATURE
), możesz używać tych 2 strumieni danych do obliczania punktu rosy i wilgotności bezwzględnej.
Punkt rosy
Temperatura rosy to temperatura, w której określona objętość powietrza musi zostać schłodzona pod stałym ciśnieniem barometrowym, aby para wodna skraplała się do wody. Punkt rosy można obliczyć za pomocą tego równania:
Gdzie,
- td = temperatura punktu rosy w stopniach C
- t = rzeczywista temperatura w stopniach C
- RH = rzeczywista wilgotność względna w procentach (%)
- M = 17,62
- Tn = 243,12
Wilgotność bezwzględna
Wilgotność bezwzględna to masa pary wodnej w danej objętości suchego powietrza. Wilgotność bezwzględna jest mierzona w gramach na metr3. W tym równaniu można obliczyć wilgotność bezwzględną:
Gdzie,
- dv = wilgotność bezwzględna w gramach/metr3
- t = rzeczywista temperatura w stopniach C
- RH = rzeczywista wilgotność względna w procentach (%)
- M = 17,62
- Tn = 243,12 stopnia C
- A = 6,112 hPa