Signatur
Beschreibung
Der Konstruktor Accelerometer() gehört zur Generic Sensor API und erzeugt einen Sensor, der die Beschleunigung des Geräts auf allen drei Achsen misst – einschließlich der Erdbeschleunigung. Ein ruhig auf dem Tisch liegendes Smartphone meldet daher auf der Z-Achse etwa 9,81 m/s². Wer nur die vom Nutzer verursachte Bewegung braucht, nimmt LinearAccelerationSensor, wer nur die Schwerkraft braucht, GravitySensor.
Nach dem Anlegen misst der Sensor noch nichts. Erst ein Aufruf von start() startet die Messung. Neue Werte kommen über das Ereignis reading an und stehen dann in den Eigenschaften x, y und z bereit. Fehler wie eine verweigerte Berechtigung oder fehlende Hardware meldet das Ereignis error. Mit stop() beendet man die Messung wieder und schont so den Akku.
Typische Einsatzfälle sind Schüttelgesten, Schrittzähler, Steuerung von Spielen über Neigen des Geräts oder Wasserwaagen-Apps. Über das Options-Objekt legt man die Abtastrate (frequency) und das Bezugskoordinatensystem (referenceFrame) fest.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options | object | {} | Optionales Konfigurationsobjekt für den Sensor. |
| $options.frequency | number | abhängig von der Implementierung | Gewünschte Anzahl an Messungen pro Sekunde (Hz). Der Browser kann den Wert nach oben begrenzen, in Chrome in der Regel auf 60 Hz. |
| $options.referenceFrame | 'device' | 'screen' | 'device' | Bezugssystem der Achsen: 'device' folgt dem physischen Gerät, 'screen' der aktuellen Bildschirmausrichtung. |
Rückgabewert
Accelerometer-Objekt (erbt von Sensor und damit von EventTarget).Beispiele
Beschleunigung auslesen
if ('Accelerometer' in window) {
const sensor = new Accelerometer({ frequency: 10 });
sensor.addEventListener('reading', () => {
console.log(`x: ${sensor.x.toFixed(2)}, y: ${sensor.y.toFixed(2)}, z: ${sensor.z.toFixed(2)}`);
});
sensor.addEventListener('error', (event) => {
console.error(event.error.name, event.error.message);
});
sensor.start();
} else {
console.warn('Accelerometer wird nicht unterstützt');
}
Berechtigung vor dem Start prüfen
const startAccelerometer = async () => {
const { state } = await navigator.permissions.query({ name: 'accelerometer' });
if (state === 'denied') {
console.warn('Zugriff auf den Beschleunigungssensor verweigert');
return null;
}
const sensor = new Accelerometer({ frequency: 30, referenceFrame: 'screen' });
sensor.start();
return sensor;
};
startAccelerometer().then((s) => s && console.log('Sensor aktiv:', s.activated));
Schüttelgeste erkennen
const THRESHOLD = 25; // m/s²
const sensor = new Accelerometer({ frequency: 60 });
let lastShake = 0;
sensor.onreading = () => {
const { x, y, z } = sensor;
const magnitude = Math.hypot(x, y, z);
const now = performance.now();
if (magnitude > THRESHOLD && now - lastShake > 1000) {
lastShake = now;
console.log('Gerät wurde geschüttelt!');
}
};
sensor.onerror = (e) => console.error(e.error);
sensor.start();
// Beim Verlassen der Seite Sensor stoppen
document.addEventListener('visibilitychange', () => {
document.hidden ? sensor.stop() : sensor.start();
});
// Wichtig · Fallstricke
- Browser-Unterstützung: nur Chromium-basierte Browser (Chrome, Edge, Opera, Samsung Internet), vor allem auf Mobilgeräten. Firefox und Safari unterstützen die API nicht – vorher immer mit
'Accelerometer' in windowprüfen. Als Ausweichlösung dient das Ereignisdevicemotion. - Sicherer Kontext: nur über HTTPS (oder
localhost) verfügbar. In iframes muss die Permissions Policyaccelerometerfreigegeben sein. - Der Konstruktor kann
SecurityErrorwerfen, wenn die Policy den Zugriff verbietet, undReferenceError, wenn die API fehlt. Deshalb intry/catcheinpacken. - Fehlende Hardware oder eine verweigerte Berechtigung werfen keine Ausnahme, sondern kommen asynchron über das
error-Ereignis (NotReadableError,NotAllowedError). - Vor dem ersten
reading-Ereignis sindx,yundzgleichnull. - Datenschutz/Akku: Bewegungsdaten lassen sich für Fingerprinting und das Ausspähen von Tastatureingaben missbrauchen. Deshalb begrenzen Browser die Frequenz und pausieren Sensoren in Hintergrund-Tabs. Nicht benötigte Sensoren mit
stop()beenden.