我想检测设备是否正面朝上。 (不是倾斜的,而是平放在地面上的)。
在某些面向上的设备上,z 值将返回 9~10 之间的值。 (大多数设备)
然而,在 Nexus 7 上,对于面朝上,z 值将返回 6~8 之间的值。
我的代码是:
if(z_value > 9.0) {
// device facing up
}
else {
// device is in angled
}
但是,上面的代码不再起作用了。因为 Nexus7 没有达到 9 的 z_value。
如何检测设备是否(完全)朝上。 (不要求 z_value > 0)
我的完整代码如下:
@Override
protected void onStart() {
super.onStart();
try {
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if(sensorList.size() > 0){
accelerometerPresent = true;
accelerometerSensor = sensorList.get(0);
}
else{
accelerometerPresent = false;
}
if(accelerometerPresent){
sensorManager.registerListener(accelerometerListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI);
}
} catch(Exception e) {}
}
private SensorEventListener accelerometerListener = new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {}
@Override
public void onSensorChanged(SensorEvent arg0) {
float z_value = arg0.values[2];
Log.d("test", "z:" + z_value);
}};
注释#1
arg0.sensor.getMaximumRange() 为 Nexus 7 返回 19.6133。哪个传感器永远不会返回。
注释#2
如果摇晃设备,z_value 会略微升高(有时为 8~8.5)。
如果您稳定地倾斜设备,z_value 不会达到 8(最大值)。
最佳答案
显然设备校准不当。校准良好的设备应返回 9.81m/s^2,即重力加速度。
您可以改为:将 z 值与 x 和 y 值进行比较。如果 z 值占主导地位,则设备正面朝上。例如:
if (z/sqrt(x^2+y^2+z^2+1.0e-6) > 0.9) { // Facing up
我添加了术语 1.0e-6
这样您就不会不小心被零除。
这种启发式方法需要测试和调整,但我想您已经明白了。祝你好运!
关于Android:加速度计传感器中z值的范围在不同的设备上是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018119/