【问题标题】:Android accelerometer classAndroid 加速度计类
【发布时间】:2012-08-12 12:10:56
【问题描述】:

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

这是我的加速度计课程:

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 。知道我的代码有什么问题吗?

这是使用它的 Activity:

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" />

【问题讨论】:

  • 你注册监听了吗?
  • 你能显示使用这个类的活动的代码吗?
  • 你是如何解决这个问题的@RohitMalish

标签: android class accelerometer


【解决方案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 作为参数传递。

我希望这会有所帮助。

【讨论】:

  • 在调用 super.OnCreate() 之前不要创建 Accelero 对象。是这个问题吗?
  • 是的,我修好了。但现在它只给我0,0,0。在我锁定屏幕并再次解锁后它确实会改变
  • 请添加更多代码(上面的代码应该读取加速数据),它可能与您的活动代码有关。
  • 你是对的,这是我的活动代码。现在它可以工作了。你知道我如何从 WallpaperService 调用它吗?
  • 好。你想从 WallpaperService 调用什么?
【解决方案2】:

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

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(代码取自本教程)

【讨论】:

  • 我是在我的活动还是加速度计类中添加这个?
  • 您需要在 Activity 的 onCreate() 中执行此操作。这样你就告诉你的活动将加速度计的数据发送到这个类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2011-06-12
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多