Positionssensoren

Die Android-Plattform bietet zwei Sensoren, mit denen Sie die Position eines Geräts bestimmen können: den Geomagnetfeldsensor und den Beschleunigungsmesser. Die Android-Plattform bietet auch einen Sensor, mit dem Sie feststellen können, wie nah sich das Display eines Geräts an einem Objekt befindet (Näherungssensor). Der geomagnetische Sensor und der Näherungssensor sind hardwarebasiert. Die meisten Hersteller von Mobiltelefonen und Tablets bieten einen Sensor für geomagnetische Felder. Ebenso sind in Smartphones in der Regel Näherungssensoren enthalten, die erkennen, wenn ein Smartphone nah am Gesicht eines Nutzers gehalten wird (z. B. während eines Telefongesprächs). Zur Bestimmung der Ausrichtung eines Geräts können Sie die Messwerte des Beschleunigungsmessers und des Geomagnetfeldsensors des Geräts verwenden.

Hinweis:Der Ausrichtungssensor wurde in Android 2.2 (API-Ebene 8) eingestellt und der Ausrichtungssensortyp in Android 4.4W (API-Ebene 20).

Mithilfe von Positionssensoren lässt sich die physische Position eines Geräts im Weltkoordinatensystem bestimmen. Sie können beispielsweise den Sensor für geomagnetische Felder 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 Bezugsrahmen Ihrer App zu ermitteln. Positionssensoren werden in der Regel nicht verwendet, um Gerätebewegungen wie Schütteln, Neigen oder Vor-/Zurückbewegen zu überwachen. Weitere Informationen finden Sie unter Bewegungssensoren.

Der Sensor für das geomagnetische Feld und der Beschleunigungsmesser geben für jede SensorEvent mehrdimensionale Arrays von Sensorwerten zurück. Beispielsweise liefert der Sensor für das geomagnetische Feld während eines einzelnen Sensorereignisses Werte für die Stärke des geomagnetischen Feldes für jede der drei Koordinatenachsen. Der Beschleunigungsmesser misst ebenfalls die Beschleunigung, die auf das Gerät während eines Sensorereignisses ausgeübt wird. Weitere Informationen zu den von Sensoren verwendeten Koordinatensystemen finden Sie unter Sensorkoordinatensysteme. Der Näherungssensor stellt für jedes Sensorereignis einen einzelnen Wert bereit. In Tabelle 1 sind die auf der Android-Plattform unterstützten Positionssensoren zusammengefasst.

Tabelle 1 Positionssensoren, die auf der Android-Plattform unterstützt werden.

Sensor Sensorereignisdaten Beschreibung Maßeinheiten
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] Komponente des Drehvektors entlang der X-Achse (x * sin(θ/2)). Ohne Einheit
SensorEvent.values[1] Komponente des Rotationsvektors entlang der Y-Achse (y × sin(Θ/2)).
SensorEvent.values[2] Komponente des Drehvektors entlang der Z‑Achse (z * sin(θ/2)).
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] Komponente des Drehvektors entlang der X-Achse (x * sin(θ/2)). Ohne Einheit
SensorEvent.values[1] Komponente des Rotationsvektors entlang der Y-Achse (y × sin(Θ/2)).
SensorEvent.values[2] Komponente des Drehvektors entlang der Z‑Achse (z * sin(θ/2)).
TYPE_MAGNETIC_FIELD SensorEvent.values[0] Stärke des geomagnetischen Felds entlang der X-Achse. μT
SensorEvent.values[1] Geomagnetische Feldstärke entlang der Y-Achse.
SensorEvent.values[2] Geomagnetische Feldstärke entlang der Z‑Achse.
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] Die Stärke des geomagnetischen Felds (ohne Eisenkalibrierung) entlang der X-Achse. μT
SensorEvent.values[1] Geomagnetische Feldstärke (ohne Harteisenkalibrierung) entlang der y-Achse.
SensorEvent.values[2] Geomagnetische Feldstärke (ohne Harteisenkalibrierung) entlang der z-Achse.
SensorEvent.values[3] Schätzung der Eisenvorspannung entlang der x-Achse.
SensorEvent.values[4] Schätzung des Eisenfehlers entlang der Y-Achse.
SensorEvent.values[5] Schätzung der Magnetfeldabweichung 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] Rollung (Winkel um die Y-Achse)
TYPE_PROXIMITY SensorEvent.values[0] Entfernung vom Objekt.2 cm

1Dieser Sensor wurde in Android 2.2 (API-Level 8) eingestellt und dieser Sensortyp wurde in Android 4.4W (API-Level 20) eingestellt. Das Sensor-Framework bietet alternative Methoden zum Ermitteln der Geräteausrichtung, die unter Ausrichtung des Geräts berechnen beschrieben werden.

2 Einige Näherungssensoren liefern nur binäre Werte für nahe und weite Entfernungen.

Vektorsensor für die Spieldrehung verwenden

Der Vektorsensor für die Drehung in Spielen ist mit dem Vektorsensor für die Drehung identisch, mit der Ausnahme, dass er nicht das geomagnetische Feld verwendet. Daher zeigt die Y-Achse nicht nach Norden, sondern auf einen anderen Bezug. Diese Referenz darf um denselben Betrag driften wie das Gyroskop um die Z‑Achse.

Da der Vektorsensor für die Drehung des Spiels nicht das Magnetfeld verwendet, sind relative Drehungen genauer und nicht von Änderungen des Magnetfelds betroffen. Verwenden Sie diesen Sensor in einem Spiel, wenn Sie nicht wissen möchten, wo Norden ist, und der normale Drehvektor aufgrund seiner Abhängigkeit vom Magnetfeld nicht Ihren Anforderungen entspricht.

Im folgenden Code wird gezeigt, wie Sie eine Instanz des Standardsensors für den Drehvektor des Spiels 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);

Geomagnetischen Drehvektorsensor verwenden

Der geomagnetische Drehvektorsensor ähnelt dem Drehvektorsensor, verwendet aber kein Gyroskop. Die Genauigkeit dieses Sensors ist geringer als die des normalen Drehvektorsensors, aber der Stromverbrauch ist reduziert. Verwenden Sie diesen Sensor nur, wenn Sie Informationen zur Drehung im Hintergrund erfassen möchten, ohne zu viel Akku zu verbrauchen. Dieser Sensor ist am besten geeignet, wenn er in Kombination mit Batching verwendet wird.

Im folgenden Code wird gezeigt, wie Sie eine Instanz des Standardsensors für den geomagnetischen Drehvektor 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 können Sie die Position des Geräts relativ zum Referenzsystem der Erde (insbesondere zum magnetischen Nordpol) überwachen. Im folgenden Code wird gezeigt, 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 anhand des geomagnetischen Feldsensors eines Geräts in Kombination mit dem Beschleunigungsmesser des Geräts. Anhand dieser beiden Hardwaresensoren liefert das System Daten für die folgenden drei Orientierungswinkel:

  • Azimut (Drehwinkel um die -z-Achse in Grad). Das ist der Winkel zwischen der aktuellen Kompassrichtung des Geräts und dem magnetischen Norden. Wenn der obere Rand des Geräts zum magnetischen Norden zeigt, beträgt der Azimut 0 Grad. Wenn der obere Rand nach Süden zeigt, beträgt der Azimut 180 Grad. Wenn die Oberkante nach Osten zeigt, beträgt der Azimut 90 Grad. Wenn sie nach Westen zeigt, beträgt er 270 Grad.
  • Neigung (Drehungsgrad um die X-Achse). Das ist der Winkel zwischen einer Ebene, die parallel zum Display des Geräts ist, und einer Ebene, die parallel zum Boden ist. Wenn du das Gerät parallel zum Boden hältst, wobei die Unterkante dir am nächsten ist, und die obere Kante des Geräts zum Boden neigst, wird der Neigungswinkel positiv. Wenn Sie das Gerät in die entgegengesetzte Richtung neigen, also den oberen Rand des Geräts vom Boden weg bewegen, wird der Neigungswinkel negativ. Der Wertebereich liegt zwischen -90 und 90 Grad.
  • Rollen (Drehwinkel um die Y-Achse) Das ist der Winkel zwischen einer Ebene, die senkrecht zum Display des Geräts steht, und einer Ebene, die senkrecht zum Boden steht. Wenn Sie das Gerät parallel zum Boden halten, wobei der untere Rand Ihnen am nächsten ist, und den linken Rand des Geräts in Richtung Boden neigen, wird der Rollwinkel positiv. Wenn Sie das Gerät in die entgegengesetzte Richtung neigen, also den rechten Rand des Geräts in Richtung Boden bewegen, wird der Rollwinkel negativ. Der Wertebereich liegt zwischen -180 und 180 Grad.

Hinweis:Die Definition der Rollung des Sensors wurde geändert, um der überwiegenden Mehrheit der Implementierungen im Geosensor-System zu entsprechen.

Beachten Sie, dass diese Winkel auf einem anderen Koordinatensystem beruhen als das in der Luftfahrt verwendete (für Gieren, Nicken und Rollen). Im Luftfahrtsystem verläuft die x-Achse entlang der langen Seite des Flugzeugs, vom Heck bis zur Nase.

Der Ausrichtungssensor leitet seine Daten durch die Verarbeitung der Rohsensordaten vom Beschleunigungsmesser und vom Sensor für das geomagnetische Feld ab. Aufgrund der umfangreichen Verarbeitung sinkt die Genauigkeit des Ortungssensors. Insbesondere ist dieser Sensor nur zuverlässig, wenn der Rollwinkel 0 ist. Daher wurde der Ausrichtungssensor in Android 2.2 (API-Level 8) eingestellt und der Ausrichtungssensortyp in Android 4.4W (API-Level 20). 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 Vorgangs können Sie die Methode remapCoordinateSystem() verwenden, um die Ausrichtungswerte in den Referenzrahmen Ihrer Anwendung zu übertragen.

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 die Rohorientierungswinkel des Geräts nicht verarbeiten oder filtern, sondern nur das Koordinatensystem des Sensors in den Referenzrahmen Ihrer Anwendung umwandeln.

Geomagnetischen Sensor verwenden

Mit dem geomagnetischen Sensor können Sie Veränderungen des Erdmagnetfelds beobachten. Im folgenden Code wird gezeigt, wie Sie eine Instanz des Standardsensors für das geomagnetische Feld 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 Ihre App auf Android 12 (API-Level 31) oder höher ausgerichtet ist, ist dieser Sensor taktgesteuert.

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 können Sie den Rotationsvektorsensor verwenden, um die Rohrotationsbewegung zu bestimmen, oder den Beschleunigungsmesser und den Geomagnetfeldsensor in Kombination mit der Methode getRotationMatrix(), um die Rotationsmatrix und die Neigungsmatrix zu erhalten. Sie können diese Matrizen dann mit den Methoden getOrientation() und getInclination() verwenden, um Daten zur Azimut und geomagnetischen Neigung zu erhalten.

Hinweis : Wenn Sie Ihre App testen, können Sie die Genauigkeit des Sensors verbessern, indem Sie das Gerät in einer Acht geschwenkt halten.

Unkalibrierten Magnetometer verwenden

Das nicht kalibrierte Magnetometer ähnelt dem Sensor für das geomagnetische Feld, mit der Ausnahme, dass das Magnetfeld nicht mit einem harten Eisen kalibriert wird. Die Werkskalibrierung und Temperaturkompensation werden weiterhin auf das Magnetfeld angewendet. Der nicht kalibrierte Magnetometer ist nützlich, um schlechte Schätzungen für hartes Eisen zu verarbeiten. Im Allgemeinen liegt geomagneticsensor_event.values[0] in der Nähe von uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3]. Das bedeutet:

calibrated_x ~= uncalibrated_x - bias_estimate_x

Hinweis:Nicht kalibrierte Sensoren liefern Rohdaten und können eine gewisse Abweichung aufweisen. Ihre Messungen enthalten jedoch weniger Sprünge durch Korrekturen, die durch die Kalibrierung angewendet werden. Für einige Anwendungen sind diese nicht kalibrierten Ergebnisse möglicherweise geeigneter, da sie flüssiger und zuverlässiger sind. Wenn eine Anwendung beispielsweise versucht, eine eigene Sensorfusion durchzuführen, können Kalibrierungen die Ergebnisse verzerren.

Neben dem Magnetfeld liefert das nicht kalibrierte Magnetometer auch die geschätzte Magnetfeldstörung durch hartes Eisen in jeder Achse. Im folgenden Code wird gezeigt, wie Sie eine Instanz des standardmäßigen nicht kalibrierten Magnetometers 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 können Sie ermitteln, wie weit ein Objekt von einem Gerät entfernt ist. Im folgenden Code wird gezeigt, 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 in der Regel verwendet, um zu bestimmen, wie weit der Kopf einer Person vom Display eines Smartphones entfernt ist (z. B. wenn ein Nutzer einen Anruf startet oder empfängt). Die meisten Näherungssensoren geben die absolute Entfernung in cm zurück, einige jedoch nur Nah- und weite Werte.

Hinweis:Bei einigen Gerätemodellen befindet sich der Näherungssensor unter dem Bildschirm. Daher kann ein blinkender Punkt auf dem Bildschirm angezeigt werden, wenn er bei eingeschaltetem Bildschirm aktiviert ist.

Im folgenden Code wird gezeigt, wie der Näherungssensor verwendet wird:

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ärwerte zurück, die „nah“ oder „weit“ bedeuten. In diesem Fall meldet der Sensor in der Regel seinen maximalen Bereichswert im Fernmodus und einen niedrigeren Wert im Nahmodus. Normalerweise ist der Wert für „Weit“ größer als 5 cm, dies kann jedoch von Sensor zu Sensor variieren. Mit der Methode getMaximumRange() können Sie die maximale Reichweite eines Sensors ermitteln.

Lesen Sie auch