Search code examples
androidandroid-sensors

Android accelerometer only working in the virtual emulator


I am testing the accelerometer sensor. All works perfectly with the virtual device emulated by Android Studio. Moreover, when I try my code on my real smartphone, nothing happens in the logs. Look at the code below :

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

private SensorManager senSensorManager;
private Sensor senAccelerometer;
private long lastUpdate = 0;
private float last_x, last_y, last_z;
private long diffTime;
private static final int SHAKE_THRESHOLD = 600;
ArrayList numbersGenerated = new ArrayList();
private ArrayList<Row> rows;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public void onSensorChanged(SensorEvent sensorEvent) {

    Sensor mySensor = sensorEvent.sensor;

    if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        ArrayList<Row> rows = new ArrayList<>();
        Row row;


        float x = sensorEvent.values[0];
        float y = sensorEvent.values[1];
        float z = sensorEvent.values[2];

        long curTime = System.currentTimeMillis();

        if ((curTime - lastUpdate) > 100) {
           long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;
        }
        float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000;

        if (speed > SHAKE_THRESHOLD) {
            System.out.println("X\t Y\tZ");
            last_x = x;
            last_y = y;
            last_z = z;
            row = new Row(x,y,z);
            rows.add(row);
        }

        System.out.println("X\t Y\tZ");
        System.out.println("----------------------");
        for (Row printRow : rows)
        {
            System.out.println(
                    printRow.getX() + "\t " +
                            printRow.getY() + "\t" +
                            printRow.getZ());

    }


    }
else{
        System.out.println("no accelerometer");
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

protected void onPause() {
    super.onPause();
    senSensorManager.unregisterListener(this);
}

protected void onResume() {
    super.onResume();
    senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

class Row
{

    // REMEMBER: each attribute is a column
    //
    private final float x;
    private final float y;
    private final float z;

    public Row(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public float getX()
    {
        return x;
    }

    public float getY()
    {
        return y;
    }

    public float getZ()
    {
        return z;
    }

}

Do you have an idea about why it's not working? I have Android 4 on my smartphone and I set up with the correct version. Thanks!


Solution

  • Maybe your phone's accelerometer is not working? System.out.println is not a good way to log, use the LOG command instead. Try logging to the app screen instead, does that change anything?