如何知道Android设备是否在桌面上是平的

时间:2015-06-19 22:24:55

标签: java android accelerometer android-sensors

我使用accelometer传感器来检测我的设备是否在桌子上是平的。奇怪的是,即使我把手机放平或旋转在它的侧面,价值总是在90到100之间!这不应该是正确的!我错过了什么吗?这是我的代码:

   float[] values = event.values;
    // Movement
    float x = values[0];
    float y = values[1];
    float z = values[2];
    float norm_Of_g =(float) Math.sqrt(x * x + y * y + z * z);

    // Normalize the accelerometer vector
    x = (x / norm_Of_g);
    y = (y / norm_Of_g);
    z = (z / norm_Of_g);
    int inclination = (int) Math.round(Math.toDegrees(Math.acos(y)));
    Log.i("tag","incline is:"+inclination);

    if (inclination < 25 || inclination > 155)
    {
        // device is flat
        Toast.makeText(this,"device flat - beep!",Toast.LENGTH_SHORT);
    }

修改:我正在使用此代码:How to measure the tilt of the phone in XY plane using accelerometer in Android

2 个答案:

答案 0 :(得分:1)

您正在使用the answer you linked中使用的y轴而不是z轴。

当参数接近1时(或接近负数时接近180度),acos的值将接近于零,如下图所示:

Arccos(x)

因此,只有当y轴标准化为大约一个或负一个时,例如当它与重力平行时,你的倾斜度将接近零(或180)度(因此,设备是&#34;站立向上&#34;。)

如果没有其他错误,只需切换:

int inclination = (int) Math.round(Math.toDegrees(Math.acos(y)));

int inclination = (int) Math.round(Math.toDegrees(Math.acos(z)));

应该这样做。

答案 1 :(得分:0)

我使用了此页面上的代码Motion Sensors

public void onSensorChanged(SensorEvent event){
  // In this example, alpha is calculated as t / (t + dT),
  // where t is the low-pass filter's time-constant and
  // dT is the event delivery rate.

  final float alpha = 0.8;

  // Isolate the force of gravity with the low-pass filter.
  gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
  gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
  gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

  // Remove the gravity contribution with the high-pass filter.
  linear_acceleration[0] = event.values[0] - gravity[0];
  linear_acceleration[1] = event.values[1] - gravity[1];
  linear_acceleration[2] = event.values[2] - gravity[2];
}

这样做的目的是将加速度计值中的重力(重复测量)分解出来,只留下每个方向的加速度分量。

沿着每个轴测量重力,因此一旦您知道哪个轴代表平放的设备,您就可以检查大部分重力是否仅位于该轴上。这意味着该设备平放在桌子上。

您还可以查看线性加速度以确保设备无法移动。