1 package com.android.music;
\r
3 import android.content.Context;
\r
4 import android.hardware.Sensor;
\r
5 import android.hardware.SensorEvent;
\r
6 import android.hardware.SensorEventListener;
\r
7 import android.hardware.SensorManager;
\r
8 import android.os.SystemClock;
\r
10 public class Shaker {
\r
11 private SensorManager mgr = null;
\r
12 private long lastShakeTimestamp = 0;
\r
13 private double threshold = 1.0d;
\r
14 private long gap = 0;
\r
15 private Shaker.Callback cb = null;
\r
17 public Shaker(Context ctxt, double threshold, long gap, Shaker.Callback cb) {
\r
18 this.threshold = threshold * threshold;
\r
19 this.threshold = this.threshold * SensorManager.GRAVITY_EARTH
\r
20 * SensorManager.GRAVITY_EARTH;
\r
24 mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE);
\r
25 mgr.registerListener(listener,
\r
26 mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
\r
27 SensorManager.SENSOR_DELAY_UI);
\r
30 public void close() {
\r
31 mgr.unregisterListener(listener);
\r
34 private void isShaking() {
\r
35 long now = SystemClock.uptimeMillis();
\r
37 if (lastShakeTimestamp == 0) {
\r
38 lastShakeTimestamp = now;
\r
41 cb.shakingStarted();
\r
44 lastShakeTimestamp = now;
\r
46 } catch (NullPointerException e) {
\r
51 private void isNotShaking() {
\r
52 long now = SystemClock.uptimeMillis();
\r
54 if (lastShakeTimestamp > 0) {
\r
55 if (now - lastShakeTimestamp > gap) {
\r
56 lastShakeTimestamp = 0;
\r
59 cb.shakingStopped();
\r
65 public interface Callback {
\r
66 void shakingStarted();
\r
68 void shakingStopped();
\r
71 private SensorEventListener listener = new SensorEventListener() {
\r
72 public void onSensorChanged(SensorEvent e) {
\r
73 if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
\r
74 double netForce = e.values[0] * e.values[0];
\r
76 netForce += e.values[1] * e.values[1];
\r
77 netForce += e.values[2] * e.values[2];
\r
79 if (threshold < netForce) {
\r
87 public void onAccuracyChanged(Sensor sensor, int accuracy) {
\r