package com.sonaur.sonaur; import java.lang.reflect.*; import java.util.List; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * Android Accelerometer Sensor Manager Archetype * @author antoine vianey * under GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html */ public class AccelerometerManager { /** Accuracy configuration */ private float threshold = 0.2f; private int interval = 1000; private Sensor sensor; private SensorManager sensorManager; // you could use an OrientationListener array instead // if you plans to use more than one listener // private AccelerometerListener listener; Method shakeEventMethod; Method accelerationEventMethod; /** indicates whether or not Accelerometer Sensor is supported */ private Boolean supported; /** indicates whether or not Accelerometer Sensor is running */ private boolean running = false; Context context; public AccelerometerManager(Context parent) { this.context = parent; try { shakeEventMethod = parent.getClass().getMethod("shakeEvent", new Class[] { Float.TYPE }); } catch (Exception e) { // no such method, or an error.. which is fine, just ignore } try { accelerationEventMethod = parent.getClass().getMethod("accelerationEvent", new Class[] { Float.TYPE, Float.TYPE, Float.TYPE }); } catch (Exception e) { // no such method, or an error.. which is fine, just ignore } // System.out.println("shakeEventMethod is " + shakeEventMethod); // System.out.println("accelerationEventMethod is " + accelerationEventMethod); resume(); } public AccelerometerManager(Context context, int threshold, int interval) { this(context); this.threshold = threshold; this.interval = interval; } public void resume() { if (isSupported()) { startListening(); } } public void pause() { if (isListening()) { stopListening(); } } /** * Returns true if the manager is listening to orientation changes */ public boolean isListening() { return running; } /** * Unregisters listeners */ public void stopListening() { running = false; try { if (sensorManager != null && sensorEventListener != null) { sensorManager.unregisterListener(sensorEventListener); } } catch (Exception e) { } } /** * Returns true if at least one Accelerometer sensor is available */ public boolean isSupported() { if (supported == null) { sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); List sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); supported = new Boolean(sensors.size() > 0); } return supported; } // /** // * Configure the listener for shaking // * @param threshold // * minimum acceleration variation for considering shaking // * @param interval // * minimum interval between to shake events // */ // public static void configure(int threshold, int interval) { // AccelerometerManager.threshold = threshold; // AccelerometerManager.interval = interval; // } /** * Registers a listener and start listening * @param accelerometerListener callback for accelerometer events */ public void startListening() { // AccelerometerListener accelerometerListener = (AccelerometerListener) context; sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); List sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); if (sensors.size() > 0) { sensor = sensors.get(0); running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME); // listener = accelerometerListener; } } // /** // * Configures threshold and interval // * And registers a listener and start listening // * @param accelerometerListener // * callback for accelerometer events // * @param threshold // * minimum acceleration variation for considering shaking // * @param interval // * minimum interval between to shake events // */ // public void startListening(int threshold, int interval) { // configure(threshold, interval); // startListening(); // } /** * The listener that listen to events from the accelerometer listener */ //private static SensorEventListener sensorEventListener = new SensorEventListener() { private SensorEventListener sensorEventListener = new SensorEventListener() { private long now = 0; private long timeDiff = 0; private long lastUpdate = 0; private long lastShake = 0; private float x = 0; private float y = 0; private float z = 0; private float lastX = 0; private float lastY = 0; private float lastZ = 0; private float force = 0; public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { // use the event timestamp as reference // so the manager precision won't depends // on the AccelerometerListener implementation // processing time now = event.timestamp; x = event.values[0]; y = event.values[1]; z = event.values[2]; // if not interesting in shake events // just remove the whole if then else bloc // trigger change event // listener.onAccelerationChanged(x, y, z); if (accelerationEventMethod != null) { try { accelerationEventMethod.invoke(context, new Object[] { x, y, z }); } catch (Exception e) { e.printStackTrace(); accelerationEventMethod = null; } } } }; }