Android platformunda çeşitli çevre özelliklerini izlemenize olanak tanıyan dört sensör bulunur. Android destekli cihazlarda bağıl nemi, aydınlatmayı, ortam basıncını ve ortam sıcaklığını izlemek için bu sensörleri kullanabilirsiniz. Dört ortam sensörünün tümü donanım tabanlıdır ve yalnızca cihaz üreticisi bunları bir cihaza yerleştirdiyse kullanılabilir. Çoğu cihaz üreticisinin ekran parlaklığını kontrol etmek için kullandığı ışık sensörü haricinde, ortam sensörleri cihazlarda her zaman kullanılamaz. Bu nedenle, oradan veri elde etmeye çalışmadan önce çalışma zamanında bir ortam sensörü olup olmadığını doğrulamanız özellikle önemlidir.
Her SensorEvent
için çok boyutlu bir sensör değerleri dizisi döndüren çoğu hareket sensörünün ve konum sensörünün aksine ortam sensörleri, her veri etkinliği için tek bir sensör değeri döndürür. Örneğin, °C cinsinden sıcaklık veya hPa cinsinden basınç.
Ayrıca, genellikle yüksek veya düşük geçişli filtreleme gerektiren hareket sensörlerinin ve konum sensörlerinin aksine ortam sensörleri genelde herhangi bir veri filtreleme veya veri işleme gerektirmez. Tablo 1'de, Android platformunda desteklenen ortam sensörlerinin bir özeti gösterilmektedir.
Sensör | Sensör etkinlik verileri | Ölçü birimleri | Veri açıklaması |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE |
event.values[0] |
°C | Ortam hava sıcaklığı. |
TYPE_LIGHT |
event.values[0] |
lx | Aydınlık. |
TYPE_PRESSURE |
event.values[0] |
hPa veya mbar | Ortam hava basıncı. |
TYPE_RELATIVE_HUMIDITY |
event.values[0] |
% | Ortamın bağıl nemi. |
TYPE_TEMPERATURE |
event.values[0] |
°C | Cihaz sıcaklığı.1 |
1 Uygulamalar cihaza göre değişiklik gösterir. Bu sensör Android 4.0'da (API Düzeyi 14) kullanımdan kaldırılmıştır.
Işık, basınç ve sıcaklık sensörlerini kullanma
Işık, basınç ve sıcaklık sensörlerinden edindiğiniz ham veriler için genellikle kalibrasyon, filtreleme veya modifikasyon gerekmez. Bu nedenle, kullanımı en kolay sensörlerden bazılarıdır. Bu sensörlerden veri almak için önce SensorManager
sınıfının bir örneğini oluşturmanız gerekir. Bu örneği fiziksel sensörün örneğini almak için kullanabilirsiniz.
Ardından onResume()
yöntemine bir sensör dinleyicisi kaydeder ve gelen sensör verilerini onSensorChanged()
geri çağırma yönteminde işlemeye başlarsınız. Aşağıdaki kod bunu nasıl yapacağınızı gösterir:
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); } }
Her zaman hem onAccuracyChanged()
hem de onSensorChanged()
geri çağırma yöntemlerinin uygulamalarını eklemeniz gerekir. Ayrıca, bir aktivite durduğunda her zaman sensörün kaydını iptal ettiğinizden emin olun. Bu durum, sensörün sürekli olarak verileri algılamasını ve pili bitirmesini engeller.
Nem sensörünü kullanma
Nem sensörünü ışık, basınç ve sıcaklık sensörlerini kullandığınız şekilde kullanarak ham bağıl nem verilerini elde edebilirsiniz. Ancak bir cihazda hem nem sensörü (TYPE_RELATIVE_HUMIDITY
) hem de sıcaklık sensörü (TYPE_AMBIENT_TEMPERATURE
) varsa çiy noktasını ve mutlak nemi hesaplamak için bu iki veri akışını kullanabilirsiniz.
Çiy noktası
Çiy noktası, su buharının suya yoğunlaşması için belirli bir hacimdeki havanın sabit barometrik basınçta soğutulması gereken sıcaklıktır. Aşağıdaki denklemde çiy noktasını nasıl hesaplayabileceğiniz gösterilmektedir:
Burada,
- td = C derece olarak çiy noktası sıcaklığı
- t = C derece olarak gerçek sıcaklık
- Bağıl nem = yüzde (%) cinsinden gerçek bağıl nem
- e = 17,62
- Tn = 243,12
Mutlak nem
Mutlak nem, belirli bir kuru hava hacmindeki su buharının kütlesidir. Mutlak nem, gram/metre3 cinsinden ölçülür. Aşağıdaki denklemde mutlak nemi nasıl hesaplayabileceğiniz gösterilmektedir:
Burada,
- dv = gram/metre cinsinden mutlak nem3
- t = C derece olarak gerçek sıcaklık
- Bağıl nem = yüzde (%) cinsinden gerçek bağıl nem
- e = 17,62
- Tn = 243,12 C derece
- A = 6,112 hPa