In this example detecting Accelerometer Motion, when Accelerometer force value cross thersold showing an alert for motion detected.
1. You can use this example in games based on Accelerometer Motion (Phone Tilt).
2. You can use this example for battary consumption when using GPS Calls. Combine Screen Wake Sleep Example with this example to consume less battary when calling GPS calls.Later We will give combined example to consume less battery.
Check this example in real device.
Create Interface AccelerometerListener and create method onShake, we will override this function in main activity file and listener will call this method when motion detected.
public interface AccelerometerListener { public void onAccelerationChanged(float x, float y, float z); public void onShake(float force); }
This is the maain file aand Start Accelerometer listening on Activity onResume and stop Accelerometer listening on Activity onStop and onDestroy
package com.androidexample.accelerometerexample; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.widget.Toast; public class MainAccelerometer extends Activity implements AccelerometerListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.accelerometer_example_main); // Check onResume Method to start accelerometer listener } public void onAccelerationChanged(float x, float y, float z) { // TODO Auto-generated method stub } public void onShake(float force) { // Do your stuff here // Called when Motion Detected Toast.makeText(getBaseContext(), "Motion detected", Toast.LENGTH_SHORT).show(); } @Override public void onResume() { super.onResume(); Toast.makeText(getBaseContext(), "onResume Accelerometer Started", Toast.LENGTH_SHORT).show(); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isSupported(this)) { //Start Accelerometer Listening AccelerometerManager.startListening(this); } } @Override public void onStop() { super.onStop(); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isListening()) { //Start Accelerometer Listening AccelerometerManager.stopListening(); Toast.makeText(getBaseContext(), "onStop Accelerometer Stoped", Toast.LENGTH_SHORT).show(); } } @Override public void onDestroy() { super.onDestroy(); Log.i("Sensor", "Service distroy"); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isListening()) { //Start Accelerometer Listening AccelerometerManager.stopListening(); Toast.makeText(getBaseContext(), "onDestroy Accelerometer Stoped", Toast.LENGTH_SHORT).show(); } } }
In this class define functions to start acclerometer sensor related functions like.. Check for acclerometer sensor,start acclerometer sensor,stop acclerometer sensor.
import java.util.List; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.Toast; public class AccelerometerManager { private static Context aContext=null; /** Accuracy configuration */ private static float threshold = 15.0f; private static int interval = 200; private static Sensor sensor; private static SensorManager sensorManager; // you could use an OrientationListener array instead // if you plans to use more than one listener private static AccelerometerListener listener; /** indicates whether or not Accelerometer Sensor is supported */ private static Boolean supported; /** indicates whether or not Accelerometer Sensor is running */ private static boolean running = false; /** * Returns true if the manager is listening to orientation changes */ public static boolean isListening() { return running; } /** * Unregisters listeners */ public static 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 static boolean isSupported(Context context) { aContext = context; if (supported == null) { if (aContext != null) { sensorManager = (SensorManager) aContext. getSystemService(Context.SENSOR_SERVICE); // Get all sensors in device List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER); supported = new Boolean(sensors.size() > 0); } else { supported = Boolean.FALSE; } } 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 static void startListening( AccelerometerListener accelerometerListener ) { sensorManager = (SensorManager) aContext. getSystemService(Context.SENSOR_SERVICE); // Take all sensors in device List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER); if (sensors.size() > 0) { sensor = sensors.get(0); // Register Accelerometer Listener 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 static void startListening( AccelerometerListener accelerometerListener, int threshold, int interval) { configure(threshold, interval); startListening(accelerometerListener); } /** * The listener that listen to events from the accelerometer listener */ private static 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 block if (lastUpdate == 0) { lastUpdate = now; lastShake = now; lastX = x; lastY = y; lastZ = z; Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } else { timeDiff = now - lastUpdate; if (timeDiff > 0) { /*force = Math.abs(x + y + z - lastX - lastY - lastZ) / timeDiff;*/ force = Math.abs(x + y + z - lastX - lastY - lastZ); if (Float.compare(force, threshold) >0 ) { //Toast.makeText(Accelerometer.getContext(), //(now-lastShake)+" >= "+interval, 1000).show(); if (now - lastShake >= interval) { // trigger shake event listener.onShake(force); } else { Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } lastShake = now; } lastX = x; lastY = y; lastZ = z; lastUpdate = now; } else { Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } } // trigger change event listener.onAccelerationChanged(x, y, z); } }; }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidexample.accelerometerexample" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.androidexample.accelerometerexample.MainAccelerometer" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> </manifest>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainAccelerometer" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Shake / Tilt Your Phone To Get Accelerometer Motion Alerts" /> </RelativeLayout>