Positionssensoren

Die Android-Plattform bietet zwei Sensoren, mit denen Sie die Position eines Geräts ermitteln können: den Sensor für das geomagnetische Feld und den Beschleunigungsmesser. Die Android-Plattform umfasst auch einen Sensor, mit dem Sie feststellen können, wie nahe sich das Gesicht eines Geräts an einem Objekt befindet (sogenannter Näherungssensor). Der Sensor für das geomagnetische Feld und der Näherungssensor sind hardwarebasiert. Die meisten Hersteller von Smartphones und Tablets verwenden einen Sensor für geomagnetische Felder. Ebenso führen Gerätehersteller in der Regel einen Näherungssensor ein, um zu ermitteln, wann das Gerät nah an das Gesicht eines Nutzers gehalten wird, z. B. während eines Telefonanrufs. Zur Bestimmung der Geräteausrichtung können die Messwerte des Beschleunigungsmessers und des Sensors für das geomagnetische Feld des Geräts verwendet werden.

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

Positionssensoren sind nützlich, um die physische Position eines Geräts im Bezugsrahmen der Welt zu ermitteln. Beispielsweise können Sie den Sensor für das geomagnetische Feld zusammen 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 die Bewegung oder Bewegung von Geräten wie Schüttelarbeiten, Neigung oder Schub zu überwachen (weitere Informationen finden Sie unter Bewegungssensoren).

Der Sensor für das geomagnetische Feld und der Beschleunigungsmesser geben mehrdimensionale Arrays von Sensorwerten für jede SensorEvent zurück. Beispielsweise liefert der Sensor für das geomagnetische Feld bei einem einzelnen Sensorereignis Werte für die geomagnetische Feldstärke für jede der drei Koordinatenachsen. Ebenso misst der Beschleunigungsmesser die Beschleunigung, die auf das Gerät während eines Sensorereignisses angewendet 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 Positionssensoren zusammengefasst, die von der Android-Plattform unterstützt werden.

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

Sensor Sensorereignisdaten 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] Die Stärke des geomagnetischen Feldes entlang der x-Achse. μT
SensorEvent.values[1] Die Stärke des geomagnetischen Feldes entlang der y-Achse.
SensorEvent.values[2] Geomagnetische Feldstärke entlang der z-Achse.
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] Geomagnetische Feldstärke (ohne Harteisenkalibrierung) 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 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] Roll (Winkel um die Y-Achse)
TYPE_PROXIMITY SensorEvent.values[0] Entfernung vom Objekt2 cm

1 Dieser Sensor wurde in Android 2.2 (API-Level 8) eingestellt und in Android 4.4W (API-Level 20) wurde er eingestellt. Das Sensor-Framework bietet alternative Methoden zum Erfassen der Geräteausrichtung. Diese werden unter Geräteausrichtung berechnen erläutert.

2 Einige Näherungssensoren bieten nur Binärwerte für Nah- und Fernverbindungen.

Vektor für den Spielrotationsvektor verwenden

Der Vektor für die Spielrotation ist mit dem Rotationsvektorsensor identisch, verwendet jedoch nicht das geomagnetische Feld. Daher zeigt die Y-Achse nicht nach Norden, sondern auf einen anderen Bezug. Dieser Bezug kann um die gleiche Größenordnung wie das Gyroskop um die Z-Achse verschoben werden.

Da der Vektorsensor der Spielrotation das Magnetfeld nicht verwendet, sind relative Rotationen genauer und werden nicht durch Veränderungen des Magnetfelds beeinflusst. Verwenden Sie diesen Sensor in einem Spiel, wenn es Ihnen nicht wichtig ist, wo Norden ist, und der normale Rotationsvektor Ihre Anforderungen nicht erfüllt, da er vom Magnetfeld abhängig ist.

Der folgende Code zeigt, wie Sie eine Instanz des Standardsensors für Spielrotationen 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 Rotationsvektorsensor verwenden

Der geomagnetische Rotationsvektorsensor ist dem Drehvektorsensor ähnlich, verwendet jedoch kein Gyroskop. Die Genauigkeit dieses Sensors ist geringer als beim normalen Rotationsvektorsensor, aber der Stromverbrauch wird reduziert. Verwenden Sie diesen Sensor nur, wenn Sie im Hintergrund Informationen zur Rotation erfassen möchten, ohne den Akku zu stark zu beanspruchen. Dieser Sensor ist am nützlichsten, wenn er in Verbindung mit einer Batchverarbeitung verwendet wird.

Der folgende Code zeigt, wie Sie eine Instanz des standardmäßigen Vektors für die geomagnetische Rotation 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);

Geräteausrichtung berechnen

Durch Berechnung der Geräteausrichtung lässt sich die Position des Geräts relativ zum Bezugsrahmen der Erde (insbesondere zum magnetischen Nordpol) beobachten. Der folgende Code zeigt, wie du die Ausrichtung eines Geräts berechnen kannst:

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 eines 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 (Grad der Drehung um die -z-Achse). Das ist der Winkel zwischen der aktuellen Kompassrichtung des Geräts und dem magnetischen Norden. Wenn die obere Kante des Geräts nach Norden zeigt, beträgt der Azimut 0 Grad. Wenn die obere Kante nach Süden zeigt, beträgt der Azimut 180 Grad. Wenn die obere Kante nach Osten zeigt, beträgt der Azimut 90 Grad. Wenn die obere Kante nach Westen zeigt, beträgt der Azimut 270 Grad.
  • Neigung (Grad der Drehung um die x-Achse). Dies ist der Winkel zwischen einer Ebene, die parallel zum Bildschirm des Geräts ist, und einer Ebene, die parallel zum Boden ist. Wenn du das Gerät parallel zum Boden hältst, die Unterkante dir am nächsten liegt, und die obere Kante des Geräts zum Boden neigst, wird der Neigungswinkel positiv. Durch eine Neigung in die entgegengesetzte Richtung, d. h. die obere Kante des Geräts weg vom Boden, wird der Neigungswinkel negativ beeinflusst. Der Wertebereich liegt zwischen -90 Grad und 90 Grad.
  • Drehung (Drehung um die y-Achse). Dies ist der Winkel zwischen einer Ebene, die senkrecht zum Bildschirm des Geräts steht, und einer Ebene, die senkrecht zum Boden ist. Wenn du das Gerät parallel zum Boden hältst, die Unterkante dir am nächsten liegt, und die linke Seite des Geräts zum Boden neigst, wird der Rollwinkel positiv. Durch Neigen in die entgegengesetzte Richtung, d. h. durch Bewegen des rechten Geräterands zum Boden, wird der Rollwinkel negativ. Der Wertebereich liegt zwischen -180 Grad und 180 Grad.

Hinweis:Die Rolldefinition des Sensors wurde geändert und spiegelt die überwiegende Mehrheit der Implementierungen im Geosensor-System wider.

Beachten Sie, dass für diese Winkel ein anderes Koordinatensystem als in der Luftfahrt verwendet wird (Gier-, Neigungs- und Rollwinkel). In der Luftfahrt befindet sich die x-Achse an der langen Seite des Flugzeugs vom Heck bis zur Nase.

Der Ausrichtungssensor leitet seine Daten ab, indem er die Sensorrohdaten des Beschleunigungsmessers und des Sensors für das geomagnetische Feld verarbeitet. Aufgrund der aufwendigen Verarbeitung verschlechtert sich die Genauigkeit und Präzision des Ausrichtungssensors. Dieser Sensor ist nur dann zuverlässig, wenn der Rollwinkel 0 beträgt. Daher wurde der Ausrichtungssensor in Android 2.2 (API-Level 8) und der Ausrichtungssensortyp in Android 4.4W (API-Level 20) eingestellt. Anstatt Rohdaten aus dem 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. Dabei können Sie mit der Methode remapCoordinateSystem() die Ausrichtungswerte in den Referenzrahmen Ihrer Anwendung ü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 Rohausrichtungswinkel des Geräts vornehmen, es sei denn, das Koordinatensystem des Sensors wird in den Referenzrahmen Ihrer Anwendung übersetzt.

Sensor für geomagnetisches Feld verwenden

Mit dem Sensor für das geomagnetische Feld können Sie Veränderungen im Magnetfeld der Erde erkennen. Der folgende Code zeigt, 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 ratenbegrenzt.

Dieser Sensor liefert für jede der drei Koordinatenachsen Rohdaten zur Feldstärke in μT. Normalerweise müssen Sie diesen Sensor nicht direkt verwenden. Stattdessen können Sie den Rotationsvektorsensor zur Bestimmung der Rohdrehbewegung verwenden oder den Beschleunigungsmesser und den Sensor für das geomagnetische Feld in Verbindung mit der Methode getRotationMatrix() verwenden, um die Rotations- und Neigungsmatrix zu erhalten. Anschließend können Sie diese Matrizen mit den Methoden getOrientation() und getInclination() verwenden, um Daten zu Azimut und geomagnetischer Neigung zu erhalten.

Hinweis : Beim Testen Ihrer App können Sie die Genauigkeit des Sensors verbessern, indem Sie das Gerät im Format einer Acht bewegen.

Nicht kalibriertes Magnetometer verwenden

Das nicht kalibrierte Magnetometer ähnelt dem geomagnetischen Feldsensor, mit der Ausnahme, dass das Magnetfeld nicht auf Harteisen kalibriert wird. Die Werkskalibrierung und Temperaturkompensation werden weiterhin auf das Magnetfeld angewendet. Das nicht kalibrierte Magnetometer ist nützlich für schlechte Harteisenschätzungen. 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:Nicht kalibrierte Sensoren liefern mehr Rohdaten und können eine gewisse Verzerrung enthalten, aber ihre Messungen enthalten weniger Abweichungen aufgrund von Korrekturen, die durch die Kalibrierung vorgenommen wurden. Einige Anwendungen bevorzugen diese nicht kalibrierten Ergebnisse möglicherweise als reibungslosere und zuverlässigere Ergebnisse. Wenn eine Anwendung beispielsweise versucht, ihre eigene Sensorfusion durchzuführen, kann die Einführung von Kalibrierungen die Ergebnisse verzerren.

Zusätzlich zum Magnetfeld liefert das nicht kalibrierte Magnetometer auch die geschätzte Verzerrung durch Harteisen auf jeder Achse. Der folgende Code zeigt, wie Sie eine Instanz des nicht kalibrierten Standard-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 bestimmen, 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 vom Gesicht 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 geben jedoch nur nahe und große Werte zurück.

Hinweis:Bei einigen Gerätemodellen befindet sich der Näherungssensor unter dem Bildschirm. Dies kann dazu führen, dass ein blinkender Punkt auf dem Bildschirm erscheint, wenn er aktiviert ist, während das Display eingeschaltet ist.

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ärwerte für "in der Nähe" oder "weit" zurück. In diesem Fall meldet der Sensor in der Regel seinen maximalen Bereich im entfernten Zustand und einen niedrigeren Wert im nahen Zustand. In der Regel ist der weit entfernte Wert größer als 5 cm, kann aber von Sensor zu Sensor variieren. Sie können die maximale Reichweite eines Sensors mit der Methode getMaximumRange() bestimmen.

Weitere Informationen