我想检测设备是否面朝上。 (不是成角度,而是平放在地面上)。
在某些面朝上的设备上,z 值将返回 9~10 之间的值。 (大多数设备)
然而,在 Nexus 7 上,对于面朝上,z 值将返回 6~8 之间的值。
我的代码是:
if(z_value > 9.0) {
// device facing up
}
else {
// device is in angled
}
但是,上面的代码不再起作用。由于 Nexus7 未达到 z_value 9。
如何检测设备是否(完全)朝上。 (不要求 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);
}};
Note #1
对于 Nexus 7,arg0.sensor.getMaximumRange() 返回 19.6133。哪个传感器永远不会返回。
Note #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
这样你就不会意外地除以零。
这种启发式方法需要测试和调整,但我想您已经明白了。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)