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