In this example detecting Accelerometer Motion, when Accelerometer force value cross threshold showing an alert for motion detected.
Use :
1. You can use this example in games based on Accelerometer Motion (Phone Tilt).2. You can use this example for battery consumption when using GPS Calls. Combine Screen Wake Sleep Example with this example to consume less battery when calling GPS calls.Later We will give combined example to consume less battery.
Now follow the coding to develop this simple application
1. activity_accelerometer.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.arnold.accelerometer.AccelerometerActivity">
<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>
2. AccelerometerListener.java
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); }
3. AccelerometerManager.java
In this class define functions to start accelerometer sensor related
functions like.. Check for accelerometer sensor,start accelerometer
sensor,stop accelerometer sensor.
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); } }; }4. AccelerometerActivity.java
This is the main file and Start Accelerometer listening on Activity
onResume and stop Accelerometer listening on Activity onStop and
onDestroy
public class AccelerometerActivity extends Activity implements AccelerometerListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accelerometer);
}
@Override
public void onAccelerationChanged(float x, float y, float z) {
}
@Override
public void onShake(float force) {
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();
}
}
}
5. AndroidMainifest.xml
Define READ_PHONE_STATE permission
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.arnold.accelerometer">
<uses-permission android:name="android.permission.READ_PHONE_STATE">
</uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/icon9"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".AccelerometerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Output Screen shots...
_________________________________________________________
Source code for this application Accelerometer.zip
Happy Coding...


Comments
Post a Comment