בפלטפורמת Android יש ארבעה חיישנים שמאפשרים לעקוב אחרי מאפיינים סביבתיים שונים. אפשר להשתמש בחיישנים האלה כדי לעקוב אחרי הלחות היחסית בסביבה, רמת ההארה, לחץ הסביבה וגם טמפרטורת הסביבה ליד מכשיר מבוסס Android. כל ארבעת חיישני הסביבה מבוססים על חומרה והם זמינים רק אם יצרן המכשיר כלל אותם במכשיר. מלבד חיישן האור, שמשמש רוב יצרני המכשירים כדי לשלוט בבהירות המסך, החיישנים לא תמיד זמינים במכשירים. לכן, חשוב במיוחד לבדוק בזמן הריצה אם קיים חיישן סביבה לפני שמנסים לקבל נתונים את זה.
בשונה מרוב חיישני התנועה וחיישני המיקום, שמחזירים מערך רב-ממדי של חיישנים
ערכים לכל SensorEvent
, חיישני סביבה מחזירים חיישן יחיד
עבור כל אירוע נתונים. לדוגמה, הטמפרטורה ב-C או הלחץ ב-hPa.
כמו כן, בשונה מחיישני תנועה וחיישני מיקום, שלרוב דורשים בהם ציונים גבוהים או נמוכים
ובחיישני הסביבה לא נדרשים בדרך כלל סינון נתונים או עיבוד נתונים. שולחן
סיכום של חיישני הסביבה שנתמכים בפלטפורמת Android.
טבלה 1. חיישני סביבה שנתמכים בפלטפורמת Android.
חיישן | נתוני אירועים מחיישנים | יחידות מידה | תיאור הנתונים |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | טמפרטורת האוויר בסביבה. |
TYPE_LIGHT |
event.values[0] |
לוקס | תאורה. |
TYPE_PRESSURE |
event.values[0] |
hPa או mbar | לחץ האוויר בסביבה. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | הלחות היחסית של הסביבה. |
TYPE_TEMPERATURE |
event.values[0] |
°C | טמפרטורת המכשיר.1 |
1 ההטמעות משתנות ממכשיר למכשיר במכשיר. החיישן הזה הוצא משימוש ב-Android 4.0 (רמת API 14).
שימוש בחיישני האור, הלחץ והטמפרטורה
לנתונים הגולמיים שאתם מקבלים מחיישני האור, הלחץ והטמפרטורה, בדרך כלל לא נדרשים נתונים
כיול, סינון או שינוי, ולכן הם חלק מהחיישנים הקלים ביותר לשימוש. שפת תרגום
כדי להשיג נתונים מהחיישנים האלה, קודם יוצרים מכונה מהמחלקה SensorManager
, ואפשר להשתמש בה כדי לקבל מופע של חיישן פיזי.
לאחר מכן רושמים חיישן להאזנה בשיטת onResume()
ומתחילים לטפל בנתוני חיישנים נכנסים בשיטת הקריאה החוזרת של onSensorChanged()
.
הקוד הבא מראה איך לעשות את זה:
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); } }
תמיד צריך לכלול הטמעות של שיטות הקריאה החוזרת onAccuracyChanged()
וגם של השיטה onSensorChanged()
. כמו כן, חשוב
חשוב להקפיד לבטל את רישום החיישן כשהפעילות מושהית. הפעולה הזו מונעת מהחיישן
חישה מתמשכת של הנתונים והסוללה מתרוקנת.
שימוש בחיישן הלחות
אפשר לקבל נתוני לחות יחסית גולמיים באמצעות חיישן הלחות באותו אופן שבו משתמשים
מחיישני האור, הלחץ והטמפרטורה. עם זאת, אם במכשיר יש גם חיישן לחות
(TYPE_RELATIVE_HUMIDITY
) וחיישן טמפרטורה (TYPE_AMBIENT_TEMPERATURE
), אפשר להשתמש בשני מקורות הנתונים האלה כדי לחשב
נקודת הטל והלחות המוחלטת.
נקודת הטל
נקודת הטל היא הטמפרטורה שבה צריך לקרר נפח אוויר נתון באופן קבוע לחץ ברומטרי, כדי שאדי המים יתעבו במים. המשוואה הבאה מראה איך יכול לחשב את נקודת הטל:
![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?hl=he)
איפה,
- td = הטמפרטורה של נקודת הטל במעלות C
- t = הטמפרטורה בפועל במעלות C
- RH = הלחות היחסית בפועל באחוזים (%)
- m = 17.62
- Tn = 243.12
הלחות האבסולוטית
הלחות המוחלטת היא המסה של אדי המים בנפח נתון של אוויר יבש. מוחלט הלחות נמדדת בגרם למטר3. המשוואה הבאה מראה איך יכול לחשב את הלחות המוחלטת:
![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?hl=he)
איפה,
- dv = הלחות המוחלטת בגרם למטר3
- t = הטמפרטורה בפועל במעלות C
- RH = הלחות היחסית בפועל באחוזים (%)
- m = 17.62
- Tn = 243.12 מעלות C
- A = 6.112 hPa