Platforma Android udostępnia 2 czujniki umożliwiające określenie pozycji urządzenia: czujnik pola geomagnetycznego i akcelerometr. Platforma Android udostępnia też czujnik, który pozwala określić, jak blisko obiektu znajduje się przód urządzenia (tzw. czujnik zbliżeniowy). czujnik pola geomagnetycznego i czujnik zbliżeniowy są oparte na sprzęcie. Większość producentów telefonów i tabletów umieszcza w swoich urządzeniach czujnik pola geomagnetycznego. Podobnie, Producenci telefonów często dołączają czujnik zbliżeniowy, by określić, kiedy telefon jest zbliżony do twarzy użytkownika (na przykład podczas używania telefonu) ). Aby określić orientację urządzenia, możesz skorzystać z odczytów akcelerometr urządzenia i czujnik pola geomagnetycznego.
Uwaga: czujnik orientacji został wycofany w Androidzie 2.2 (poziom interfejsu API 8), a typ czujnika orientacji – w Androidzie 4.4W (poziom interfejsu API 20).
Czujniki pozycji są przydatne do określania fizycznej pozycji urządzenia w układzie odniesienia świata. Na przykład możesz użyć pola geomagnetycznego czujnik w połączeniu z akcelerometrem do określania pozycji urządzenia względem magnetycznego bieguna północnego. Możesz też używać tych czujników do określania orientacji urządzenia w układ współrzędnych aplikacji. Czujniki pozycji nie są zwykle używane do monitorowania ruchu urządzenia, na przykład potrząśnięcia, przechylenia lub ciągu (więcej informacji znajdziesz w artykule Czujniki ruchu).
Czujnik pola geomagnetycznego i akcelerometr zwracają wielowymiarowe macierze
wartości z czujnika dla każdego urządzenia SensorEvent
. Przykład:
czujnik pola geomagnetycznego podaje wartości siły pola geomagnetycznego dla
każdej z 3 osi współrzędnych w trakcie pojedynczego zdarzenia czujnika. Podobnie
Czujnik akcelerometru mierzy przyspieszenie
zdarzenie czujnika. Więcej informacji o systemach współrzędnych używanych przez czujniki znajdziesz w artykule
Systemy współrzędnych czujników. Czujnik zbliżeniowy podaje jedną wartość
dla każdego zdarzenia czujnika. Tabela 1 zawiera podsumowanie czujników pozycji, które są
na platformie Android.
Tabela 1. Czujniki położenia obsługiwane na platformie Android.
Czujnik | Dane zdarzenia z czujnika | Opis | Jednostki miary |
---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
Składnik wektora obrotu wzdłuż osi X (x * sin(θ/2)). | bez jednostek |
SensorEvent.values[1] |
Składowa wektora obrotu wzdłuż osi y (y * sin(Możliwość kliknięcia/2)). | ||
SensorEvent.values[2] |
Składowa wektora obrotu wzdłuż osi z (z * sin(Place/2)). | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
Składnik wektora obrotu na osi x (x * sin(Możliwość)). | bez jednostek |
SensorEvent.values[1] |
Składowa wektora obrotu wzdłuż osi y (y * sin(Możliwość kliknięcia/2)). | ||
SensorEvent.values[2] |
Składowa wektora obrotu wzdłuż osi z (z * sin(Place/2)). | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
Siła pola geomagnetycznego na osi x. | μT |
SensorEvent.values[1] |
Siła pola geomagnetycznego na osi Y. | ||
SensorEvent.values[2] |
Siła pola geomagnetycznego na osi Z. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
Siła pola geomagnetycznego (bez kalibracji twardego żelaza) wzdłuż osi X. | μT |
SensorEvent.values[1] |
Siła pola geomagnetycznego (bez kalibracji twardego żelaza) wzdłuż osi Y. | ||
SensorEvent.values[2] |
Natężenie pola geomagnetycznego (bez kalibracji na twardym żelazie) wzdłuż osi z. | ||
SensorEvent.values[3] |
Oszacowanie przesunięcia żelaza wzdłuż osi x. | ||
SensorEvent.values[4] |
Szacowane odchylenie żelaza na osi Y. | ||
SensorEvent.values[5] |
Szacowane odchylenie żelaza na osi Z. | ||
TYPE_ORIENTATION 1 |
SensorEvent.values[0] |
Azymut (kąt wokół osi Z). | Stopnie |
SensorEvent.values[1] |
Pochylenie (kąt wokół osi X). | ||
SensorEvent.values[2] |
Roll (kąt wokół osi Y). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
Odległość od obiektu.2 | cm |
1 Ten czujnik został wycofany w Androidzie 2.2 (poziom interfejsu API 8), a ten typ czujnika został wycofany w Androidzie 4.4W (poziom interfejsu API 20). Framework czujników udostępnia alternatywne metody uzyskiwania orientacji urządzenia, które są omawiane w sekcji Obliczanie orientacji urządzenia.
2 Niektóre czujniki zbliżeniowe podają tylko wartości binarne, które oznaczają „blisko” i „daleko”.
Korzystanie z czujnika wektora obrotu w grze
Czujnik wektorowy obrotu w grze jest identyczny z czujnikiem wektorowym obrotu, z tym że nie wykorzystuje pola geomagnetycznego. Dlatego oś Y nie wskazuje północ, lecz do innego punktu odniesienia. To odwołanie może dryfować o tego samego rządu wielkości, co żyroskop krąży wokół osi Z.
Czujnik wektora obrotu gry nie wykorzystuje pola magnetycznego, dlatego obroty względne są dokładniejsze i nie mają wpływu na zmiany pola magnetycznego. Używaj tego czujnika w grze, jeśli nieważne jest, gdzie jest północ, a normalny wektor obrotu nie odpowiada Twoim potrzebom ponieważ opiera się na polu magnetycznym.
Poniższy kod pokazuje, jak uzyskać instancję domyślnego czujnika wektora obrotu gry:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
Korzystanie z czujnika wektora obrotu geomagnetycznego
Czujnik wektora obrotu geomagnetycznego jest podobny do czujnika wektora obrotu, ale nie wykorzystuje żyroskopu. Dokładność tego czujnika jest mniejsza niż przy normalnym wektorze obrotu ale zużycie energii jest mniejsze. Używaj tego czujnika tylko wtedy, gdy chcesz zbierać informacje o obrotach w tle bez nadmiernego zużycia baterii. Ten czujnik jest najbardziej przydatny, gdy jest używany w połączeniu z przetwarzaniem zbiorczym.
Ten kod pokazuje, jak uzyskać instancję domyślnej obrotu geomagnetycznego czujnik wektorowy:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
Obliczanie orientacji urządzenia
Obliczając orientację urządzenia, możesz monitorować położenie względem układu odniesienia Ziemi (w szczególności pole magnetyczne bieguna północnego). Ten kod pokazuje, jak obliczyć orientacja:
Kotlin
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading) // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationAngles)
Java
private SensorManager sensorManager; ... // Rotation matrix based on current readings from accelerometer and magnetometer. final float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. final float[] orientationAngles = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationAngles);
System oblicza kąty orientacji przy użyciu właściwości geomagnetycznej urządzenia czujnika terenowego w połączeniu z akcelerometrem urządzenia. Korzystając z tych dwóch czujników sprzętowych, system dostarcza dane dotyczące tych trzech kątów orientacji:
- Azymut (obrot wokół osi -z w stopniach). To kąt między bieżącym kierunkiem kompasu urządzenia a północą magnetyczną. Jeśli górna krawędź urządzenia jest skierowana na północ magnetyczną, azymut wynosi 0. Jeśli górna krawędź jest skierowana na południe, azymut wynosi 180. Podobnie jeśli górna krawędź jest skierowana na wschód, azymut wynosi 90 stopni, a górna krawędź jest skierowany na zachód, a azymut wynosi 270 stopni.
- Pochylenie (stopnie obrotu wokół osi X). To jest kąt między płaszczyzną równoległą do ekranu urządzenia a płaszczyzną równoległą do ziemi. Jeśli trzymasz urządzenie równolegle do ziemi, a jego dolna krawędź jest najbliżej Ciebie, i nachylasz górną krawędź urządzenia w kierunku ziemi, kąt pochylenia staje się dodatni. Przechylanie w przeciwnym kierunku: odsunięcie górnej krawędzi urządzenia od ziemi. Powoduje to aby kąt nachylenia był ujemny. Zakres wartości to -90 stopni do 90 stopni.
- Obróć (stopnie obrotu wokół osi Y). Jest to kąt między płaszczyzną prostopadłą do ekranu urządzenia a płaszczyzną prostopadłą do podłoża. Jeśli trzymasz urządzenie równolegle do ziemi przechyl dolną krawędź znajdującą się najbliżej Ciebie i przechyl lewą krawędź urządzenia w kierunku ziemi, kąt obrotu stanie się dodatni. Przechylenie w przeciwnym kierunku – przesunięcie prawej krawędzi urządzenia w kierunku podłoża – powoduje, że kąt przechyłu staje się ujemny. Zakres wartości wynosi -180 stopni do 180 stopni.
Uwaga: definicja roli czujnika została zmieniona, aby odzwierciedlić ogromną większość implementacji w ekosystemie geosensorów.
Zauważ, że kąty te wychodzą z innego układu współrzędnych niż jeden używany w lotnictwie (do odchylenia, rzutu i obrócenia). W systemie lotniczym oś x jest równoległa do dłuższego boku samolotu, od ogona do dziobu.
Czujnik orientacji pobiera dane przez przetwarzanie nieprzetworzonych danych z czujnika
z akcelerometru i czujnika pola geomagnetycznego. Ze względu na intensywne przetwarzanie danych dokładność i precyzja czujnika orientacji jest ograniczona. Czujnik jest niezawodny tylko wtedy, gdy obraca się
kąt wynosi 0. Z tego powodu czujnik orientacji został wycofany z Androida.
2.2 (poziom interfejsu API 8) i typ czujnika orientacji został wycofany w Androidzie
4,4 W (poziom interfejsu API 20).
Zamiast używać nieprzetworzonych danych z czujnika orientacji, zalecamy
użyj funkcji getRotationMatrix()
w połączeniu z argumentem
Metoda getOrientation()
do obliczania wartości orientacji, co pokazuje poniższy przykładowy kod. W ramach
możesz użyć funkcji
remapCoordinateSystem()
do przełożenia wartości orientacji na ramkę aplikacji
odwołania.
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private val accelerometerReading = FloatArray(3) private val magnetometerReading = FloatArray(3) private val rotationMatrix = FloatArray(9) private val orientationAngles = FloatArray(3) public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } override fun onResume() { super.onResume() // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer -> sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField -> sensorManager.registerListener( this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } } override fun onPause() { super.onPause() // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this) } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. override fun onSensorChanged(event: SensorEvent) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size) } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size) } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. fun updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix( rotationMatrix, null, accelerometerReading, magnetometerReading ) // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles) // "orientationAngles" now has up-to-date information. } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; private final float[] magnetometerReading = new float[3]; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @Override protected void onResume() { super.onResume(); // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); if (magneticField != null) { sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this); } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.length); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.length); } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. public void updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles); // "orientationAngles" now has up-to-date information. } }
Zwykle nie musisz przetwarzać ani filtrować nieprzetworzone kąty orientacji urządzenia inne niż układ współrzędnych do układu odniesienia Twojej aplikacji.
Korzystanie z czujnika pola geomagnetycznego
Czujnik pola geomagnetycznego umożliwia monitorowanie zmian w polu magnetycznym Ziemi. ten kod pokazuje, jak pobrać instancję domyślnego czujnika pola geomagnetycznego:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Uwaga: jeśli Twoja aplikacja jest kierowana na Androida 12 (poziom API 31) lub nowszego, ten czujnik jest ograniczony szybkością.
Czujnik dostarcza nieprzetworzone dane o sile pola (μT) dla każdej z 3 osi współrzędnych.
Zwykle nie trzeba bezpośrednio korzystać z czujnika. Zamiast tego możesz użyć wektora obrotu
możesz użyć czujnika do określenia nieprzetworzonego ruchu obrotowego. Możesz też skorzystać z akcelerometru i pola geomagnetycznego,
czujnik w połączeniu z metodą getRotationMatrix()
w celu uzyskania macierzy obrotu i macierzy pochylenia. Następnie możesz:
użyj tych macierzy z getOrientation()
i getInclination()
do uzyskania azymutu
i danych o nachyleniu geomagnetycznym.
Uwaga: podczas testowania aplikacji możesz zwiększyć dokładność czujnika, machając urządzeniem w postaci ósemki.
Korzystanie z nieskalibrowanego magnetometru
Nieskalibrowany magnetometr jest podobny do czujnika pola geomagnetycznego, ale w odróżnieniu od niego nie jest kalibrowany na stałe na potrzeby pola magnetycznego. kalibracja fabryczna i kompensacja temperatury są nadal stosowane do pola magnetycznego. Nieskalibrowany magnetometr jest przydatny do obsługi złych szacunków twardego żelaza. Ogólnie geomagneticsensor_event.values[0]
będzie zbliżone do uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]
. To znaczy,
calibrated_x ~= uncalibrated_x - bias_estimate_x
Uwaga: nieskalibrowane czujniki dostarczają więcej nieprzetworzonych wyników i mogą uwzględnia pewną odchylenie, ale ich pomiary zawierają mniej skoków po korekcie kalibracji. Niektóre aplikacje mogą preferować te nieskalibrowane wyniki jako płynniejsze i bardziej dynamiczne. i niezawodnością. Jeśli na przykład aplikacja próbuje przeprowadzić własną fuzje czujników, wprowadzenie kalibracji może zniekształcić wyniki.
Poza polem magnetycznym nieskalibrowany magnetometr podaje też szacowany współczynnik zniekształcenia na każdej osi. Poniższy kod pokazuje, jak pobrać instancję domyślny nieskalibrowany magnetometr:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
Korzystanie z czujnika zbliżeniowego
Czujnik zbliżeniowy pozwala określić odległość obiektu od urządzenia. Poniżej pokazuje, jak pobrać instancję domyślnego czujnika zbliżeniowego:
Kotlin
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
Java
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
Czujnik zbliżeniowy służy zwykle do określania odległości głowy od mikrofonu (np. gdy użytkownik nawiązuje lub odbiera połączenie). Większość czujniki zbliżeniowe zwracają odległość bezwzględną w cm, ale niektóre zwracają dane tylko w pobliżu dalekie wartości.
Uwaga: w przypadku niektórych modeli czujnik zbliżeniowy znajduje się pod ekranem, co może powodować miganie kropki na ekranie, jeśli czujnik jest włączony, gdy ekran jest włączony.
Poniższy kod pokazuje, jak używać czujnika zbliżeniowego:
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var proximity: 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 proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val distance = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() proximity?.also { proximity -> sensorManager.registerListener(this, proximity, 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 proximity; @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); proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
Uwaga: niektóre czujniki zbliżeniowe zwracają wartości binarne, które reprezentują
„w pobliżu” lub „daleka”. W takim przypadku czujnik zwykle podaje maksymalną wartość zasięgu w stanie „daleko” i mniejszą wartość w stanie „blisko”. Zazwyczaj wartość daleka jest wartością > 5 cm, ale to może być inne
od czujnika do czujnika. Maksymalny zasięg czujnika możesz określić, korzystając z metody getMaximumRange()
.