I’m working on a chunk of code that enables to the user to shake the phone and it displays or launches an activity from the shake. I’m trying to figure out why the code is not running when I shake the device. Yet when I run this code outside of a service it runs flawlessly.
Notes: The service does launch, I checked. The class to be launched is in my manifest, Again I checked. There are no errors present and even more freaky the code does not stop or fail when it is launched. it just does not do what I tell it. Yes all the proper permissions are set up as well.
So here is the code:
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
public class GMeter extends Service implements SensorEventListener {
private float mLastX, mLastY, mLastZ;
private boolean mInitialized;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private final float NOISE = (float) 2.0;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
mInitialized = false;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
Toast.makeText(this, "Starting Service", Toast.LENGTH_LONG).show();
}
protected void onResume() {
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
mSensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// can be safely ignored for this demo
}
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
double a = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double currentG = (a/ SensorManager.STANDARD_GRAVITY);
Toast.makeText(this, "Calculating G's", Toast.LENGTH_LONG).show();
if (!mInitialized && currentG > 1.0) {
mLastX = x;
mLastY = y;
mLastZ = z;
mInitialized = true;
//Start Second Activity
Intent intent = new Intent(getBaseContext(), thirdClass.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
getApplication().startActivity(intent);
}else {
float deltaX = Math.abs(mLastX - x);
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);
if (deltaX < NOISE) deltaX = (float)0.0;
if (deltaY < NOISE) deltaY = (float)0.0;
if (deltaZ < NOISE) deltaZ = (float)0.0;
mLastX = x;
mLastY = y;
mLastZ = z;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
This is not giving me any errors so there is no logcat to be presented.
Add below line, to make the service continue to run.Also Service does not have
OnResumeandOnPausefunctions, so they are useless in your case unless you are calling them yourself. But Service does have an onDestroy function which you can override to unregister your listenerEdit:
You are using
onCreate(Bundle savedInstanceState)which is not the oncreate signature that service calls.Use