多个设备上的不同加速度计值

时间:2013-01-14 14:50:39

标签: android accelerometer

我正在制作一款使用该设备的加速计来填充进度条的游戏。 在我的笔记2上,我需要大约20秒左右摇动手机才能填满酒吧,不过我尝试使用中兴刀片并花了4秒钟。

有没有办法在我的代码中校准加速度计?这就是我正在做的事情:

@Override
public void onSensorChanged(SensorEvent event) {

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        if (!mInitialized) {
            mLastX = x;
            mLastY = y;
            mLastZ = z;
            mInitialized = true;
        } 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;

            if(deltaY == 0){
                return;
            }

            sProgress += deltaY;
            pb.setProgress(sProgress);


        }


}

2 个答案:

答案 0 :(得分:0)

问题可能是使用Accelerometer的频率。注册时不要在android常量下面使用。

mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

这些值对于不同的设备是不同的。

int SENSOR_DELAY_FASTEST    get sensor data as fast as possible
int SENSOR_DELAY_GAME   rate suitable for games
int SENSOR_DELAY_NORMAL rate (default) suitable for screen orientation changes
int SENSOR_DELAY_UI rate suitable for the user interface

使用硬编码值,以微秒为单位,如频率1 Hz

mSensorManager.registerListener(this, mAccelerometer,1000000);

希望它能解决。

答案 1 :(得分:0)

使频率相等的另一种解决方案类似于以下解决方案。

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
  if(sensorEventTooQuick(sensorEvent.timestamp)) {
    return;
  }

  mLastSensorEventTime = sensorEvent.timestamp;

  // process sensor
}

private boolean sensorEventTooQuick(long sensorTime) {
  long diff = sensorTime - mLastSensorEventTime;
  return diff < MINIMUM_SENSOR_EVENT_GAP;
}

需要考虑的事项:

  • 您希望确保选择MINIMUM_SENSOR_EVENT_GAP足够小,以免丢失信息。加速度计非常快,所以这通常不是问题,但根据应用可能会成为其他传感器的问题。
  • 确保在不同设备上测试不同的值。

我这样做是因为它可以保证您不会比限制更快地收到事件。