Die Android-Plattform bietet zwei Sensoren, mit denen du die Position eines Geräts bestimmen kannst: den geomagnetischen Feldsensor und den Beschleunigungsmesser. Die Android-Plattform bietet auch einen Sensor, mit dem du feststellen kannst, wie nah die Vorderseite eines Geräts an einem Objekt ist (Näherungssensor). Der geomagnetische Feldsensor und der Näherungssensor sind hardwarebasiert. Die meisten Smartphone- und Tablet-Hersteller statten ihre Geräte mit einem geomagnetischen Feldsensor aus. Ebenso verfügen Mobilgeräte in der Regel über einen Näherungssensor, um zu erkennen, wenn ein Mobilgerät nahe am Gesicht eines Nutzers gehalten wird (z. B. während eines Telefonats). Zur Bestimmung der Ausrichtung eines Geräts kannst du die Messwerte des Beschleunigungsmessers und des geomagnetischen Feldsensors des Geräts verwenden.
Hinweis:Der Orientierungssensor wurde in Android 2.2 (API-Level 8) und der Orientierungssensortyp in Android 4.4W (API-Level 20) eingestellt.
Positionssensoren sind nützlich, um die physische Position eines Geräts im globalen Bezugssystem zu bestimmen. Beispielsweise kannst du den Sensor für das Erdmagnetfeld in Kombination mit dem Beschleunigungsmesser verwenden, um die Position eines Geräts relativ zum magnetischen Nordpol zu bestimmen. Sie können diese Sensoren auch verwenden, um die Ausrichtung eines Geräts im Bezugssystem Ihrer Anwendung zu bestimmen. Positionssensoren werden normalerweise nicht verwendet, um Gerätebewegungen wie Schütteln, Neigen oder Stoßen zu überwachen. Weitere Informationen findest du unter Bewegungssensoren.
Der geomagnetische Feldsensor und der Beschleunigungsmesser geben für jedes SensorEvent mehrdimensionale Arrays von Sensorwerten zurück. Der Sensor für das Erdmagnetfeld liefert beispielsweise bei einem einzelnen Sensorereignis Werte für die Stärke des Erdmagnetfelds für jede der drei Koordinatenachsen. Ebenso misst der Beschleunigungssensor die Beschleunigung, die während eines Sensorereignisses auf das Gerät einwirkt. Weitere Informationen zu den von Sensoren verwendeten Koordinatensystemen finden Sie unter
Sensorkoordinatensysteme. Der Näherungssensor liefert für jedes Sensorereignis einen einzelnen Wert. In Tabelle 1 sind die Positionssensoren zusammengefasst, die auf der Android-Plattform unterstützt werden.
Tabelle 1. Positionssensoren, die auf der Android-Plattform unterstützt werden.
| Sensor | Sensordaten zu Ereignissen | Beschreibung | Maßeinheiten |
|---|---|---|---|
TYPE_GAME_ROTATION_VECTOR |
SensorEvent.values[0] |
Rotationsvektorkomponente entlang der x-Achse (x * sin(θ/2)). | Ohne Einheit |
SensorEvent.values[1] |
Rotationsvektorkomponente entlang der Y-Achse (y * sin(θ/2)). | ||
SensorEvent.values[2] |
Rotationsvektorkomponente entlang der Z-Achse (z * sin(θ/2)). | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR |
SensorEvent.values[0] |
Rotationsvektorkomponente entlang der x-Achse (x * sin(θ/2)). | Ohne Einheit |
SensorEvent.values[1] |
Rotationsvektorkomponente entlang der Y-Achse (y * sin(θ/2)). | ||
SensorEvent.values[2] |
Rotationsvektorkomponente entlang der Z-Achse (z * sin(θ/2)). | ||
TYPE_MAGNETIC_FIELD |
SensorEvent.values[0] |
Stärke des Erdmagnetfelds entlang der X-Achse. | μT |
SensorEvent.values[1] |
Stärke des Erdmagnetfelds entlang der Y-Achse. | ||
SensorEvent.values[2] |
Stärke des geomagnetischen Felds entlang der Z-Achse. | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED |
SensorEvent.values[0] |
Geomagnetische Feldstärke (ohne Hard-Iron-Kalibrierung) entlang der x-Achse. | μT |
SensorEvent.values[1] |
Geomagnetische Feldstärke (ohne Hard-Iron-Kalibrierung) entlang der Y-Achse. | ||
SensorEvent.values[2] |
Geomagnetische Feldstärke (ohne Hard-Iron-Kalibrierung) entlang der Z-Achse. | ||
SensorEvent.values[3] |
Schätzung der Eisenverzerrung entlang der x-Achse. | ||
SensorEvent.values[4] |
Schätzung der Eisenverzerrung entlang der Y-Achse. | ||
SensorEvent.values[5] |
Schätzung der Eisenverzerrung entlang der Z-Achse. | ||
TYPE_ORIENTATION1 |
SensorEvent.values[0] |
Azimut (Winkel um die Z-Achse). | Grad |
SensorEvent.values[1] |
Neigung (Winkel um die X-Achse). | ||
SensorEvent.values[2] |
Rollwinkel (Winkel um die Y-Achse). | ||
TYPE_PROXIMITY |
SensorEvent.values[0] |
Entfernung zum Objekt.2 | cm |
1 Dieser Sensor wurde in Android 2.2 (API-Level 8) und dieser Sensortyp in Android 4.4W (API-Level 20) eingestellt. Das Sensor-Framework bietet alternative Methoden zum Abrufen der Geräteausrichtung, die unter Ausrichtung des Geräts berechnen erläutert werden.
2 Einige Näherungssensoren liefern nur binäre Werte, die „nah“ und „fern“ darstellen.
Sensor für den Spielrotationsvektor verwenden
Der Sensor für den Spielrotationsvektor ist mit dem Sensor für den Rotationsvektor identisch, verwendet jedoch nicht das geomagnetische Feld. Daher zeigt die Y-Achse nicht nach Norden, sondern auf einen anderen Referenzpunkt. Diese Referenz darf in derselben Größenordnung driften wie das Gyroskop um die Z-Achse.
Da der Sensor für den Spielrotationsvektor das Magnetfeld nicht verwendet, sind relative Rotationen genauer und werden nicht durch Änderungen des Magnetfelds beeinflusst. Verwende diesen Sensor in einem Spiel, wenn es dir egal ist, wo Norden ist, und der normale Rotationsvektor aufgrund seiner Abhängigkeit vom Magnetfeld nicht deinen Anforderungen entspricht.
Der folgende Code zeigt, wie Sie eine Instanz des Standard-Rotationsvektorsensors für Spiele abrufen:
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);
Sensor für geomagnetischen Rotationsvektor verwenden
Der Sensor für den geomagnetischen Rotationsvektor ähnelt dem Sensor für den Rotationsvektor, verwendet aber nicht das Gyroskop. Die Genauigkeit dieses Sensors ist geringer als die des normalen Rotationsvektorsensors, aber der Stromverbrauch ist reduziert. Verwende diesen Sensor nur, wenn du Rotationsinformationen im Hintergrund erfassen möchtest, ohne zu viel Akku zu verbrauchen. Dieser Sensor ist am nützlichsten, wenn er in Verbindung mit Batching verwendet wird.
Der folgende Code zeigt, wie Sie eine Instanz des standardmäßigen geomagnetischen Rotationsvektorsensors abrufen:
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);
Ausrichtung des Geräts berechnen
Durch die Berechnung der Ausrichtung eines Geräts kannst du die Position des Geräts relativ zum Bezugssystem der Erde (insbesondere zum magnetischen Nordpol) überwachen. Der folgende Code zeigt, wie die Ausrichtung eines Geräts berechnet wird:
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);
Das System berechnet die Ausrichtungswinkel mithilfe des geomagnetischen Feldsensors des Geräts in Kombination mit dem Beschleunigungsmesser des Geräts. Mithilfe dieser beiden Hardwaresensoren liefert das System Daten für die folgenden drei Ausrichtungswinkel:
- Azimut (Drehwinkel um die -z-Achse). Das ist der Winkel zwischen der aktuellen Kompassrichtung des Geräts und dem magnetischen Norden. Wenn die Oberkante des Geräts nach Norden zeigt, beträgt der Azimut 0 Grad. Wenn die Oberkante nach Süden zeigt, beträgt der Azimut 180 Grad. Wenn die Oberkante nach Osten zeigt, beträgt der Azimut 90 Grad, und wenn die Oberkante nach Westen zeigt, beträgt der Azimut 270 Grad.
- Neigung (Drehung um die x-Achse in Grad). Dies ist der Winkel zwischen einer Ebene parallel zum Display des Geräts und einer Ebene parallel zum Boden. Wenn Sie das Gerät parallel zum Boden halten, wobei die Unterkante am nächsten zu Ihnen ist, und die Oberkante des Geräts zum Boden neigen, wird der Neigungswinkel positiv. Wenn du das Gerät in die entgegengesetzte Richtung neigst, also die Oberkante des Geräts vom Boden wegbewegst, wird der Neigungswinkel negativ. Der Wertebereich liegt zwischen -90 Grad und 90 Grad.
- Roll (Drehungsgrad um die Y-Achse). Dies ist der Winkel zwischen einer Ebene senkrecht zum Bildschirm des Geräts und einer Ebene senkrecht zum Boden. Wenn Sie das Gerät parallel zum Boden halten, wobei die Unterkante am nächsten zu Ihnen ist, und die linke Kante des Geräts zum Boden neigen, wird der Rollwinkel positiv. Wenn du das Gerät in die entgegengesetzte Richtung neigst, also die rechte Kante des Geräts in Richtung Boden bewegst, wird der Rollwinkel negativ. Der Wertebereich liegt zwischen -180 Grad und 180 Grad.
Hinweis:Die Definition der Roll-Achse des Sensors wurde geändert, um der großen Mehrheit der Implementierungen im Geosensor-Ökosystem Rechnung zu tragen.
Beachte, dass diese Winkel auf einem anderen Koordinatensystem basieren als dem, das in der Luftfahrt verwendet wird (für Gieren, Nicken und Rollen). Im Luftfahrtsystem verläuft die x-Achse entlang der Längsseite des Flugzeugs, vom Heck bis zur Nase.
Der Orientierungssensor leitet seine Daten durch die Verarbeitung der Rohsensordaten des Beschleunigungsmessers und des geomagnetischen Feldsensors ab. Aufgrund der intensiven Verarbeitung ist die Genauigkeit und Präzision des Orientierungssensors verringert. Dieser Sensor ist nur zuverlässig, wenn der Rollwinkel 0 ist. Daher wurde der Ausrichtungssensor in Android 2.2 (API-Level 8) und der Ausrichtungssensortyp in Android 4.4W (API-Level 20) eingestellt.
Anstatt Rohdaten vom Ausrichtungssensor zu verwenden, empfehlen wir, die Methode getRotationMatrix() in Verbindung mit der Methode getOrientation() zu verwenden, um Ausrichtungswerte zu berechnen, wie im folgenden Codebeispiel gezeigt. Im Rahmen dieses Prozesses können Sie die Methode remapCoordinateSystem() verwenden, um die Ausrichtungswerte in das Bezugssystem Ihrer Anwendung zu übersetzen.
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. } }
Normalerweise müssen Sie keine Datenverarbeitung oder Filterung der Rohwinkel des Geräts durchführen, außer das Koordinatensystem des Sensors in das Referenzsystem Ihrer Anwendung zu übersetzen.
Erdmagnetfeldsensor verwenden
Mit dem Sensor für das Erdmagnetfeld können Sie Änderungen im Magnetfeld der Erde beobachten. Der folgende Code zeigt, wie Sie eine Instanz des standardmäßigen geomagnetischen Feldsensors abrufen:
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);
Hinweis : Wenn deine App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, ist die Frequenz dieses Sensors begrenzt.
Dieser Sensor liefert Rohdaten zur Feldstärke (in μT) für jede der drei Koordinatenachsen.
Normalerweise müssen Sie diesen Sensor nicht direkt verwenden. Stattdessen kannst du den Rotationsvektorsensor verwenden, um die Rohrotationsbewegung zu bestimmen, oder den Beschleunigungsmesser und den geomagnetischen Feldsensor in Verbindung mit der Methode getRotationMatrix() verwenden, um die Rotationsmatrix und die Neigungsmatrix zu erhalten. Diese Matrizen können Sie dann mit den Methoden getOrientation() und getInclination() verwenden, um Daten zum Azimut und zur geomagnetischen Inklination zu erhalten.
Hinweis : Wenn Sie Ihre App testen, können Sie die Genauigkeit des Sensors verbessern, indem Sie das Gerät in einer Achterbewegung schwenken.
Nicht kalibriertes Magnetometer verwenden
Das unkalibrierte Magnetometer ähnelt dem geomagnetischen Feldsensor, mit dem Unterschied, dass keine Hard-Iron-Kalibrierung auf das Magnetfeld angewendet wird. Die Werkskalibrierung und die Temperaturkompensation werden weiterhin auf das Magnetfeld angewendet. Das unkalibrierte Magnetometer ist nützlich, um fehlerhafte Schätzungen von harten Eisen zu verarbeiten. Im Allgemeinen liegt geomagneticsensor_event.values[0] nahe bei uncalibrated_magnetometer_event.values[0] -
uncalibrated_magnetometer_event.values[3]. Das heißt,
calibrated_x ~= uncalibrated_x - bias_estimate_x
Hinweis:Unkalibrierte Sensoren liefern mehr Rohdaten und können gewisse Abweichungen aufweisen. Ihre Messungen enthalten jedoch weniger Sprünge, die durch Korrekturen bei der Kalibrierung entstehen. Einige Anwendungen bevorzugen diese unkalibrierten Ergebnisse, da sie gleichmäßiger und zuverlässiger sind. Wenn eine Anwendung beispielsweise versucht, eine eigene Sensorfusion durchzuführen, können Kalibrierungen die Ergebnisse verzerren.
Zusätzlich zum Magnetfeld liefert das nicht kalibrierte Magnetometer auch die geschätzte Hard-Iron-Verzerrung für jede Achse. Der folgende Code zeigt, wie Sie eine Instanz des unkalibrierten Standardmagnetometers abrufen:
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);
Näherungssensor verwenden
Mit dem Näherungssensor kannst du feststellen, wie weit ein Objekt von einem Gerät entfernt ist. Der folgende Code zeigt, wie Sie eine Instanz des Standard-Näherungssensors abrufen:
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);
Der Näherungssensor wird normalerweise verwendet, um zu bestimmen, wie weit der Kopf einer Person von der Vorderseite eines Mobilgeräts entfernt ist, z. B. wenn ein Nutzer einen Anruf tätigt oder empfängt. Die meisten Näherungssensoren geben die absolute Entfernung in cm zurück, einige jedoch nur Werte für „nah“ und „fern“.
Hinweis:Bei einigen Gerätemodellen befindet sich der Näherungssensor unter dem Display. Wenn er aktiviert ist, während das Display eingeschaltet ist, kann ein blinkender Punkt auf dem Display angezeigt werden.
Der folgende Code zeigt, wie Sie den Näherungssensor verwenden:
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); } }
Hinweis:Einige Näherungssensoren geben binäre Werte zurück, die „nah“ oder „fern“ darstellen. In diesem Fall meldet der Sensor normalerweise den maximalen Bereichswert im Zustand „weit“ und einen kleineren Wert im Zustand „nah“. In der Regel ist der Wert für „weit“ ein Wert von > 5 cm, dies kann jedoch von Sensor zu Sensor variieren. Mit der Methode getMaximumRange() kannst du die maximale Reichweite eines Sensors ermitteln.