Sensoren – Übersicht

Die meisten Android-Geräte verfügen über integrierte Sensoren, die Bewegung, Ausrichtung, und verschiedenen Umweltbedingungen. Diese Sensoren liefern Rohdaten Genauigkeit und Genauigkeit. Sie sind nützlich, wenn Sie die dreidimensionale Gerätebewegung oder die oder Sie möchten Änderungen in der Umgebung in der Nähe eines Geräts beobachten. Beispiel: Ein Spiel kann Messwerte des Schwerkraftsensors eines Geräts aufzeichnen, um komplexe Nutzergesten abzuleiten. und Bewegungen wie Neigung, Schütteln, Drehen oder Schaukeln. Ebenso kann eine Wetteranwendung den Temperatur- und Luftfeuchtigkeitssensor des Geräts, um den Taupunkt oder die Fahrtdauer zu berechnen und zu melden. mithilfe des Sensors für geomagnetische Felder und des Beschleunigungsmessers einen Kompass melden. die Lagerung.

Weitere Informationen finden Sie in den folgenden verwandten Ressourcen:

Die Android-Plattform unterstützt drei große Kategorien von Sensoren:

  • Bewegungssensoren

    Diese Sensoren messen Beschleunigungs- und Rotationskräfte entlang drei Achsen. Dieses Die Kategorie umfasst Beschleunigungsmesser, Schwerkraftsensoren, Gyroskope und Rotationsvektoren. Sensoren.

  • Umgebungssensoren

    Diese Sensoren messen verschiedene Umgebungsparameter, wie z. B. die Umgebungstemperatur Druck, Beleuchtung und Luftfeuchtigkeit. Diese Kategorie umfasst Barometer, Fotometer und mit Thermometern.

  • Positionssensoren

    Diese Sensoren messen die physische Position eines Geräts. Diese Kategorie umfasst Ausrichtungssensoren und Magnetometer.

Sie können auf die Sensoren auf dem Gerät zugreifen und Sensor-Rohdaten mithilfe der Android- Sensor-Framework. Das Sensor-Framework bietet mehrere Klassen und Schnittstellen, mit denen Sie für eine Vielzahl von sensorbezogenen Aufgaben. Mit dem Sensor-Framework können Sie beispielsweise Folgendes tun:

  • Herausfinden, welche Sensoren auf einem Gerät verfügbar sind
  • Die Funktionen eines einzelnen Sensors bestimmen, z. B. maximale Reichweite, Hersteller, Leistung und der Lösung vor.
  • Erfassen Sie Sensorrohdaten und definieren Sie die Mindestrate, mit der Sie Sensordaten erfassen.
  • Sensorereignis-Listener, die Sensoränderungen überwachen, registrieren und die Registrierung aufheben

In diesem Artikel erhalten Sie einen Überblick über die Sensoren, die auf der Android-Plattform verfügbar sind. Sie bietet auch eine Einführung in das Sensorsystem.

Einführung in Sensoren

Mit dem Android-Sensor-Framework kannst du auf viele Arten von Sensoren zugreifen. Einige dieser Sensoren sind hardwarebasiert und einige softwarebasiert. Hardwarebasierte Sensoren sind physische Komponenten, auf einem Mobiltelefon oder Tablet. Sie leiten ihre Daten ab, indem sie die spezifischen wie Beschleunigung, geomagnetische Feldstärke oder Winkeländerung. Softwarebasiert Sensoren sind keine physischen Geräte, obwohl sie hardwarebasierte Sensoren imitieren. Softwarebasierte Sensoren ihre Daten von einem oder mehreren hardwarebasierten Sensoren ableiten. oder synthetischen Sensoren nutzen. Der lineare Beschleunigungssensor und der Schwerkraftsensor sind Beispiele für softwarebasierten Sensoren. In Tabelle 1 sind die von Android unterstützten Sensoren aufgeführt. Plattform.

Nur wenige Android-Geräte haben alle Arten von Sensor. Die meisten Mobiltelefone und Tablets verfügen über einen Beschleunigungsmesser und ein Magnetometer, aber weniger Geräte haben Barometer oder Thermometern zu verwenden. Außerdem kann ein Gerät mehr als einen Sensor eines bestimmten Typs haben. Für Beispiel: Ein Gerät kann zwei Schwerkraftsensoren haben, die jeweils einen anderen Bereich haben.

Tabelle 1 Von der Android-Plattform unterstützte Sensortypen.

Sensor Typ Beschreibung Übliche Anwendungsbereiche
TYPE_ACCELEROMETER Hardware Misst die Beschleunigungskraft in m/s2, die auf ein Gerät angewendet wird. alle drei physischen Achsen (x, y und z), einschließlich der Schwerkraft. Bewegungserkennung (Schütteln, Neigen usw.).
TYPE_AMBIENT_TEMPERATURE Hardware Gibt die Raumtemperatur in Grad Celsius (°C) an. Siehe Hinweis unten. Überwachung der Lufttemperaturen.
TYPE_GRAVITY Software oder Hardware Gibt die Schwerkraft in m/s2 an, die auf ein Gerät angewendet wird drei physische Achsen (x, y, z). Bewegungserkennung (Schütteln, Neigen usw.).
TYPE_GYROSCOPE Hardware Misst die Drehgeschwindigkeit eines Geräts in Rad/s um jedes der drei Geräte Physische Achsen (x, y und z). Rotationserkennung (Drehen, Drehen usw.).
TYPE_LIGHT Hardware Gibt die Lichtintensität der Umgebung (Beleuchtung) in x L an. Bildschirmhelligkeit regeln
TYPE_LINEAR_ACCELERATION Software oder Hardware Misst die Beschleunigungskraft in m/s2, die sich ergibt. auf ein Gerät angewendet auf alle drei physischen Achsen (x, y und z) ohne die Schwerkraft. Beschleunigung entlang einer einzelnen Achse überwachen
TYPE_MAGNETIC_FIELD Hardware Misst das geomagnetische Umgebungsfeld für alle drei physischen Achsen (x, y, z) in μT. Kompass erstellen
TYPE_ORIENTATION Software Misst die Drehungsgrade eines Geräts um alle drei physischen Achsen (x, y, z). Ab API-Level 3 können Sie die Neigungs- und Rotationsmatrix für Gerät mithilfe des Schwerkraftsensors und des Sensors für geomagnetische Felder in Verbindung mit getRotationMatrix() . Geräteposition wird ermittelt.
TYPE_PRESSURE Hardware Misst den Luftdruck in hPa oder mbar. Überwachung von Luftdruckänderungen.
TYPE_PROXIMITY Hardware Misst die Nähe eines Objekts in cm relativ zur Ansicht eines Objekts . Dieser Sensor wird in der Regel verwendet, um zu bestimmen, ob ein Mobiltelefon nicht ins Ohr gesprochen. Position des Telefons während eines Anrufs.
TYPE_RELATIVE_HUMIDITY Hardware Gibt die relative Luftfeuchtigkeit in Prozent (%) an. Überwachung von Taupunkt, absoluter und relativer Luftfeuchtigkeit.
TYPE_ROTATION_VECTOR Software oder Hardware Misst die Ausrichtung eines Geräts anhand der drei Elemente des Rotationsvektor. Bewegungserkennung und Rotationserkennung.
TYPE_TEMPERATURE Hardware Misst die Temperatur des Geräts in Grad Celsius (°C). Dieser Sensor Implementierung variiert je nach Gerät und dieser Sensor wurde durch den Sensor TYPE_AMBIENT_TEMPERATURE ersetzt in API-Level 14 Überwachen von Temperaturen.

Sensorrahmen

Mithilfe des Android-Sensor-Frameworks können Sie auf diese Sensoren zugreifen und Sensorrohdaten erfassen. Das Sensor-Framework ist Teil des android.hardware-Pakets und umfasst Folgendes Klassen und Benutzeroberflächen:

SensorManager
Mit dieser Klasse können Sie eine Instanz des Sensordienstes erstellen. Dieser Kurs bietet Verschiedene Methoden für den Zugriff auf und das Auflisten von Sensoren, das Registrieren und Aufheben der Registrierung von Sensorereignissen und Ausrichtungsinformationen abruft. Diese Klasse bietet auch mehrere Sensorkonstanten Sie werden verwendet, um die Sensorgenauigkeit zu melden, die Datenaufnahmeraten festzulegen und Sensoren zu kalibrieren.
Sensor
Mit dieser Klasse können Sie eine Instanz eines bestimmten Sensors erstellen. Diese Klasse bietet verschiedene Methoden, mit denen Sie die Funktionen eines Sensors ermitteln können.
SensorEvent
Das System verwendet diese Klasse, um ein Sensorereignisobjekt zu erstellen, das Informationen zu einem Sensorereignis an. Ein Sensorereignisobjekt enthält die folgenden Informationen: die Sensorrohdaten, den Sensortyp, der das Ereignis generiert hat, die Genauigkeit der Daten und den Zeitstempel für
SensorEventListener
Über diese Oberfläche lassen sich zwei Callback-Methoden erstellen, die Benachrichtigungen erhalten (Sensor -Ereignissen), wenn sich Sensorwerte ändern oder sich die Sensorgenauigkeit ändert.

In einer typischen Anwendung verwenden Sie diese sensorbezogenen APIs, um zwei grundlegende Aufgaben auszuführen:

  • Sensoren und Sensorfunktionen erkennen

    Die Identifizierung von Sensoren und Sensorfunktionen während der Laufzeit ist nützlich, Funktionen, die bestimmte Sensortypen oder -funktionen nutzen. Vielleicht möchten Sie alle Sensoren eines Geräts ermitteln und Anwendungsfunktionen deaktivieren die auf nicht vorhandene Sensoren angewiesen sind. Vielleicht möchten Sie auch alle Sensoren eines bestimmten Typs aus, damit Sie die Sensorimplementierung auswählen können, die die optimale Leistung bietet für Ihre Anwendung.

  • Sensorereignisse beobachten

    Über das Monitoring von Sensorereignissen werden Sensorrohdaten erfasst. Jedes Mal, wenn ein Sensorereignis ein Sensor eine Änderung der zu messenden Parameter erkennt. Bei einem Sensorereignis erhalten Sie mit vier Informationen: dem Namen des Sensors, der das Ereignis ausgelöst hat, dem Zeitstempel des Ereignisses, die Genauigkeit des Ereignisses und die Sensor-Rohdaten, die ausgelöst haben über den Termin.

Sensorverfügbarkeit

Die Sensorverfügbarkeit variiert je nach Gerät, kann aber auch je nach Android-Gerät variieren. Versionen. Das liegt daran, dass die Android-Sensoren Plattform-Releases. Beispielsweise wurden in Android 1.5 (API-Level 3) viele Sensoren eingeführt, aber einige wurden nicht implementiert und standen erst ab Android 2.3 (API-Level 9) zur Verfügung. Gleichermaßen In Android 2.3 (API-Level 9) und Android 4.0 (API-Level 14) wurden mehrere Sensoren eingeführt. Zwei wurden eingestellt und durch neuere, bessere Sensoren ersetzt.

In Tabelle 2 ist die Verfügbarkeit der einzelnen Sensoren nach Plattform zusammengefasst. Nur vier da die Sensoren auf diesen Plattformen durchgeführt wurden. Sensoren, die die als veraltet aufgeführt sind, weiterhin auf nachfolgenden Plattformen verfügbar sind (vorausgesetzt, die Sensor auf einem Gerät vorhanden ist), was der Richtlinie zur Aufwärtskompatibilität von Android entspricht.

Tabelle 2: Sensorverfügbarkeit nach Plattform.

Sensor Android 4.0
(API-Level 14)
Android 2.3
(API-Level 9)
Android 2.2
(API-Level 8)
Android 1.5
(API-Level 3)
TYPE_ACCELEROMETER Ja Ja Ja Ja
TYPE_AMBIENT_TEMPERATURE Ja
TYPE_GRAVITY Ja Ja
TYPE_GYROSCOPE Ja Ja Nicht verfügbar1 Nicht verfügbar1
TYPE_LIGHT Ja Ja Ja Ja
TYPE_LINEAR_ACCELERATION Ja Ja
TYPE_MAGNETIC_FIELD Ja Ja Ja Ja
TYPE_ORIENTATION Ja2 Ja2 Ja2 Ja
TYPE_PRESSURE Ja Ja Nicht verfügbar1 Nicht verfügbar1
TYPE_PROXIMITY Ja Ja Ja Ja
TYPE_RELATIVE_HUMIDITY Ja
TYPE_ROTATION_VECTOR Ja Ja
TYPE_TEMPERATURE Ja2 Ja Ja Ja

1 Dieser Sensortyp wurde in Android 1.5 (API-Level) hinzugefügt 3), aber erst ab Android 2.3 (API-Level 9) verfügbar war.

2 Dieser Sensor ist verfügbar, eingestellt.

Sensoren und Sensorfunktionen identifizieren

Das Sensor-Framework von Android bietet mehrere Methoden, mit denen Sie welche Sensoren sich auf einem Gerät befinden. Die API bietet auch Methoden, mit denen Sie die Funktionen jedes Sensors, wie etwa maximale Reichweite, Auflösung und Leistung Anforderungen.

Um die Sensoren eines Geräts zu identifizieren, musst du zuerst eine Referenz zum Sensor abrufen . Dazu erstellen Sie eine Instanz der SensorManager-Klasse, indem Sie getSystemService()-Methode aufrufen und im Argument SENSOR_SERVICE. Beispiel:

Kotlin

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

Java

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

Als Nächstes können Sie eine Liste aller Sensoren auf einem Gerät abrufen, indem Sie die Methode getSensorList() und die Konstante TYPE_ALL verwenden. Beispiel:

Kotlin

val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)

Java

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Wenn Sie alle Sensoren eines bestimmten Typs auflisten möchten, können Sie statt TYPE_ALL wie TYPE_GYROSCOPE, TYPE_LINEAR_ACCELERATION oder TYPE_GRAVITY.

Außerdem können Sie mithilfe der Methode getDefaultSensor() und Übergeben des Typs ermitteln, ob auf dem Gerät ein bestimmter Sensortyp vorhanden ist. für einen bestimmten Sensor konstant ist. Wenn ein Gerät mehr als einen Sensor eines bestimmten Typs hat, wird einer der müssen als Standardsensoren festgelegt werden. Wenn für einen bestimmten Sensor kein Standardsensor vorhanden ist, Sensortyp verwendet, gibt der Methodenaufruf null zurück, was bedeutet, dass das Gerät nicht über diesen Sensor. Der folgende Code prüft beispielsweise, ob sich ein Magnetometer an einem Gerät befindet:

Kotlin

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) {
    // Success! There's a magnetometer.
} else {
    // Failure! No magnetometer.
}

Java

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
    // Success! There's a magnetometer.
} else {
    // Failure! No magnetometer.
}

Hinweis:Unter Android müssen Gerätehersteller keine bestimmte Arten von Sensoren in ihre Android-Geräte einbauen. So können Geräte Sensorkonfigurationen.

Neben der Auflistung der Sensoren eines Geräts kannst du auch die öffentlichen Methoden des Sensor, um die Fähigkeiten und Attribute einzelner Sensoren. Dies ist nützlich, wenn Sie möchten, dass sich Ihre Anwendung je nachdem, welche Sensoren oder Sensorfunktionen sind auf einem Gerät verfügbar. Sie können beispielsweise getResolution() und getMaximumRange() verwenden. um die Auflösung und den maximalen Messbereich eines Sensors zu ermitteln. Sie können auch die getPower()-Methode, um den Energiebedarf eines Sensors zu ermitteln.

Zwei der öffentlichen Methoden sind besonders nützlich, wenn Sie Ihre Anwendung für Sensoren verschiedener Hersteller oder Versionen eines Sensors. Wenn Ihre App zum Beispiel Nutzergesten wie Neigen und Schütteln überwachen muss, könnten Sie und Optimierungen für neuere Geräte, die einen speziellen Anbieter mit einem Gravitationssensor und einem anderen Datenfilterungsregeln und -optimierungen für Geräte ohne Gravitationssensor und nur einen Beschleunigungsmesser. Das folgende Codebeispiel zeigt, wie Sie mit den Methoden getVendor() und getVersion() Folgendes tun können: dies. In diesem Beispiel suchen wir nach einem Schwerkraftsensor, der Google LLC als Anbieter angibt. die Versionsnummer 3 hat. Ist dieser Sensor nicht auf dem Gerät vorhanden, versuchen wir, den Beschleunigungsmesser.

Kotlin

private lateinit var sensorManager: SensorManager
private var mSensor: Sensor? = null

...

sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) {
    val gravSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_GRAVITY)
    // Use the version 3 gravity sensor.
    mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 }
}
if (mSensor == null) {
    // Use the accelerometer.
    mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
    } else {
        // Sorry, there are no accelerometers on your device.
        // You can't play this game.
        null
    }
}

Java

private SensorManager sensorManager;
private Sensor mSensor;

...

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = null;

if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){
    List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);
    for(int i=0; i<gravSensors.size(); i++) {
        if ((gravSensors.get(i).getVendor().contains("Google LLC")) &&
           (gravSensors.get(i).getVersion() == 3)){
            // Use the version 3 gravity sensor.
            mSensor = gravSensors.get(i);
        }
    }
}
if (mSensor == null){
    // Use the accelerometer.
    if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
        mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    } else{
        // Sorry, there are no accelerometers on your device.
        // You can't play this game.
    }
}

Eine weitere nützliche Methode ist die Methode getMinDelay(). gibt das minimale Zeitintervall (in Mikrosekunden) zurück, das ein Sensor zum Erfassen von Daten verwenden kann. Beliebiger Sensor gibt einen Wert ungleich null für getMinDelay() zurück. ist eine Streaming-Methode Sensor. Streamingsensoren erfassen Daten in regelmäßigen Abständen und wurden mit Android 2.3 (API Level 9). Wenn ein Sensor beim Aufrufen der getMinDelay()-Methode Null zurückgibt, bedeutet dies, dass ist kein Streamingsensor, da er Daten nur dann ausgibt, wenn sich der Parameter, die er erkennt.

Die Methode getMinDelay() ist nützlich, bestimmen Sie den maximalen Preis, an dem ein Sensor Daten erfassen kann. Wenn bestimmte Funktionen Ihrer Anwendung ein hohes Datenvolumen erfordern oder Streaming-Sensoren nutzen, können Sie mit dieser Methode bestimmen, die diese Anforderungen erfüllt, und aktivieren oder deaktivieren Sie dann die entsprechenden Funktionen in Ihrer App. entsprechend anpassen.

Achtung:Die maximale Datenaufnahmerate eines Sensors ist nicht die Geschwindigkeit, mit der das Sensor-Framework Sensordaten an Ihre Anwendung liefert. Die Sensor-Framework meldet Daten anhand von Sensorereignissen. Verschiedene Faktoren beeinflussen die Geschwindigkeit, dass Ihre App Sensorereignisse empfängt. Weitere Informationen finden Sie unter Sensorereignisse überwachen.

Sensorereignisse überwachen

Um Sensor-Rohdaten zu überwachen, müssen Sie zwei Callback-Methoden implementieren, die über der SensorEventListener-Schnittstelle: onAccuracyChanged() und onSensorChanged(). Das Android-System ruft auf, diese Methoden immer dann, wenn Folgendes eintritt:

Der folgende Code zeigt, wie Sie mit der Methode onSensorChanged() Daten aus folgenden Quellen überwachen: des Lichtsensors an. In diesem Beispiel werden die Sensor-Rohdaten in einem TextView angezeigt. das entspricht in der Datei „main.xml“ als sensor_data definiert.

Kotlin

class SensorActivity : Activity(), SensorEventListener {
    private lateinit var sensorManager: SensorManager
    private var mLight: Sensor? = null

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
        // Do something here if sensor accuracy changes.
    }

    override fun onSensorChanged(event: SensorEvent) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        val lux = event.values[0]
        // Do something with this sensor value.
    }

    override fun onResume() {
        super.onResume()
        mLight?.also { light ->
            sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL)
        }
    }

    override fun onPause() {
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

Java

public class SensorActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor mLight;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        float lux = event.values[0];
        // Do something with this sensor value.
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }
}

In diesem Beispiel wird die Standarddatenverzögerung (SENSOR_DELAY_NORMAL) angegeben, wenn die Methode registerListener() aufgerufen wird. Die Daten Verzögerung (oder Abtastrate) steuert das Intervall, in dem Sensorereignisse an Ihre Anwendung gesendet werden mithilfe der Callback-Methode onSensorChanged(). Standardeinstellung Data Delay ist für das Monitoring geeignet Die typische Bildschirmausrichtung ändert sich und verwendet eine Verzögerung von 200.000 Mikrosekunden. Sie können andere Datenverzögerungen wie SENSOR_DELAY_GAME (20.000 Mikrosekunden) Verzögerung), SENSOR_DELAY_UI (60.000 Mikrosekunden Verzögerung) oder SENSOR_DELAY_FASTEST (Verzögerung von 0 Mikrosekunden). Ab Android 3.0 (API Ebene 11) können Sie die Verzögerung auch als absoluten Wert (in Mikrosekunden) angeben.

Die angegebene Verzögerung ist nur eine vorgeschlagene Verzögerung. Das Android-System und andere Apps können Sie diese Verzögerung ändern. Als Best Practice sollten Sie die größte Verzögerung angeben, die möglich ist, da verwendet das System in der Regel eine geringere Verzögerung als die von Ihnen angegebene Verzögerung (d. h., Sie sollten der langsamsten Sampling-Rate, die dennoch den Anforderungen Ihrer Anwendung entspricht). Eine größere Verzögerung führt zu Der Prozessor wird weniger belastet und verbraucht so weniger Energie.

Es gibt keine öffentliche Methode zum Bestimmen der Geschwindigkeit, mit der das Sensor-Framework sendet Sensorereignisse an Ihre Anwendung senden; Sie können jedoch die Zeitstempel verwenden, Sensorereignis verwenden, um die Abtastrate für mehrere Ereignisse zu berechnen. In diesem Fall sollten Sie die der Stichprobenrate (Verzögerung), nachdem Sie sie festgelegt haben. Falls Sie die Verzögerung ändern müssen, muss die Registrierung des Sensor-Listeners aufheben und dann erneut registrieren.

Wichtig: In diesem Beispiel werden die onResume() und onPause()-Callback-Methoden zum Registrieren und Aufheben der Registrierung des Sensorereignisses Listener. Es hat sich bewährt, Sensoren, die Sie nicht benötigen, immer zu deaktivieren, insbesondere wenn Ihre Aktivität pausiert. Wenn Sie dies nicht tun, kann sich der Akku innerhalb weniger Stunden entladen, da einige Sensoren haben hohe Anforderungen an die Stromversorgung und verbrauchen möglicherweise schnell die Akkukapazität. Das System deaktiviert die Sensoren nicht automatisch, wenn sich der Bildschirm ausschaltet.

Umgang mit verschiedenen Sensorkonfigurationen

Android spezifiziert keine standardmäßige Sensorkonfiguration für Geräte, Gerätehersteller können also jede gewünschte Sensorkonfiguration in ihre Android-Mobilgeräte Daher können Geräte verschiedene von Sensoren in einer Vielzahl von Konfigurationen. Wenn Ihre Anwendung einen bestimmten Sensortyp benötigt, müssen Sie dafür sorgen, Sensor ist auf einem Gerät vorhanden, sodass deine App erfolgreich ausgeführt werden kann.

Sie haben zwei Möglichkeiten, um sicherzustellen, dass ein bestimmter Sensor auf einem Gerät vorhanden ist:

  • Erkennt Sensoren während der Laufzeit und aktivieren oder deaktivieren Sie Anwendungsfunktionen nach Bedarf.
  • Verwenden Sie Google Play-Filter, um eine Ausrichtung auf Geräte mit bestimmten Sensorkonfigurationen vorzunehmen.

Jede Option wird in den folgenden Abschnitten erläutert.

Sensoren während der Laufzeit erkennen

Wenn Ihre Anwendung einen bestimmten Sensortyp verwendet, diesen aber nicht nutzt, können Sie den Sensor-Framework, um den Sensor zur Laufzeit zu erkennen und dann Anwendungsfunktionen zu deaktivieren oder zu aktivieren . Eine Navigationsanwendung könnte beispielsweise den Temperatursensor, Drucksensor, GPS-Sensor und Sensor für geomagnetisches Feld zur Anzeige der Temperatur, barometrischer Druck, Position und Kompasspeilung. Hat ein Gerät keinen Drucksensor, kannst du den um das Fehlen des Drucksensors während der Laufzeit zu erkennen und den Teil der Benutzeroberfläche Ihrer Anwendung, der die Auslastung anzeigt. Der folgende Code prüft beispielsweise ob es einen Drucksensor am Gerät gibt:

Kotlin

private lateinit var sensorManager: SensorManager
...
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) {
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

Java

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

Google Play-Filter für die Ausrichtung auf bestimmte Sensorkonfigurationen verwenden

Wenn Sie Ihre App bei Google Play veröffentlichen, können Sie die <uses-feature> -Element in Ihrer Manifestdatei, um Ihre App von Geräten zu filtern, die keine über die richtige Sensorkonfiguration für Ihre Anwendung verfügen. Die Das Element <uses-feature> enthält mehrere Hardwaredeskriptoren, mit denen Sie filtern können bestimmten Sensoren basieren. Sie können unter anderem folgende Sensoren auflisten: Beschleunigungsmesser, Barometer, Kompass (geomagnetisches Feld), Gyroskop, Licht und Näherung Die Hier sehen Sie ein Beispiel für einen Manifesteintrag, mit dem Apps gefiltert werden, die keinen Beschleunigungsmesser haben:

<uses-feature android:name="android.hardware.sensor.accelerometer"
              android:required="true" />

Wenn Sie dieses Element und diesen Deskriptor zum Manifest Ihrer Anwendung hinzufügen, sehen Nutzer Ihre App nur dann bei Google Play herunterladen, wenn das Gerät über einen Beschleunigungsmesser verfügt.

Sie sollten den Deskriptor nur dann auf android:required="true" festlegen, wenn Ihre Anwendung auf einen bestimmten Sensor basiert. Wenn Ihre Anwendung für einige Funktionen einen Sensor verwendet, läuft auch ohne den Sensor, sollten Sie ihn in die <uses-feature> eintragen -Element, legen Sie jedoch den Deskriptor auf android:required="false" fest. So wird sichergestellt, Geräte können deine App auch dann installieren, wenn sie diesen Sensor nicht haben. Dies ist auch ein Best Practice für das Projektmanagement, die Ihnen hilft, den Überblick über die von Ihrer Anwendung verwendeten Funktionen zu behalten. Wenn Ihre Anwendung einen bestimmten Sensor verwendet, aber ohne den Sensor läuft, sollten Sie den Sensor zur Laufzeit erkennen und die Anwendungsfunktionen angemessen sein.

Koordinatensystem mit Sensor

Im Allgemeinen verwendet das Sensor-Framework ein standardmäßiges 3-Achsen-Koordinatensystem, um Datenwerte auszudrücken. Bei den meisten Sensoren wird das Koordinatensystem relativ zum Bildschirm des Geräts definiert, wenn das Gerät in der Standardausrichtung gehalten wird (siehe Abbildung 1). Wird ein Gerät in der Standardausrichtung gehalten, Die X-Achse ist horizontal und zeigt nach rechts, die Y-Achse ist vertikal und zeigt nach oben und die Z zeigt zur Außenseite der Bildschirmfläche. Bei diesem System werden die Koordinaten hinter dem Bildschirm negative Z-Werte haben. Dieses Koordinatensystem wird von den folgenden Sensoren verwendet:

Abbildung 1: Koordinatensystem (relativ zu einem Gerät), das vom Sensor verwendet wird der API erstellen.

Der wichtigste Punkt bei diesem Koordinatensystem ist, dass die Achsen wird vertauscht, wenn sich die Bildschirmausrichtung des Geräts ändert, also das Koordinatensystem des Sensors. ändert sich nie, wenn sich das Gerät bewegt. Dieses Verhalten entspricht dem Verhalten des OpenGL- Koordinatensystem.

Sie sollten außerdem verstehen, dass Ihre Anwendung nicht davon ausgehen darf, dass ein natürliches Gerät (Standard) ist Hochformat. Die natürliche Ausrichtung vieler Tablets ist das Querformat. Und basiert das Sensorkoordinatensystem immer auf der natürlichen Ausrichtung des Geräts.

Wenn Ihre Anwendung schließlich Sensordaten mit dem Bildschirm auf dem Bildschirm abgleicht, müssen Sie die Funktion getRotation()-Methode zur Bestimmung der Bildschirmdrehung und verwende dann die Methode remapCoordinateSystem()-Methode für die Zuordnung Sensorkoordinaten in Bildschirmkoordinaten ein. Das müssen Sie auch dann tun, wenn in Ihrem Manifest angegeben ist, im Hochformat.

Hinweis:Einige Sensoren und Methoden nutzen ein Koordinatensystem, relativ zum Bezugsrahmen der Welt (im Gegensatz zum Bezugsrahmen des Geräts). Diese Sensoren und Methoden geben Daten zurück, die die Gerätebewegung oder die Geräteposition relativ zum Erde. Weitere Informationen findest du unter der Methode getOrientation(), der Methode getRotationMatrix(), Ausrichtung Sensor und Rotationsvektor Sensor

Sensorratenbegrenzung

Zum Schutz potenziell vertraulicher Nutzerdaten, wenn deine App auf Unter Android 12 (API-Level 31) oder höher legt das System ein Limit für die Aktualisierung fest. Datenfrequenz bestimmter Bewegungs- und Positionssensoren. Diese Daten die Werte enthält, die vom Beschleunigungsmesser Gyroskop und Geomagnetisches Feld

Die Beschränkung der Aktualisierungsrate hängt davon ab, wie Sie auf Sensordaten zugreifen:

Wenn Ihre App Bewegungssensordaten mit einer höheren Geschwindigkeit erfassen muss, müssen Sie deklarieren: HIGH_SAMPLING_RATE_SENSORS wie im folgenden Code-Snippet dargestellt. Wenn Ihre App versucht, Daten des Bewegungssensors mit einer höheren Rate zu erheben, ohne diese Berechtigung zu erteilen, ein SecurityException auftritt.

AndroidManifest.xml

<manifest ...>
    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>
    <application ...>
        ...
    </application>
</manifest>

Best Practices für den Zugriff auf und die Verwendung von Sensoren

Beachten Sie beim Entwerfen Ihrer Sensorimplementierung die Richtlinien in den diesem Abschnitt. Diese Richtlinien stellen Best Practices für alle Nutzer des Sensors dar. für den Zugriff auf Sensoren und zur Erfassung von Sensordaten.

Sensordaten nur im Vordergrund erheben

Auf Geräten mit Android 9 (API-Level 28) oder höher werden Apps, die in der Hintergrund gelten die folgenden Einschränkungen:

  • Sensoren, die den fortlaufend wie im Berichtsmodus (Beschleunigungsmesser und Gyroskope) angezeigt, Ereignisse.
  • Sensoren, die den bei Änderung oder One-Shot keine Ereignisse empfangen.

Angesichts dieser Einschränkungen ist es am besten, Sensorereignisse zu erkennen, wenn Ihre im Vordergrund ausgeführt wird oder Teil eines Dienst im Vordergrund.

Sensor-Listener abmelden

Achten Sie darauf, die Registrierung des Sensors aufzuheben, wenn Sie den Sensor nicht mehr benötigen oder die Aktivität pausiert. Wenn ein Sensor-Listener registriert und seine Aktivität pausiert wird, um weiterhin Daten zu erfassen und Akkuressourcen zu nutzen, bis Sie die Registrierung des Sensors aufheben. Die folgenden Der Code zeigt, wie Sie mit der Methode onPause() die Registrierung eines Listeners aufheben:

Kotlin

private lateinit var sensorManager: SensorManager
...
override fun onPause() {
    super.onPause()
    sensorManager.unregisterListener(this)
}

Java

private SensorManager sensorManager;
...
@Override
protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
}

Weitere Informationen findest du unter unregisterListener(SensorEventListener).

Mit dem Android-Emulator testen

Der Android-Emulator enthält eine Reihe virtueller Sensorsteuerelemente, um Sensoren wie Beschleunigungsmesser, Umgebungstemperatur, Magnetometer, Näherung, Licht und mehr.

Der Emulator verwendet eine Verbindung mit einem Android-Gerät, auf dem der SdkControllerSensor Diese App ist nur für Geräte mit Android 4.0 (API) verfügbar. Level 14) oder höher. (Falls auf dem Gerät Android 4.0 ausgeführt wird, muss es über Version 2 installiert) Die App SdkControllerSensor überwacht Änderungen in des Geräts und sendet sie an den Emulator. Der Emulator ist basierend auf den neuen Werten transformiert, die auf deinem Gerät.

Sie können den Quellcode für die App SdkControllerSensor in der folgende Position:

$ your-android-sdk-directory/tools/apps/SdkController

So kannst du Daten zwischen deinem Gerät und dem Emulator übertragen: Schritte:

  1. Prüfen Sie, ob USB-Kabel auf Ihrem Gerät aktiviert ist.
  2. Verbinden Sie Ihr Gerät über ein USB-Kabel mit dem Entwicklungscomputer.
  3. Starten Sie die App SdkControllerSensor auf Ihrem Gerät.
  4. Wählen Sie in der App die Sensoren aus, die Sie emulieren möchten.
  5. Führen Sie den folgenden adb-Befehl aus:

  6. $ adb forward tcp:1968 tcp:1968
    
  7. Starten Sie den Emulator. Sie sollten jetzt in der Lage sein, Transformationen auf die Emulator öffnen.

Hinweis : Wenn die Bewegungen, Gerät den Emulator nicht transformiert, führen Sie den Befehl adb-Befehl noch einmal aus Schritt 5.

Weitere Informationen finden Sie in der Android-Dokumentation Emulator-Leitfaden.

onSensorChanged()-Methode nicht blockieren

Sensordaten können sich sehr schnell ändern. Das bedeutet, dass das System die Methode onSensorChanged(SensorEvent) möglicherweise recht oft aufruft. Als Best Practice sollten Sie sollte mit der Methode onSensorChanged(SensorEvent) so wenig wie möglich unternehmen, damit sie nicht blockiert wird. Wenn Ihr Anwendung erfordert, dass Sie Daten filtern oder Sensordaten reduzieren, die außerhalb der onSensorChanged(SensorEvent)-Methode funktionieren.

Nicht mehr unterstützte Methoden oder Sensortypen verwenden

Mehrere Methoden und Konstanten wurden eingestellt. Insbesondere die TYPE_ORIENTATION Sensortyp wurde eingestellt. Zum Abrufen von Ausrichtungsdaten sollten Sie stattdessen die Methode getOrientation() verwenden. Ebenso gilt: Der Sensortyp „TYPE_TEMPERATURE“ wurde eingestellt. Sie sollten auf Geräten stattdessen den Sensortyp „TYPE_AMBIENT_TEMPERATURE“ auf denen Android 4.0 ausgeführt wird.

Prüfen Sie die Sensoren vor der Verwendung

Prüfen Sie immer, ob ein Sensor auf einem Gerät vorhanden ist, bevor Sie versuchen, Daten von ihm zu erfassen. Das sollten Sie nicht tun: dass ein Sensor existiert, einfach weil es sich um einen häufig genutzten Sensor handelt. Gerätehersteller sind keine bestimmten Sensoren in ihren Geräten bereitstellen müssen.

Sensorverzögerungen sorgfältig auswählen

Wenn du einen Sensor mit der Methode registerListener() registrierst, achte darauf, dass du eine Versandgeschwindigkeit auswählst, die für dein Anwendung oder Anwendungsfall. Sensoren können Daten mit sehr hohen Frequenzen liefern. Wenn Sie dem System erlauben, zusätzliche Daten, die Sie nicht benötigen, verschwenden Systemressourcen und verbrauchen Akkuleistung.