Android加速度计类

时间:2012-08-12 12:10:56

标签: android class accelerometer

我尝试创建单独的加速度计类,其中包含加速度计的值,我可以随时从任何其他类访问它们,但它似乎不起作用。

这是我的Accelerometer类:

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;

public class Accelero implements SensorEventListener {

    private float xAxis;
    private float yAxis;
    private float zAxis;

    public float getX(){
        return this.xAxis;
    }

    public float getY(){
        return this.yAxis;
    }

    public float getZ(){
        return this.zAxis;
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

    public void onSensorChanged(SensorEvent event) {
            xAxis = event.values[0];
            yAxis = event.values[1];
            zAxis = event.values[2];
    }

}

所以当你看到我试图通过我创建的get*();方法获取值时。但似乎总是返回0, 0, 0。知道我的代码有什么问题吗?

以下是使用它的活动:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.EditText;

public class MainActivity extends Activity {

    private EditText output;
    private static int DIS = 1;
    Accelero acc;

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

        output =(EditText) findViewById(R.id.editText1);
        handler.sendEmptyMessageDelayed(DIS, 1);
        acc = new Accelero(this);

    }

    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == DIS){
                refresh();
                handler.sendEmptyMessageDelayed(DIS, 1);     
            }
        }
    };

    public void refresh(){
        output.setText("X:"+acc.getX()+"\nY:"+acc.getY()+"\nZ:"+acc.getZ());
    }
}

我在清单中也有这个暂停:

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />

2 个答案:

答案 0 :(得分:1)

您需要将传感器监听器注册到活动中的传感器管理器

public class Main extends Activity implements SensorEventListener {
    private float mLastX, mLastY, mLastZ;
    private boolean mInitialized;

    private SensorManager mSensorManager;

    private Sensor mAccelerometer;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(new Accelero(), mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
}

有关详细教程(本教程中的代码)

,请参阅here

答案 1 :(得分:1)

您必须注册正在使用的传感器,在本例中为加速度计。 我猜你想在“Accelero”课程中想要与加速度计相关的一切。

要从该类注册监听器,您必须传递对您的活动的引用。所以你的构造函数应该是这样的:

SensorManager manager;
Sensor accelerometer;
Activity foo;

public Accelero(Activity foo) {
    this.foo = foo;
    manager = (SensorManager) this.foo.getSystemService(Context.SENSOR_SERVICE);
    accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
    manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
 }

当您创建Accelero对象时,只需将this作为参数传递。

我希望这会有所帮助。