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 veya ya da bir cihazın yakınındaki ortam ortamındaki değişiklikleri izlemek istiyorsanız. Örneğin, Oyun, karmaşık kullanıcı hareketlerini anlamak için cihazın yer çekimi sensöründen gelen ölçümleri takip edebilir ve hareketler (eğme, sallama, döndürme veya sallama gibi). 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. Bu kategori barometreleri, fotometreleri ve üzerine konuşacağız.
- 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 API'yi kullanarak cihazda bulunan sensörlere erişebilir ve ham sensör verileri 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, şunları yapmak için sensör çerçevesini kullanabilirsiniz:
- Bir cihazda hangi sensörlerin kullanılabilir olduğunu belirleyin.
- Tek bir sensörün özelliklerini (ör. maksimum menzili, üreticisi, güç) belirleme ve çözüm üzerinde düşünmek önemlidir.
- 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 kayıtlarını silin.
Bu makalede, Android platformunda bulunan sensörlere genel bir bakış sunulmaktadır. Ayrıca sensör çerçevesine giriş niteliğindedir.
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ı bazıları da yazılım tabanlıdır. Donanım tabanlı sensörler, yerleşik olarak bulunan fiziksel bileşenlerdir. cihaza veya tablete dönüştürmenizi sağlar. Spesifik çevresel ölçümleri doğrudan ölçerek verilerini elde ederler ivme, jeomanyetik alan gücü veya açısal değişim gibi özellikleri kullanabilirsiniz. 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 mobil cihaz ve tabletlerde ivme ölçer ve manyetometre bulunur, ancak daha az cihaz ya da termometreler kullanabilirsiniz. Ayrıca, bir cihaz belirli bir türde birden fazla sensöre sahip olabilir. Örneğin, Örneğin bir cihazda, her birinin farklı mesafedeki iki yerçekimi sensörü olabilir.
Tablo 1. Android platformunun desteklediği sensör türleri.
Sensör | Tür | Açıklama | Yaygın Kullanımlar |
---|---|---|---|
TYPE_ACCELEROMETER |
Donanım | Şu cihazda bir cihaza uygulanan ivme kuvvetini m/sn2 cinsinden ölçer yer çekimi kuvveti dahil olmak üzere üç fiziksel eksenin (x, y ve z) kullanımı. | 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 nota bakın. | Hava sıcaklıkları izleniyor. |
TYPE_GRAVITY |
Yazılım veya Donanım | Bir cihaza uygulanan tüm yer çekimi kuvvetini m/sn2 cinsinden ölçer üç fiziksel eksen (x, y, z). | Hareket algılama (titreme, yatırma 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 eksen üzerinde 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önüş derecelerini ölçer.
API düzeyi 3'ten itibaren, her bir anahtar kelime için eğim matrisini ve
kullanarak yerçekimi sensörünü ve jeomanyetik alan sensörünü
getRotationMatrix()
yöntemidir. |
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 yakınlığını cm cinsinden bir nesnenin görüntüleme ekranına göre (cm cinsinden) ölçer. olanak tanır. Bu sensör, genellikle telefonun durup tutulmadığını belirlemek için kullanılır. bir insan kulağı. | Çağrı sırasında telefonun konumu. |
TYPE_RELATIVE_HUMIDITY |
Donanım | Bağıl ortam nemini yüzde (%) cinsinden ölçer. | Çiy noktası, mutlak ve bağıl nem takip ediliyor. |
TYPE_ROTATION_VECTOR |
Yazılım veya Donanım | Cihaza ilişkin üç öğeyi sağlayarak cihazın yönünü ölçer. döndürme vektörüdür. | 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 verileri elde edebilirsiniz.
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 şunları sağlar: Sensörlere erişmek ve bunları listelemek, sensör etkinliğini kaydetmek ve kaydını silmek için çeşitli yöntemler ve yön bilgisi edinme gibi metrikleri içerir. 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, yöntemleri kullanarak bir sensörün özelliklerini belirleyebilirsiniz.
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 etkinlik nesnesi şu bilgileri içerir: ham sensör verileri, etkinliği oluşturan sensör türünü, verilerin doğruluğunu ve etkinliğin zaman damgasını öğrenin.
SensorEventListener
- Bildirim alan iki geri çağırma yöntemi (sensör) oluşturmak için bu arayüzü kullanabilirsiniz. veya sensör doğruluğu değiştiğinde gerçekleşen etkinlikler)
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 tanımlama
Çalışma zamanında sensörleri ve sensör özelliklerini tespit etmek, uygulamanız için veya işlevlerine dayalı özellikler oluşturabilirsiniz. Ö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 tüm sensörleri de tanımlamak isteyebilirsiniz. Böylece, optimum performansa sahip sensör uygulamasını seçebilirsiniz. seçin.
- Sensör etkinliklerini izleme
Ham sensör verilerini elde etme yönteminiz, sensör etkinliklerini izlemedir. 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örlerin desteği sonlandırılarak bunların yerini daha yeni, daha iyi sensörler alır.
Tablo 2'de her bir sensörün kullanılabilirliği platform bazında ö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 bir süredir desteği sonlandırıldı.
Sensörleri ve Sensör Becerilerini Tanımlama
Android sensör çerçevesi, istediğiniz her yerde belirlemenizi kolaylaştıran çeşitli yöntemler sunar. sensörlerin çalışma süresini kısaltmak için de kullanabilirsiniz. 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 aşağıdaki komutu kullanarak SensorManager
sınıfının bir örneğini oluşturursunuz:
getSystemService()
yöntemini çağırmak ve
SENSOR_SERVICE
bağımsız değişkenine ekleyin. Örnek:
Kotlin
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
Java
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Daha sonra,
getSensorList()
yöntemini ve TYPE_ALL
sabitini kullanmaktır. Örnek:
Kotlin
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
Java
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örler 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:
Kotlin
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. }
Java
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. Ayrıca şunu da kullanabilirsiniz:
getPower()
yöntemini kullanın.
Herkese açık yöntemlerden ikisi, özellikle uygulamanızı optimize ederken
sensörler için kullanabilirsiniz. Örneğin, uygulamanız
kaldırma ve sallama gibi kullanıcı hareketlerini izlemesi gerekiyorsa bir veri filtreleme grubu
kurallar ve optimizasyonlar, farklı bir tedarikçinin yer çekimi sensörüne sahip yeni cihazlar için
yer çekimi sensörü olmayan ve bu özelliği kaplayan cihazlar için bir dizi veri filtreleme kuralı ve
yalnızca ivme ölçer. 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'yi ve
sürüm numarası 3'tür. Söz konusu sensör cihazda yoksa
ivme ölçer.
Kotlin
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 } }
Java
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 ise getMinDelay()
yöntemidir.
bir sensörün verileri algılamak için kullanabileceği minimum zaman aralığını (mikrosaniye cinsinden) döndürür. Herhangi bir sensör
getMinDelay()
için sıfır dışında bir değer döndüren
bir akış yöntemidir.
görebilirsiniz. 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,
her bir Sprint için
Sensörün veri alabileceği nokta. 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 uygulamanıza sensör verilerini iletme hızıdır. İ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'lerin gösterildiği
SensorEventListener
arayüzü: onAccuracyChanged()
ve onSensorChanged()
. Android sisteminin çağrıları
aşağıdaki durumlarda bu yöntemleri kullanabilirsiniz:
- Bir sensörün doğruluğunun değişmesi.
Bu durumda, sistem
onAccuracyChanged()
yöntemini çağırır. ve değişenSensor
nesnesine referans vererek doğruluğunu ölçebilir. 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 bildiriyor.
Bu durumda sistem
onSensorChanged()
yöntemini çağırarakSensorEvent
nesnesi.SensorEvent
nesnesi Yeni sensör verileri hakkında şunlar da dahil olmak üzere bilgiler içerir: veri doğruluğu, verileri oluşturan sensör, verilerin oluşturulduğu zaman damgası ve yeni veriler yer alır.
Aşağıdaki kod,onSensorChanged()
entegre eder. Bu örnekte ham sensör verileri TextView
hücresinde gösterilmektedir
yani
main.xml dosyasında sensor_data
olarak tanımlanır.
Kotlin
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) } }
Java
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
) belirtilmiştir. Veriler
gecikme (veya örnekleme hızı), sensör etkinliklerinin uygulamanıza gönderildiği aralığı kontrol eder.
onSensorChanged()
geri çağırma yöntemiyle çalışır. Varsayılan
Veri gecikmesi, izleme için uygun
normal ekran yönü değiştiğinde ve 200.000 mikrosaniyelik bir gecikme kullanır. Diğer
veri gecikmeleri, örneğin SENSOR_DELAY_GAME
(20.000 mikrosaniye
gecikme), SENSOR_DELAY_UI
(60.000 mikrosaniye gecikme) veya SENSOR_DELAY_FASTEST
(0 mikrosaniye gecikme). Android 3.0 (API) sürümü
Düzey 11) de gecikmeyi mutlak değer olarak (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 büyük bir gecikme kullanmak daha düşük bir yük oluşturur ve bu nedenle daha az güç tüketir.
Sensör çerçevesinin ileti gönderme hızını belirlemek için herkese açık bir yöntem bulunmuyor Uygulamanıza gelen sensör olayları; Ancak her bir öğeyle ilişkilendirilen zaman damgalarını sensör etkinliğini kullanabilirsiniz. Etiketleme için örnekleme hızını (gecikme) belirler. Herhangi bir nedenle gecikmeyi değiştirmeniz gerekirse ve sensör dinleyicisinin kaydını iptal edip yeniden kaydettirmesi gerekir.
Ayrıca, bu örneğin onResume()
ve
Sensör etkinliğini kaydetmek ve kaydını silmek için onPause()
geri çağırma yöntemi
dinleyicidir. En iyi uygulama olarak ihtiyacınız olmayan sensörleri her zaman devre dışı bırakmanız gerekir. Özellikle de
etkinliği duraklatıldı. Aksi takdirde, bazı sensörler pilin birkaç saat içinde boşalmasına neden olabilir
ve pil gücünü hızlı bir şekilde tüketebilir. 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ı belirtmese de Bu da cihaz üreticilerinin istedikleri her türlü sensör yapılandırmasını kendi Android destekli cihazlar. Sonuç olarak, cihazlar birbirinden çok farklı çeşitli yapılandırma seçenekleri sunar. Uygulamanız belirli bir sensör türüne dayalıysa Uygulamanızın başarılı bir şekilde çalışabilmesi için cihazda mevcut olan sensör.
Bir cihazda belirli bir sensörün olduğundan emin olmak için iki seçeneğiniz vardır:
- Çalışma zamanında sensörleri algılayın ve uygulama özelliklerini uygun şekilde etkinleştirin ya da devre dışı bırakın.
- Belirli sensör yapılandırmaları olan 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 tür sensör kullanıyorsa ancak bu sensöre güvenmiyorsa çalışma zamanında sensörü algılamak ve ardından uygulama özelliklerini devre dışı bırakmak veya etkinleştirmek için sensör çerçevesi gerektiği şekilde ele alın. Örneğin, bir navigasyon uygulaması sıcaklık sensörünü, sıcaklığı, barometriyi göstermek için basınç sensörü, GPS sensörü ve jeomanyetik alan sensörü basınç, konum ve pusula yönü. Cihazın basınç sensörü yoksa algılamasını sağlamak ve ardından CANNOT TRANSLATE kullanıcı arayüzünde basınç gösteren kısımlara yer verebilirsiniz. Örneğin, aşağıdaki kodda cihazda basınç sensörü olup olmadığını kontrol edin:
Kotlin
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. }
Java
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. İlgili içeriği oluşturmak için kullanılan
<uses-feature>
öğesi, filtreleme yapmanıza olanak tanıyan çeşitli donanım tanımlayıcıları içeriyor.
tespit etmek için kullanabileceğiniz araçlardır. 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 açıklayıcıyı uygulamanızın manifest dosyasına eklerseniz, kullanıcılar yalnızca cihazında ivme ölçer varsa Google Play'de kullanılabilir.
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 bazılarını ele alacağız.
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 negatif Z değerlerine sahiptir. Bu koordinat sistemi aşağıdaki sensörler tarafından kullanılır:
![](https://developer.android.com/static/images/axis_device.png?authuser=19&hl=tr)
Şekil 1. Sensör tarafından kullanılan koordinat sistemi (cihaza göre) API'ye gidin.
Bu koordinat sistemiyle ilgili anlaşılması gereken en önemli nokta, eksenlerin cihazın ekran yönü (yani sensörün koordinat sistemi) değiştiğinde değiştirilir cihaz hareket ettikçe hiçbir zaman değişmez. Bu davranış, OpenGL'nin çalışma biçimiyle aynıdır. koordinat sisteminden geçer.
Anlaşılması gereken bir başka nokta da şu: Uygulamanız, cihazın doğal akışının normal olduğunu varsaymamalıdır. (varsayılan) yön dikey. Birçok tabletin doğal yönü yataydır. Ve sensör koordinat sistemi her zaman cihazın doğal yönüne bağlıdır.
Son olarak, uygulamanız sensör verilerini ekrandaki ekranla eşleştiriyorsa
getRotation()
yöntemini kullanın ve ardından
Eşlemek için remapCoordinateSystem()
yöntemi
sensör koordinatlarını kullanır. Manifest dosyasında
yalnızca dikey ekran.
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öntemini, getRotationMatrix()
yöntemini, Yönü inceleyin
Sensör ve Döndürme Vektörü
Sensör.
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 tarafından kaydedilen değerleri içerir. ivme ölçer, jiroskop ve jeomanyetik alan sensör.
Yenileme hızı sınırı, sensör verilerine nasıl eriştiğinize bağlıdır:
- Bir
registerListener()
sensör olaylarını izleme yöntemi kullanıldığında, sensör örnekleme hızı 200 Hz ile sınırlıdır. Bu,registerListener()
yöntemini çağırın. - URL'yi
SensorDirectChannel
sınıf, sensör örnekleme hızı yalnızcaRATE_NORMAL
, Bu da genellikle yaklaşık 50 Hz'dir.
Uygulamanızın hareket sensörü verilerini daha yüksek bir hızda toplaması gerekiyorsa
şunu beyan etmek:
HIGH_SAMPLING_RATE_SENSORS
izninin değerini değiştirin. Aksi halde, uygulamanız
bu izni beyan etmeden hareket sensörü verilerini daha yüksek hızda toplama,
SecurityException
gerçekleşir.
AndroidManifest.xml
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
Sensörlere Erişme ve Kullanmayla İlgili En İyi Uygulamalar
Sensör uygulamanızı tasarlarken, şurada açıklanan yönergeleri uyguladığınızdan emin olun: bu bölümde bulabilirsiniz. Sensörü kullanan herkes için bu kurallar önerilen en iyi uygulamalardır sensörlere erişip sensör verileri edinmesine yardımcı olabilen bir çerçeve işlevi görü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:
- Şunu kullanan sensörler: sürekli (ör. ivme ölçer ve jiroskoplar) raporlama modlarında etkinlikler.
- Ş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örle işiniz bittiğinde veya sensörü kullandığınızda sensör dinleyicisinin kaydını iptal ettiğinizden emin olun
zaman alır. 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ğıdakiler
kod, bir işleyicinin kaydını iptal etmek için onPause()
yönteminin nasıl kullanılacağını gösterir:
Kotlin
private lateinit var sensorManager: SensorManager ... override fun onPause() { super.onPause() sensorManager.unregisterListener(this) }
Java
private SensorManager sensorManager; ... @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); }
Daha fazla bilgiyi unregisterListener(SensorEventListener)
sayfasında bulabilirsiniz.
Android Emülatör ile test etme
Android Emulator, bir dizi sanal sensör kontrolü içerir. sıcaklık, manyetometre, ivme ölçer, ortam sıcaklığı ve yakınlık, ışık ve daha fazlası.
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 şurada görüntüleyebilirsiniz: şu konum:
$ 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:
- USB'nin hata ayıklamanın etkin olduğundan emin olun.
- Bir USB kablosu kullanarak cihazınızı geliştirme makinenize bağlayın.
- Cihazınızda SdkControllerSensor uygulamasını başlatın.
- Uygulamada, emüle 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: Kare üzerinde yaptığınız hareketler
fiziksel cihazınız emülatörü dönüştürmüyorsa şunu çalıştırmayı deneyin:
adb
komutunu tekrar girmeniz gerekir.
Daha fazla bilgi için Android Emülatör kılavuzu.
onSensorChanged() yöntemini engellemeyin
Sensör verileri yüksek hızda değişebilir. Bu nedenle sistem, onSensorChanged(SensorEvent)
yöntemini sık sık çağırabilir. En iyi uygulama olarak,
Bunu engellememek için onSensorChanged(SensorEvent)
yönteminde mümkün olduğunca az şey yapmalıdır. 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ı. Hangi tür stratejilerin
Bunun yerine cihazlarda TYPE_AMBIENT_TEMPERATURE
sensör türünü kullanın
Android 4.0 çalıştıran cihazlar.
Kullanmadan önce sensörleri doğrulayın
Cihazdan veri almaya çalışmadan önce her zaman cihazda bir sensörün olduğunu doğrulayın. Ş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 ileti göndermesine izin verme
ihtiyaç duymadığınız ekstra veriler, sistem kaynaklarını boşa harcar ve pil gücünü kullanır.