Sensörler

Vikipedia'ya göre sensör ya da algılayıcı, yaptığı işe göre çevresindeki olayları ve değişiklikleri algılayan ve onları bildiren nesnelere verilen genel ad. Android işletim sistemi için cihazın türüne ve kapasitesine göre birçok sensör olabilmektedir. Android dökümanlarına göre şuan için 3 çeşit sensör desteklenmektedir.

  • Hareket Sensörleri

    Bu sensörler genel olarak hareketi ölçmektedir. Hareket bu sensörler için 3 eksen üzerinde de ölçülebilmektedir. Bu sensörler accelerometre, yer çekimi sensörü, jiroskop ve rotational vektör sensörleridir.

  • Çevresel Sensörler

    Bu sensörler genel olarak çevresel değişiklikleri algılayan sensörlerdir. Bu sensörler barometreler, fotometreler, termometreler gibi sensörlerdir.

  • Pozisyon Sensörleri

    Bu sensörler cihazın fiziksel pozisyonuna ilişkin değişiklikleri algılayan sensörlerdir. Orientation ve magnetometre gibi sensörler vardır. Bu sensörler dışında başka sensörlerde olabilir. Android işletim sistemin ismine "androidSensor" denilen ortamı yardımıyla istenen istemler yapılabilmektedir.

    Cihaz Üzerinde Bulunan Sensörlerin Bilgilerinin Elde Edilmesi

    Genel olarak bir sensör, Sensor isimli bir sınıf ile temsil edilmiştir. Bu sınıf herhangi sensöre ilişkin bilgileri ve davranışları tutmaktadır.

  • Sensor sınıfı android.hardware paketi içerisinde bildirilmiştir.

  • Sensor sınıfının getName metodu sensörün String türünden ismini döndürmektedir.

  • Cihazın desktelediği sensörler, SensorService isimli bir sistem sabiti servis ile elde edilebilir. Bu servisten SensorMaganer isimli bir sınıf nesnesi elde edilir.

  • SensorMaganer sınıfının getSensorList isimli metodu istenilen türdeki sensörlerin listesini List referansı ile vermektedir.

  • İstenilen sernsorlere ilişkin sensörlere, sensor sınıfının TYPE_XXX sabitleri getSensorList metoduna arguman olarak geçilerek elde edilebilir.

  • Örneğin tüm sensorleri TYPE_ALL isimli sabiti getSensorList metoduna arguman olarak geçerek elde edebiliriz.

095-SensorList

Android Üzerinde Sensör Verilerinin Elde Edilmesi

Android işletim sistemi üzerinde sensörlerin kullanımı basitleştirilmeye çalıştırılmıştır. Genel yöntem çoğu kez değişmese de, elde edilen datalar bazı sensörler için gürültülü(noisy) olabilmektedir. Böylesi sensörler için programcının duruma göre alçak geçiren (low-pass) veya yüksek geçiren (high-pass) filtreler uygulayarak, veriyi gürültülerden arındırması gerekir. SensorEventListener Arayüzü Sensörlerin birçoğunun elde ettiği veriler, SensorEventListener arayüzünün içindeki metotlarla elde edilebilir. SensorEventListener arayüzü dışında bazı sensörler bir olay tetikleyerek veriyi bize iletirler. Hangi sensörün nasil çalıştığına ilişkin ilgili sensör bilgileri

  • Çevresel Sensörler Çevresel sensörler genel olarak cihaz dışından bilgi almak için kullanılan sensörlerdir. Tipik sensörler şunlardır:

| Sensor | Sensor Event Data | Units of Measure | Data Description || :--- | :--- | :--- | :--- || TYPE_AMBIENT_TEMPERATURE | event.values[0] | °C | Ambient air temperature. || TYPE_LIGHT | event.values[0] | lx | Illuminance. || TYPE_PRESSURE | event.values[0] | hPa or mbar | Ambient air pressure. || TYPE_RELATIVE_HUMIDITY | event.values[0] | % | Ambient relative humidity. || TYPE_TEMPERATURE | event.values[0] | °C | Device temperature. | Işık Sensörü Işık sensörü SensorManager referanrası elde edildiğinde Sensor sınıfının TYPE_LIGHT isimli sabiti ile elde edilebilir. SensorManager m_sensorManager = (SensorManager)this.getSystemServices(SENSOR_SERVICE); Sensor m_sensorLight = m_sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); Herhangi bir sensörü elde edebilmek için Sensor sınıfının getDefaultSensor metodu çağırılır. Bu metod aldığı parametre değerine ilişkin Sensor referansını döndürür. Eğer cihazda bu sensör desteklenmiyorsa, bu metod null değeri ile geri döner.

096-LightSensor Bir sensörün kullanılabilmesi için o servise register edilmesi gerekir. Bunun için registerListener metodu kullanılabilir. Yine sensör bilgileri alınmayacaksa unregisterListener metodu ile onSensorChanged metodunun çağrılması durdurulmalıdır.

Bir Activity'nin Parlaklığının Değiştirilmesi

Her Activity aslında Window isimli bir sınıf ile temsil edilebilmektedir. O an aktif olan Activity'e ilişkin Window referansı Activity sınıfının getWindow isimli bir metodu ile elde edilebilir. Window nesnesi elde edildiğinde getAttributes isimli metodu ile WindowsManagerLayoutParams türünden bir referans elde edilebilir. Bu attribute'lar pencereye ilişkin Attribute'lardır. Örn screenBrightness isimli attribute [0, 1] aralığında ışıma bilgisini tutmaktadır. Buna göre bu parlaklık bilgisi değiştirilerek Windows sınıfının setAttribute metodu ile yeni biçimlendirilmiş attribute olarak verilebilir. Bu durumda ilgili Window'a ilişkin parlaklık bilgisi değiştirilmiş olur. 097-WindowBrightness

Parlaklık 0 ile 255 arasında bir sayı olarak düşünülüp ona göre normalize edilebilir.

Programcı parlaklık değerini tekrar kullanıcaksa saklamalıdır, screen orientation bile olsa bu parlaklık kaybedilecektir.

Cihazın Ekran Parlaklığının Değiştirilmesi

Cihaza ilişkin ayarların değiştirilmesi, Settings isimli bir sınıf yardımıyla yapılmaktadır. Buna göre cihazın ekran parlaklığının da değiştirilmesi için bu sınıftan faydal. Ekran parlaklığı değişimi, izne tabidir. Bu izin tehlikeli bir izin olarak görülmektedir.(Runtime Permission). Bu izin android.permission.WRITE_SETTINGS ile belirlenmiştir. Settings sınıfının System sınıfı içerisindeki putXXX metotları ile ayarlara ilişkin çeşitli bilgiler değiştirilebilmektedir. getXXX metotları ile bu ayarlar elde edilebilmektedir. Aslında bu ayarlar birer ContentProvider olarak sunulmaktadır. Settings sınıfının settings.system.SCREEN_BRIGHTNESS_MODE sabiti ile MODE bilgisi değiştirilebilmektedir.

settings.system.SCREEN_BRIGHTNESS_AUTOMATIC

settings.system.SCREEN_BRIGHTNESS_MANUAL Ayrıca MODE bilgisi getInt metotları ile int türden sabitler olarak ele alınabilmektedir. try { int val = Settings.System.getInt(this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); if (val == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) Toast.makeText(this, "Automatic", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Manual", Toast.LENGTH_LONG).show(); } catch (Throwable ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show(); } Cihazın parlaklık değeri 0 ile 255 arasında bir int değerdir.

BASINÇ SENSÖRÜ

Basınç sensörü çevredeki basıncı hectoPascal ya da mBar cinsinden sensorEventListener ile verir. [DROPBOX]099-PressureSensor

TEMPERATURE SENSÖRLERİ

Temperature senörlerine ilişkin bilgi TYPE_AMBIENT_TEMPERATURE ve TYPE_TEMPERATURE ile iki şekilde alınabilir .TYPE_TEMPERATURE sabiti Android 4.0 (API_LEVEL_14) ile deprecateddır.Bu sensörler santigrat derece cinsinden değer vermektedirler. Işık ve basınç sensöründe olduğu gibi event.values[0] elemanı ile bu değer elde edilebilir.

HUMIDITY SENSÖR

Nem sensörü ortamın nemini vermektedir.Buna göre çeşitli bilgiler hesaplanabilir.

MOTION SENSÖR

Hareket sensörleri genel olarak hareketi algılayan sensörlerdir.Bu sensörlerden elde edilen dataların hepsi işlenmiş olmaya bilir.Bu durumda programcının bu dataları işlemesi gerekebilir.İşlenmemiş data veren bir çok sensör için Android dökümanları da birçok yöntem önerilmiştir.Bu yöntemler işe yarayabilir. Bazı sensörler 3 boyutlu data vermektedirler.Bir koordinat sistemi kullanırlar.Bu koordinat sistemine Sensor Koordinat Sistemi denir.Sensör koordinat sistemi kullanan sensörler şunlardır:

  • Acceleration Sensör

  • Gravity Sensör

  • Gyroscope

  • Linear acceleration Sensör

  • Geomagnetic field Sensör

    Sensör Koordinat sistemi cihaza göre düşünülmelidir.Cihaza karşıdan baktığınızda sağ taraf X ekseni Yukarı doğru Y ekseni bakana doğru Z eksenini göstermektedir.

Step Counter Sensör

Adım sayar sensörü hemen hemen tüm cihazlarda bulunmaktadır.Hassas olarak adımları sayar. Step Counter sensörü gecikmeli bir sensör olabilmektedir.Kaynaklara göre 10 saniye kadar gecikme gösterebilir.

Significant Motion Sensör

Bu sensör herhangi bir hareket olduğunda aktive olan daha sonra kendisini kapatan (disable) eden bir sensördür.Bu sensör yürüme , oturma , kalkma , araç içinde seyahet , bisiklete binme gibi hareketleri algıayabilir.Bu sensör sernsorEventListener arayüzü ile dinlenemez.Herhangi bir hareket oluştuğunda tetiklenir.Bu tetiklemeyi dinlemek için TriggerEventListener arayüzünün onTrigger metodu override edilmedilir.Ayrıca SensorManager sınıfının requestTriggerSensor metodu ile dinleme aktif hale getirilmelidir.

Bu event bir kez tetiklenir.Tekrar tetiklenebilmesi için tekrar request yapılması gereklidir.Bunun için event tetiklendiğinde requestTriggerSensor tekrar çağrılabilir.

[Dropbox]102-SignificationMotionSensor

Accelerotion Sensörü

İvmelenme Sensörü cihaza uygulanan ivmeyi yer çekimi kuvvetiyle birlikte ölçen sensörüdür.Bu sensörün ayarlanması için yerçekiminin çıkartılması gerekmektedir.Yer çekiminin hesabı için çeşitli yöntemler kullanılabilmektedir.Andorid Standart Dökümanlarında belirtilen alçak geçiren filtre(low pass filter) kullanılabilmektedir.

[DROPBOX]103-Accelerometer

Gravitiy Sensör(Yer Çekimi )

3 konumlu yer çekimi bilgisini almak için kullanılan sensördür.Bu sensör cihaz durgun haldeyken accelerometer ile aynı değeri verir.

[DROPBOX]104-Gravity

Linear Accelerometer Sensörü

Bu sensör her cihazda bulunmayabilir.Normal akselerometre sensörünün filtrelenmiş biçimi yani yer çekimi çıkartılmış biçimidir.Bu sensörün bir başlangıç (offset) değeri bulunmaktadır . Gerçek datanın elde edilmesi için bu offset değerinin silinmesi gerekmektedir.Bunun için cihazın masaüstündeki hareketsiz durumu baz alınabilir.

[Dropbox]105-LinearAccelerometer