Android destekli çoğu cihazın hareketi, yönü ve hızı ölçen yerleşik sensörleri vardır. çeşitli çevresel koşullar var. Bu sensörler yüksek oranda ham veri sağlayabilir hassasiyet ve doğruluk sağlar. Üç boyutlu cihaz hareketlerini izlemek veya ya da bir cihazın yakınındaki ortam ortamındaki değişiklikleri izlemek istiyorsanız. Örneğin, bir oyun; eğim, sallama, döndürme veya sallanma gibi karmaşık kullanıcı hareketlerini ve hareketlerini anlamak için cihazın yerçekimi sensöründen gelen okumaları izleyebilir. Benzer şekilde, bir hava durumu uygulaması çiy noktasını hesaplamak ve raporlamak için cihazın sıcaklık sensörü ve nem sensörü uygulama, pusulayı raporlamak için jeomanyetik alan sensörü ve ivme ölçer kullanabilir değer.
Aşağıdaki ilgili kaynaklara bakın:
Android platformu üç geniş sensör kategorisini destekler:
- Hareket sensörleri
Bu sensörler, üç eksen boyunca ivme kuvvetlerini ve dönme kuvvetlerini ölçer. Bu Kategori ivme ölçerleri, yer çekimi sensörleri, jiroskoplar ve dönme vektörünü içerir olabilir.
- Çevre sensörleri
Bu sensörler, ortam hava sıcaklığı gibi çeşitli çevre parametrelerini ölçer ile basınç, aydınlatma ve nem. Barometreler, fotometreler ve termometreler bu kategoriye dahildir.
- Konum sensörleri
Bu sensörler bir cihazın fiziksel konumunu ölçer. Bu kategori şunları içerir: yön sensörleri ve manyetometreler.
Android'i kullanarak cihazda bulunan sensörlere erişebilir ve ham sensör verileri alabilirsiniz yardımcı olabilir. Sensör çerçevesi, geniş bir yelpazede karmaşık ölçümler yapmanıza yardımcı olan birçok sınıf ve arayüz sunar. çeşitli görevlere göz atabilirsiniz. Örneğin, sensör çerçevesini kullanarak aşağıdakileri yapabilirsiniz:
- Bir cihazda hangi sensörlerin kullanılabilir olduğunu belirleyin.
- Bir sensörün maksimum menzili, üreticisi, güç gereksinimleri ve çözünürlüğü gibi özelliklerini belirleyin.
- Ham sensör verilerini edinme ve sensör verilerini elde ettiğiniz minimum hızı tanımlayın.
- Sensör değişikliklerini izleyen sensör etkinliği işleyicilerini kaydedin ve kaydedilmelerini iptal edin.
Bu konuda, Android platformunda bulunan sensörlere genel bir bakış sunulmaktadır. Ayrıca sensör çerçevesine giriş de sağlar.
Sensörlere Giriş
Android sensör çerçevesi pek çok sensör türüne erişmenize olanak tanır. Bu sensörlerin bazıları donanıma, bazıları ise yazılıma dayanır. Donanım tabanlı sensörler, cep telefonuna veya tablet cihaza yerleştirilmiş fiziksel bileşenlerdir. Verilerini, hızlanma, jeomanyetik alan gücü veya açısal değişim gibi belirli çevresel özellikleri doğrudan ölçerek elde ederler. Yazılım tabanlı sensörler fiziksel cihaz değildir, ancak donanım tabanlı sensörleri taklit eder. Yazılım tabanlı sensörler bir veya daha fazla donanım tabanlı sensörden veri elde edebilir ve bazen yapay sensörler olabilir. Doğrusal ivme sensörü ve yerçekimi sensörü, sensörler kullanır. Tablo 1'de Android'in desteklediği sensörler özetlenmektedir. platformu.
Her türde sensöre sahip olan Android destekli cihaz sayısı çok azdır. Örneğin, çoğu cep telefonu ve tablette ivme ölçer ve manyetometre bulunur ancak daha az sayıda cihazda barometre veya termometre bulunur. Ayrıca, bir cihaz belirli bir türde birden fazla sensöre sahip olabilir. Örneğin, bir cihazda her biri farklı bir aralığa sahip iki yerçekimi sensörü olabilir.
Tablo 1. Android platformu tarafından desteklenen sensör türleri.
Sensör | Tür | Açıklama | Yaygın Kullanımlar |
---|---|---|---|
TYPE_ACCELEROMETER |
Donanım | Yer çekimi kuvveti dahil olmak üzere üç fiziksel eksende (x, y ve z) bir cihaza uygulanan ivme kuvvetini m/s2 cinsinden ölçer. | Hareket algılama (titreme, yatırma vb.). |
TYPE_AMBIENT_TEMPERATURE |
Donanım | Odanın ortam sıcaklığını Santigrat (°C) cinsinden ölçer. Aşağıdaki notu inceleyin. | Hava sıcaklıkları izleniyor. |
TYPE_GRAVITY |
Yazılım veya Donanım | Üç fiziksel eksende (x, y, z) bir cihaza uygulanan yerçekimi kuvvetini m/s2 cinsinden ölçer. | Hareket algılama (sallanma, eğme vb.). |
TYPE_GYROSCOPE |
Donanım | Bir cihazın üçünün her biri etrafında rad/sn. cinsinden dönme hızını ölçer fiziksel baltalar (x, y ve z). | Döndürme algılama (dönme, döndürme vb.). |
TYPE_LIGHT |
Donanım | Ortam ışığı seviyesini (aydınlatma) Lx cinsinden ölçer. | Ekran parlaklığını kontrol etme. |
TYPE_LINEAR_ACCELERATION |
Yazılım veya Donanım | İvme kuvvetini m/sn2 cinsinden ölçer. şurada bir cihaza uygulandı: yer çekimi kuvveti hariç üç fiziksel eksenin (x, y ve z) yer aldığı içerikler | Tek bir eksende ivmeyi izleme. |
TYPE_MAGNETIC_FIELD |
Donanım | Üç fiziksel eksenin (x, y, z) ortamının jeomanyetik alanını ölçer μT. | Pusula oluşturuluyor. |
TYPE_ORIENTATION |
Yazılım | Bir cihazın üç fiziksel eksenin (x, y, z) etrafında yaptığı dönme derecelerini ölçer.
API düzeyi 3'ten itibaren, getRotationMatrix()
yöntemiyle birlikte yer çekimi sensörünü ve jeomanyetik alan sensörünü kullanarak bir cihazın eğim matrisini ve dönme matrisini elde edebilirsiniz. |
Cihaz konumu belirleniyor. |
TYPE_PRESSURE |
Donanım | Ortamdaki hava basıncını hPa veya mbar cinsinden ölçer. | Hava basıncı değişikliklerini izleme. |
TYPE_PROXIMITY |
Donanım | Bir nesnenin cihazın görüntü ekranına göre yakınlığını cm cinsinden ölçer. Bu sensör, genellikle telefonun durup tutulmadığını belirlemek için kullanılır. bir insan kulağı. | Telefonun arama sırasındaki konumu. |
TYPE_RELATIVE_HUMIDITY |
Donanım | Bağıl ortam nemini yüzde (%) cinsinden ölçer. | Çiy noktası, mutlak nem ve bağıl nemi izleme. |
TYPE_ROTATION_VECTOR |
Yazılım veya Donanım | Cihazın dönme vektörünün üç öğesini sağlayarak cihazın yönünü ölçer. | Hareket algılama ve döndürme algılama. |
TYPE_TEMPERATURE |
Donanım | Cihazın sıcaklığını Santigrat (°C) cinsinden ölçer. Bu sensör
uygulama, cihaza göre farklılık gösterir
bu sensör şurada TYPE_AMBIENT_TEMPERATURE sensörüyle değiştirildi:
API Düzeyi 14 |
Sıcaklıkları izleme |
Sensör Çerçevesi
Android sensör çerçevesini kullanarak bu sensörlere erişebilir ve ham sensör verilerini edinebilirsiniz.
Sensör çerçevesi, android.hardware
paketinin bir parçasıdır ve aşağıdakileri içerir
sınıflar ve arayüzler:
SensorManager
- Sensör hizmetinin örneğini oluşturmak için bu sınıfı kullanabilirsiniz. Bu sınıf, sensörlere erişmek ve sensörleri listelemek, sensör etkinliği dinleyicilerini kaydetmek ve kayıtlarını iptal etmek ve yön bilgilerini edinmek için çeşitli yöntemler sağlar. Bu sınıf ayrıca çeşitli sensör sabitleri sağlar sensör doğruluğunu raporlamak, veri edinme hızlarını ayarlamak ve sensörleri kalibre etmek için kullanılır.
Sensor
- Belirli bir sensörün örneğini oluşturmak için bu sınıfı kullanabilirsiniz. Bu sınıf, bir sensörün özelliklerini belirlemenize olanak tanıyan çeşitli yöntemler sunar.
SensorEvent
- Sistem, bu sınıfı kullanarak bir sensör etkinliği nesnesi oluşturur. Bu nesne, nesne hakkında bilgi sağlayan sensör olayına bakalım. Sensör etkinliği nesnesi aşağıdaki bilgileri içerir: ham sensör verileri, etkinliği oluşturan sensör türü, verilerin doğruluğu ve etkinliğin zaman damgası.
SensorEventListener
- Bu arayüzü kullanarak, sensör değerleri veya sensör doğruluğu değiştiğinde bildirim (sensör etkinliği) alan iki geri çağırma yöntemi oluşturabilirsiniz.
Tipik bir uygulamada iki temel görevi gerçekleştirmek için sensörle ilgili bu API'leri kullanırsınız:
- Sensörleri ve sensör özelliklerini belirleme
Uygulamanızda belirli sensör türlerine veya özelliklerine dayalı özellikler varsa sensörleri ve sensör özelliklerini çalışma zamanında tanımlamak faydalıdır. Örneğin, ekip arkadaşlarınızın bir cihazda bulunan tüm sensörleri tanımlama ve uygulama özelliklerini devre dışı bırakma sensörlere dayalı çalışır. Benzer şekilde, uygulamanız için optimum performansa sahip sensör uygulamasını seçebilmek amacıyla belirli bir türdeki tüm sensörleri tanımlamak isteyebilirsiniz.
- Sensör etkinliklerini izleme
Ham sensör verilerini elde etme yönteminiz, sensör etkinliklerini izlemektir. Her seferinde bir sensör olayı meydana gelir Bir sensör ölçtüğü parametrelerde değişiklik algılar. Sensör etkinliği, Bunlar dört ayrı bilgi içeriyor: etkinliği tetikleyen sensörün adı, Etkinliğin zaman damgası, etkinliğin doğruluğu ve tetikleyiciyi tetikleyen ham sensör verileri etkinliği tıklayın.
Sensör Kullanılabilirliği
Sensör kullanılabilirliği cihazdan cihaza değişse de Android'e göre de değişebilir. sürümleri vardır. Bunun nedeni, Android sensörlerinin birkaç teknoloji geliştirme sürecinde platform sürümleri. Örneğin, birçok sensör Android 1.5'te (API Düzeyi 3) kullanıma sunulmuştur, ancak bazı sensörler uygulanmamıştır ve Android 2.3'e (API Düzeyi 9) kadar kullanılamıyordu. Aynı şekilde, Android 2.3 (API Düzeyi 9) ve Android 4.0 (API Düzeyi 14) için birkaç sensör kullanıma sunuldu. İki sensörün desteği sonlandırıldı ve daha yeni, daha iyi sensörlerle değiştirildi.
Tablo 2'de her sensörün platform bazında kullanılabilirliği özetlenmiştir. Yalnızca dört platformlar listelenmektedir. Bunun nedeni, bu platformların sensör değişikliklerinin yapıldığı platformlardır. Sensörler: desteği sonlandırılmış olarak listelenen platformlar sonraki platformlarda hâlâ kullanılabilir ( sensörü olması) gerekir. Bu, Android'in ileriye dönük uyumluluk politikasına uygundur.
Tablo 2. Platforma göre sensör kullanılabilirliği.
Sensör | Android 4.0 (API düzeyi 14) |
Android 2.3 (API düzeyi 9) |
Android 2.2 (API Düzeyi 8) |
Android 1.5 (API Düzeyi 3) |
---|---|---|---|---|
TYPE_ACCELEROMETER |
Evet | Evet | Evet | Evet |
TYPE_AMBIENT_TEMPERATURE |
Evet | Yok | Yok | Yok |
TYPE_GRAVITY |
Evet | Evet | Yok | Yok |
TYPE_GYROSCOPE |
Evet | Evet | yok1 | Yok1 |
TYPE_LIGHT |
Evet | Evet | Evet | Evet |
TYPE_LINEAR_ACCELERATION |
Evet | Evet | Yok | Yok |
TYPE_MAGNETIC_FIELD |
Evet | Evet | Evet | Evet |
TYPE_ORIENTATION |
Evet2 | Evet2 | Evet2 | Evet |
TYPE_PRESSURE |
Evet | Evet | yok1 | Yok1 |
TYPE_PROXIMITY |
Evet | Evet | Evet | Evet |
TYPE_RELATIVE_HUMIDITY |
Evet | Yok | Yok | Yok |
TYPE_ROTATION_VECTOR |
Evet | Evet | Yok | Yok |
TYPE_TEMPERATURE |
Evet2 | Evet | Evet | Evet |
1 Bu sensör türü, Android 1.5 (API Düzeyi) sürümünde kullanıma sunulmuştur. 3), ancak Android 2.3'e (API Düzeyi 9) kadar kullanıma hazır değildi.
2 Bu sensör kullanılabilir ancak desteği sonlandırılmıştır.
Sensörleri ve Sensör Becerilerini Tanımlama
Android sensör çerçevesi, çalışma zamanında bir cihazda hangi sensörlerin bulunduğunu belirlemenizi kolaylaştıran çeşitli yöntemler sunar. API, uygulamanızın veya oyununuzun her bir sensörün maksimum menzili, çözünürlüğü ve gücü gibi özellikleri gereksinimlerini karşılayın.
Bir cihazdaki sensörleri belirlemek için öncelikle sensöre referans vermeniz gerekir.
geliştirmenizi sağlar. Bunu yapmak için getSystemService()
yöntemini çağırıp SENSOR_SERVICE
bağımsız değişkenini ileterek SensorManager
sınıfının bir örneğini oluşturursunuz. Örnek:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Daha sonra,
getSensorList()
yöntemini ve TYPE_ALL
sabitini kullanmaktır. Örnek:
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
Belirli bir türdeki tüm sensörleri listelemek isterseniz yerine başka bir sabit değer kullanabilirsiniz
TYPE_ALL
; ör. TYPE_GYROSCOPE
,
TYPE_LINEAR_ACCELERATION
veya
TYPE_GRAVITY
.
Ayrıca, getDefaultSensor()
yöntemini kullanıp cihazın türünü ileterek belirli bir tür sensörün olup olmadığını belirleyebilirsiniz.
belirli bir sensör için sabit değer. Bir cihazda belirli bir türde birden fazla sensör varsa sensörlerden biri varsayılan sensör olarak atanmalıdır. Belirli bir değer için varsayılan sensör
yöntem çağrısı, null değeri döndürür, yani cihazda bu tür bir özellik yoktur
görebilirsiniz. Örneğin, aşağıdaki kod bir cihazda manyetometre olup olmadığını kontrol eder:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) { // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
Not: Android, cihaz üreticilerinin herhangi bir uygulama Android destekli cihazlarına belirli türlerde sensörleri eklemektir. Böylece, cihazlar çok çeşitli sensör yapılandırmaları.
Bir cihazdaki sensörleri listelemenin yanı sıra,
bireyin yeteneklerini ve özelliklerini belirlemek için Sensor
sınıfı
olabilir. Bu, uygulamanızın hangi sensörlere veya ürüne bağlı olarak farklı davranışlar
cihazda kullanılabilen sensörler. Örneğin, getResolution()
ve getMaximumRange()
kullanabilirsiniz.
kullanarak bir sensörün çözünürlüğünü ve maksimum ölçüm aralığını bulmayı deneyin. Bir sensörün güç gereksinimlerini elde etmek için getPower()
yöntemini de kullanabilirsiniz.
Herkese açık yöntemlerden ikisi, özellikle uygulamanızı optimize ederken
sensörler için kullanabilirsiniz. Örneğin, uygulamanızın eğilme ve sallama gibi kullanıcı hareketlerini izlemesi gerekiyorsa belirli bir tedarikçinin yerçekimi sensörüne sahip olan yeni cihazlar için bir veri filtreleme kuralı ve optimizasyon grubu, yerçekimi sensörü olmayan ve yalnızca ivmeölçer bulunan cihazlar için de başka bir veri filtreleme kuralı ve optimizasyon grubu oluşturabilirsiniz. Aşağıdaki kod örneğinde, şunları yapmak için getVendor()
ve getVersion()
yöntemlerini nasıl kullanabileceğiniz gösterilmektedir
bu. Bu örnekte, tedarikçi olarak Google LLC ve şirketini listeleyen bir yer çekimi sensörü arıyoruz.
sürüm numarası 3'tür. Söz konusu sensör cihazda yoksa
ivme ölçer.
private lateinit var sensorManager: SensorManager private var mSensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) { val gravSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_GRAVITY) // Use the version 3 gravity sensor. mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 } } if (mSensor == null) { // Use the accelerometer. mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) } else { // Sorry, there are no accelerometers on your device. // You can't play this game. null } }
private SensorManager sensorManager; private Sensor mSensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = null; if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i<gravSensors.size(); i++) { if ((gravSensors.get(i).getVendor().contains("Google LLC")) && (gravSensors.get(i).getVersion() == 3)){ // Use the version 3 gravity sensor. mSensor = gravSensors.get(i); } } } if (mSensor == null){ // Use the accelerometer. if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } else{ // Sorry, there are no accelerometers on your device. // You can't play this game. } }
Faydalı bir diğer yöntem de getMinDelay()
yöntemidir.
bir sensörün verileri algılamak için kullanabileceği minimum zaman aralığını (mikrosaniye cinsinden) döndürür. getMinDelay()
yöntemi için sıfır olmayan bir değer döndüren tüm sensörler akış sensörüdür. Akış sensörleri verileri düzenli aralıklarla algılıyor ve Android 2.3 (API)
9. Seviye). getMinDelay()
yöntemini çağırdığınızda bir sensör sıfıra dönerse bu,
sensör bir akış sensörü değildir çünkü yalnızca ölçümde bir değişiklik olduğunda verileri rapor eder
parametreleridir.
getMinDelay()
yöntemi, bir sensörün veri edinebileceği maksimum hızı belirlemenize olanak tanıdığı için kullanışlıdır. Uygulamanızdaki bazı özellikler yüksek veri gerektiriyorsa
akış sensörü kullanıyorsanız, bu yöntemi kullanarak bir sensörün
karşıladıktan sonra uygulamanızdaki ilgili özellikleri etkinleştirebilir veya devre dışı bırakabilirsiniz
buna göre hazırlar.
Dikkat: Bir sensörün maksimum veri edinme hızı, sensör çerçevesinin sensör verilerini uygulamanıza ilettiği hız olmayabilir. İlgili içeriği oluşturmak için kullanılan Sensör çerçevesi, verileri sensör etkinlikleri aracılığıyla raporlar ve çeşitli faktörler, uygulamanızın sensör etkinliklerini alıp almadığını gösterir. Daha fazla bilgi için Sensör Etkinliklerini İzleme bölümüne bakın.
Sensör Etkinliklerini İzleme
Ham sensör verilerini izlemek için, cihaza ait API'leri hassas şekilde deneyerek
SensorEventListener
arayüzü: onAccuracyChanged()
ve onSensorChanged()
. Android sisteminin çağrıları
aşağıdaki durumlarda bu yöntemleri kullanabilirsiniz:
- Sensörün doğruluğu değişir.
Bu durumda sistem,
onAccuracyChanged()
yöntemini çağırır ve değişenSensor
nesnesine ve sensörün yeni doğruluğuna dair bir referans sağlar. Doğruluk, dört durum sabitinden biriyle gösterilir:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, veyaSENSOR_STATUS_UNRELIABLE
. - Bir sensör yeni bir değer bildirir.
Bu durumda sistem
onSensorChanged()
yöntemini çağırarakSensorEvent
nesnesi.SensorEvent
nesnesi Yeni sensör verileri hakkında; verilerin doğruluğu, verileri oluşturan sensör, verilerin oluşturulduğu zaman damgası ve yeni veriler yer alır.
Aşağıdaki kodda, onSensorChanged()
yönteminin ışık sensöründen gelen verileri izlemek için nasıl kullanılacağı gösterilmektedir. Bu örnekte, main.xml dosyasında sensor_data
olarak tanımlanan bir TextView
içinde ham sensör verileri gösterilmektedir.
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var mLight: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. val lux = event.values[0] // Do something with this sensor value. } override fun onResume() { super.onResume() mLight?.also { light -> sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { super.onPause() sensorManager.unregisterListener(this) } }
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor mLight; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. float lux = event.values[0]; // Do something with this sensor value. } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } }
Bu örnekte, registerListener()
yöntemi çağrıldığında varsayılan veri gecikmesi (SENSOR_DELAY_NORMAL
) belirtilir. Veri gecikmesi (veya örnekleme hızı), onSensorChanged()
geri arama yöntemi aracılığıyla sensör etkinliklerinin uygulamanıza gönderilme aralığını kontrol eder. Varsayılan
Veri gecikmesi, izleme için uygun
normal ekran yönü değiştiğinde ve 200.000 mikrosaniyelik bir gecikme kullanır. SENSOR_DELAY_GAME
(20.000 mikrosaniye gecikme), SENSOR_DELAY_UI
(60.000 mikrosaniye gecikme) veya SENSOR_DELAY_FASTEST
(0 mikrosaniye gecikme) gibi başka veri gecikmeleri de belirtebilirsiniz. Android 3.0 (API seviyesi 11) itibarıyla gecikmeyi mutlak değer olarak da (mikrosaniye cinsinden) belirtebilirsiniz.
Belirttiğiniz gecikme yalnızca önerilen bir gecikmedir. Android sistemi ve diğer uygulamalar bu gecikmeyi değiştirebilir. En iyi uygulama olarak olası en büyük gecikmeyi sistem genellikle belirttiğinizden daha küçük bir gecikme kullanır (yani yine de uygulamanızın ihtiyaçlarını karşılayan en yavaş örnekleme hızı). Daha uzun bir gecikme kullanmak, işlemciye daha az yük bindirir ve dolayısıyla daha az güç tüketir.
Sensör çerçevesinin uygulamanıza sensör etkinlikleri gönderme hızını belirlemek için herkese açık bir yöntem yoktur. Ancak, çeşitli etkinliklerdeki örnekleme hızını hesaplamak için her sensör etkinliğiyle ilişkili zaman damgalarını kullanabilirsiniz. Etiketleme için örnekleme hızını (gecikme) belirler. Herhangi bir nedenle gecikmeyi değiştirmeniz gerekirse sensör dinleyicisinin kaydını iptal edip yeniden kaydetmeniz gerekir.
Bu örnekte, sensör etkinliği dinleyicisini kaydetmek ve kaydını iptal etmek için onResume()
ve onPause()
geri çağırma yöntemlerinin kullanıldığını da belirtmek önemlidir. En iyi uygulama olarak ihtiyacınız olmayan sensörleri her zaman devre dışı bırakmanız gerekir. Özellikle de
etkinliği duraklatıldı. Bazı sensörlerin önemli güç gereksinimleri olduğundan ve pil gücünü hızlı bir şekilde tüketebildiğinden, bunu yapmamak pilin birkaç saat içinde tükenmesine neden olabilir. Sistem
ekran kapandığında sensörleri otomatik olarak devre dışı bırakmaz.
Farklı Sensör Yapılandırmalarını İşleme
Android, cihazlar için standart bir sensör yapılandırması belirtmez. Bu, cihaz üreticilerinin istedikleri sensör yapılandırmasını Android destekli cihazlarına dahil edebileceği anlamına gelir. Sonuç olarak, cihazlar çok çeşitli yapılandırmalarda çeşitli sensörler içerebilir. Uygulamanız belirli bir sensör türünü kullanıyorsa uygulamanızın başarılı bir şekilde çalışabilmesi için bu sensörün cihazda bulunduğundan emin olmanız gerekir.
Belirli bir sensörün cihazda bulunduğundan emin olmak için iki seçeneğiniz vardır:
- Sensörleri çalışma zamanında algılayın ve uygulama özelliklerini uygun şekilde etkinleştirin veya devre dışı bırakın.
- Belirli sensör yapılandırmalarına sahip cihazları hedeflemek için Google Play filtrelerini kullanın.
Bu seçenekler aşağıdaki bölümlerde ele alınmaktadır.
Çalışma zamanında sensörleri algılama
Uygulamanız belirli bir sensör türünü kullanıyor ancak bu sensöre ihtiyaç duymuyorsa sensörü çalışma zamanında algılamak için sensör çerçevesini kullanabilir ve ardından uygulama özelliklerini uygun şekilde devre dışı bırakabilir veya etkinleştirebilirsiniz. Örneğin, bir navigasyon uygulaması sıcaklık, barometrik basınç, konum ve pusula yönünü görüntülemek için sıcaklık sensörünü, basınç sensörünü, GPS sensörünü ve jeomanyetik alan sensörünü kullanabilir. Bir cihazda basınç sensörü yoksa sensör çerçevesini kullanarak çalışma zamanında basınç sensörünün yokluğunu algılayabilir ve ardından uygulamanızın kullanıcı arayüzünde basıncı gösteren kısmı devre dışı bırakabilirsiniz. Örneğin, aşağıdaki kod bir cihazda basınç sensörü olup olmadığını kontrol eder:
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) { // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){ // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
Belirli sensör yapılandırmalarını hedeflemek için Google Play filtrelerini kullanma
Uygulamanızı Google Play'de yayınlıyorsanız
Uygulamanızı diğer cihazlardan filtrelemek için manifest dosyanızda <uses-feature>
öğesi
uygulamanız için uygun sensör yapılandırmasına sahip olmanız gerekir. <uses-feature>
öğesinde, uygulamaları belirli sensörlerin varlığına göre filtrelemenize olanak tanıyan çeşitli donanım tanımlayıcıları bulunur. Listeleyebileceğiniz sensörler şunlardır: ivme ölçer, barometre, pusula (jeomanyetik alan), jiroskop, ışık ve yakınlık. İlgili içeriği oluşturmak için kullanılan
Aşağıda, ivme ölçeri olmayan uygulamaları filtreleyen bir manifest girişi örneği verilmiştir:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
Bu öğeyi ve tanımlayıcıyı uygulamanızın manifest dosyasına eklerseniz kullanıcılar uygulamanızı Google Play'de yalnızca cihazlarında ivmeölçer varsa görür.
Tanımlayıcıyı android:required="true"
yalnızca uygulamanız
tamamen belirli bir sensöre bağlı. Uygulamanızda bazı işlevler için sensör kullanılıyorsa ancak
sensör olmadan çalışmaya devam ediyorsa <uses-feature>
bölümünde sensörü listelemelisiniz.
öğesini kullanın, ancak açıklayıcıyı android:required="false"
değerine ayarlayın. Böylece ekibin
uygulamanızı yüklemek için bu sensöre sahip değillerdir. Bu aynı zamanda bir
uygulamanızda kullanılan özellikleri takip etmenize yardımcı olan
proje yönetimi en iyi uygulamalarından bahsedeceğiz.
Unutmayın: Uygulamanız belirli bir sensör kullanıyor ancak sensör olmadan da çalışıyorsa
çalışma zamanında sensörü algılamalı ve uygulama özelliklerini
uygun olmalıdır.
Sensör Koordinat Sistemi
Genel olarak sensör çerçevesi, veri değerlerini ifade etmek için standart bir 3 eksenli koordinat sistemi kullanır. Çoğu sensör için, koordinat sistemi cihaz etkinleştirildiğinde cihazın ekranına göre tanımlanır. olarak ayarlanır (bkz. Şekil 1). Cihaz varsayılan yönde tutulduğunda X ekseni yatay ve sağa, Y ekseni dikey ve Z ekseni yukarı doğru işaret ediyor eksen ekran yüzeyinin dışını işaret eder. Bu sistemde, ekranın arkasındaki koordinatların Z değerleri negatiftir. Bu koordinat sistemi aşağıdaki sensörler tarafından kullanılır:

Şekil 1. Sensör API'si tarafından kullanılan koordinat sistemi (bir cihaza göre).
Bu koordinat sistemiyle ilgili en önemli nokta, cihazın ekran yönü değiştiğinde eksenlerin değiştirilmemesidir. Yani sensörün koordinat sistemi, cihaz hareket ettikçe hiçbir zaman değişmez. Bu davranış, OpenGL koordinat sisteminin davranışıyla aynıdır.
Anlamanız gereken bir diğer nokta da uygulamanızın, cihazın doğal (varsayılan) yönünün dikey olduğunu varsaymaması gerektiğidir. Birçok tabletin doğal yönü yataydır. Sensör koordinat sistemi her zaman cihazın doğal yönüne dayanır.
Son olarak, uygulamanız sensör verilerini ekrandaki görüntüyle eşleşiyorsa ekran dönüşünü belirlemek için getRotation()
yöntemini, ardından sensör koordinatlarını ekran koordinatlarıyla eşlemek için remapCoordinateSystem()
yöntemini kullanmanız gerekir. Manifest dosyanızda yalnızca dikey ekran belirtilmiş olsa bile bunu yapmanız gerekir.
Not: Bazı sensörler ve yöntemler
dünyanın referans çerçevesine göre (cihazın referans çerçevesinin aksine). Bu
sensörler ve yöntemler, cihaza göre cihaz hareketini veya cihaz konumunu
Google Earth'tür. Daha fazla bilgi için getOrientation()
yöntemine, getRotationMatrix()
yöntemine, Yönleme Sensörü'ne ve Dönme Vektörü Sensörü'ne bakın.
Sensör Hızı Sınırlaması
Uygulamanız aşağıdakileri hedefliyorsa kullanıcılar hakkındaki hassas olabilecek bilgileri korumak için: Android 12 (API düzeyi 31) veya sonraki sürümlerde sistem, yenilemeye bir sınır uygular Belirli hareket sensörlerinden ve konum sensörlerinden gelen veri hızı. Bu veriler, cihazın ivme ölçeri, jiroskopu ve jeomanyetik alan algılayıcısı tarafından kaydedilen değerleri içerir.
Yenileme hızı sınırı, sensör verilerine nasıl eriştiğinize bağlıdır:
- Sensör etkinliklerini izlemek için
registerListener()
yöntemini çağırırsanız sensör örnekleme hızı 200 Hz ile sınırlıdır. Bu durum,registerListener()
yönteminin tüm aşırı yüklenen varyantları için geçerlidir. SensorDirectChannel
sınıfını kullanıyorsanız sensör örnekleme hızı genellikle yaklaşık 50 Hz olanRATE_NORMAL
ile sınırlıdır.
Uygulamanızın hareket sensörü verilerini daha yüksek bir hızda toplaması gerekiyorsa aşağıdaki kod snippet'inde gösterildiği gibi HIGH_SAMPLING_RATE_SENSORS
iznine sahip olduğunuzu belirtmeniz gerekir. Aksi takdirde, uygulamanız bu izni beyan etmeden hareket sensörü verilerini daha yüksek bir hızda toplamaya çalışırsa SecurityException
oluşur.
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
Sensörlere Erişme ve Sensörleri Kullanma ile İlgili En İyi Uygulamalar
Sensör uygulamanızı tasarlarken bu bölümde açıklanan yönergelere uyduğunuzdan emin olun. Bu yönergeler, sensörlere erişmek ve sensör verileri elde etmek için sensör çerçevesini kullanan herkes için önerilen en iyi uygulamalardır.
Yalnızca ön planda sensör verilerini topla
Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda arka planı şu kısıtlamalara sahiptir:
- İvme ölçerler ve jiroskoplar gibi sürekli raporlama modunu kullanan sensörler etkinlik almaz.
- Şunu kullanan sensörler: değiştiğinde veya tek çekim raporlama modları etkinlikleri almaz.
Bu kısıtlamalar göz önünde bulundurulduğunda, veya bir reklamın parçası olarak ön plan hizmeti sunar.
Sensör işleyicilerin kaydını sil
Sensörü kullanmayı bıraktığınızda veya sensör etkinliği duraklatıldığında sensörün dinleyicisinin kaydını sildiğinizden emin olun. Bir sensör dinleyici kayıtlıysa ve etkinliği duraklatılmışsa sensör
Sensörün kaydını iptal etmediğiniz sürece veri toplamaya ve pil kaynaklarını kullanmaya devam eder. Aşağıdaki kodda, bir dinleyicinin kaydını iptal etmek için onPause()
yönteminin nasıl kullanılacağı gösterilmektedir:
private lateinit var sensorManager: SensorManager ... override fun onPause() { super.onPause() sensorManager.unregisterListener(this) }
private SensorManager sensorManager; ... @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); }
Daha fazla bilgi için unregisterListener(SensorEventListener)
sayfasına bakın.
Android Emulator ile test etme
Android Emulator, ivme ölçer, ortam sıcaklığı, manyetometre, yakınlık, ışık gibi sensörleri test etmenize olanak tanıyan bir dizi sanal sensör kontrolü içerir.
Emülatör SdkControllerSensor uygulamasını indirin. Bu uygulamanın yalnızca Android 4.0 (API) çalıştıran cihazlarda kullanılabildiğini unutmayın. 14. seviye) veya daha üst bir seviyedir. (Cihazda Android 4.0 varsa Düzeltme 2 yüklendi.) SdkControllerSensor uygulaması, emülatöre iletir. Emülatör Ardından, tablodaki sensörlerden aldığı yeni değerlere göre en iyi yoludur.
SdkControllerSensor uygulamasının kaynak kodunu aşağıdaki konumda görüntüleyebilirsiniz:
$your-android-sdk-directory /tools/apps/SdkController
Cihazınızla emülatör arasında veri aktarmak için şu adımları uygulayın: için şu adımları izleyin:
- Cihazınızda USB üzerinden hata ayıklama özelliğinin etkin olup olmadığını kontrol edin.
- Bir USB kablosu kullanarak cihazınızı geliştirme makinenize bağlayın.
- Cihazınızda SdkControllerSensor uygulamasını başlatın.
- Uygulamada, taklit etmek istediğiniz sensörleri seçin.
Aşağıdaki
adb
komutunu çalıştırın:- Emülatörü başlatın. Artık bu öğelere dönüşüm uygulayabilmeniz gerekir. emülatörüyle taşıyabilirsiniz.
$ adb forward tcp:1968 tcp:1968
Not: Fiziksel cihazınızda yaptığınız hareketler emülatörde dönüşüm yapmıyorsa 5. adımdaki adb
komutunu tekrar çalıştırmayı deneyin.
Daha fazla bilgi için Android Emulator kılavuzuna bakın.
onSensorChanged() yöntemini engellemeyin
Sensör verileri yüksek bir hızda değişebilir. Bu nedenle sistem, onSensorChanged(SensorEvent)
yöntemini oldukça sık çağırabilir. En iyi uygulama olarak, onSensorChanged(SensorEvent)
yöntemini engellememek için bu yöntemde mümkün olduğunca az işlem yapmanız gerekir. Eğer
sensör verilerini azaltmanız veya filtreleme yapmanız gerekiyorsa,
onSensorChanged(SensorEvent)
yönteminin dışında çalışır.
Desteği sonlandırılmış yöntemleri veya sensör türlerini kullanmaktan kaçının
Birçok yöntem ve sabit değer kullanımdan kaldırıldı.
Özellikle, TYPE_ORIENTATION
sensör türü kullanımdan kaldırıldı. Yön verileri almak için bunun yerine getOrientation()
yöntemini kullanmalısınız. Benzer şekilde
TYPE_TEMPERATURE
sensör türü kullanımdan kaldırıldı. Android 4.0 yüklü cihazlarda bunun yerine TYPE_AMBIENT_TEMPERATURE
sensör türünü kullanmanız gerekir.
Sensörleri kullanmadan önce doğrulama
Bir cihazdan veri almaya çalışmadan önce her zaman cihazda sensör bulunduğundan emin olun. Şunları Yapmayın: bir sensörün sadece sık kullanılan bir sensör olduğunu varsayabilirsiniz. Cihaz üreticileri cihazlarda belirli sensörler sağlaması gerekmez.
Sensör gecikmelerini dikkatli bir şekilde seçin
registerListener()
yöntemiyle bir sensörü kaydederken cihazınız için uygun bir iletim hızı seçtiğinizden emin olun.
bir değişiklik gösterebilir. Sensörler çok yüksek hızlarda veri sağlayabilir. Sistemin ihtiyacınız olmayan ek veriler göndermesine izin vermek sistem kaynaklarını ve pil gücünü tüketir.