Android:在不同的设备上,加速计传感器的z值范围是不同的

Android:在不同的设备上,加速计传感器的z值范围是不同的,android,accelerometer,sensors,Android,Accelerometer,Sensors,我想检测设备是否朝上。(不成角度,但与地面平向上)。 在一些面向上的设备上,z值将返回9~10之间的值。(大多数设备) 但是,在Nexus 7上,对于“面朝上”,z值将返回6到8之间的值。 我的代码是: if(z_value > 9.0) { // device facing up } else { // device is in angled } 然而,上面的代码不再工作了。因为Nexus7没有达到z_值9 如何检测设备是否(完全)朝上。(不要求z_值大于0) 我的完整

我想检测设备是否朝上。(不成角度,但与地面平向上)。
在一些面向上的设备上,z值将返回9~10之间的值。(大多数设备)
但是,在Nexus 7上,对于“面朝上”,z值将返回6到8之间的值。

我的代码是:

if(z_value > 9.0) {
    // device facing up
}
else {
    // device is in angled
}
然而,上面的代码不再工作了。因为Nexus7没有达到z_值9

如何检测设备是否(完全)朝上。(不要求z_值大于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);
            }};
@覆盖
受保护的void onStart(){
super.onStart();
试一试{
sensorManager=(sensorManager)getSystemService(Context.SENSOR\u服务);
List sensorList=sensorManager.getSensorList(传感器类型\加速计);
如果(sensorList.size()>0){
加速度计present=真;
加速度计传感器=传感器列表。获取(0);
}
否则{
加速度计present=假;
}
if(加速度计当前){
sensorManager.registerListener(accelerometerListener、accelerometerSensor、sensorManager.SENSOR\u DELAY\u UI);
}
}捕获(例外e){}
}
私有SensorEventListener accelerometerListener=新的SensorEventListener(){
@凌驾
已更改精度上的公共无效(传感器arg0,int arg1){}
@凌驾
传感器更改时的公共无效(传感器事件arg0){
浮点z_值=arg0.values[2];
Log.d(“测试”,“z:+z_值”);
}};
注意#1
arg0.sensor.getMaximumRange()为Nexus 7返回19.6133。哪个传感器永远不会回来

注意#2
如果摇动设备,z_值会稍微升高(有时为8~8.5)。
如果您稳定地倾斜设备,z_值不会达到8(最大值)

关于这种传感器的一般想法是避免使用它们,或者不要以应用程序依赖于真正精确测量的方式滥用它们

这种传感器的问题基本上是,它们的值范围不同,而且非常嘈杂,所以它们需要由编码人员对其进行标准化,而它们的准确性就不可能如此可靠

我忘记了这次公开演讲的确切名称,但即使是谷歌和安卓团队也建议不要在小数方面过于依赖它,或者不要期望非常准确;还要记住,智能手机和平板电脑的每一小部分都非常便宜,我们谈论的传感器通常不超过1美元

尝试以代码只需要大致方向或轴的方式进行编码,如果需要值,请确保它是整数,并且始终进行粗略计算,不要期望精度或小数


还要记住,Android没有提供一个标准化的方法来处理这个值,所以你必须在你的代码中处理这个问题。

显然,这个设备校准得很差。校准良好的装置应返回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
,这样您就不会意外地被零除


这种启发式需要测试和调整,但我想你明白了。祝你好运

我在我的N7上运行了一个快速测试,当平放/正面朝上时,它返回的Z值约为9.8。您的设备可能有缺陷吗?如果你愿意,我可以运行你的代码并报告。这个答案不是很准确。如果您是正确的,那么API中就不存在像
GRAVITY\u EARTH
这样的常量。但他们确实如此。当然,这些价值观是不科学的。然而,OP观测值太低了近20%,即使是最便宜的传感器,这也不在精度范围之内。