Hier ist ein Beispielcode. Fügen Sie dies in Ihre Aktivitätsklasse ein:
/* put this into your activity class */
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity
private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent se) {
float x = se.values[0];
float y = se.values[1];
float z = se.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta; // perform low-cut filter
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mSensorListener);
super.onPause();
}
Und fügen Sie dies Ihrer onCreate-Methode hinzu:
/* do this in onCreate */
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
Sie können dann "mAccel", wo immer Sie möchten, in Ihrer Anwendung nach der aktuellen Beschleunigung fragen, unabhängig von der Achse und gereinigt von statischer Beschleunigung wie Schwerkraft. Es wird ca. sein. 0, wenn keine Bewegung stattfindet, und sagen wir> 2, wenn das Gerät geschüttelt wird.
Basierend auf den Kommentaren - um dies zu testen:
if (mAccel > 12) {
Toast toast = Toast.makeText(getApplicationContext(), "Device has shaken.", Toast.LENGTH_LONG);
toast.show();
}
Anmerkungen:
Das Beschleunigungsmesser sollte in der Pause deaktiviert und in der Wiederaufnahme aktiviert werden , um Ressourcen (CPU, Batterie) zu sparen. Der Code geht davon aus, dass wir uns auf dem Planeten Erde befinden ;-) und initialisiert die Beschleunigung auf die Erdgravitation. Andernfalls würden Sie ein starkes "Schütteln" bekommen, wenn die Anwendung startet und vom freien Fall auf den Boden "trifft". Der Code gewöhnt sich jedoch aufgrund des Low-Cut-Filters an die Gravitation und funktioniert nach seiner Initialisierung auch auf anderen Planeten oder im freien Raum. (Sie wissen nie, wie lange Ihre Anwendung verwendet wird ... ;-)