我应该使用哪种Android传感器来获取磁性方向和倾向于地平线?

时间:2016-08-10 09:57:50

标签: android android-sensors

到目前为止,我一直在Android上使用TYPE_ORIENTATION传感器,即使它已被弃用,但它确实不准确,所以我觉得我需要更好的东西。我需要得到的是朝向磁北方(如指南针)和倾向于地平线(电话相机指向的地方和地平线之间的角度)。

对于类似罗盘的功能,我不知道是否必须使用TYPE_MAGNETIC_FIELD传感器或TYPE_ROTATION_VECTOR

对于倾向于地平线,我不知道是否应该使用TYPE_ACCELEROMETER传感器或TYPE_GRAVITY传感器。重力传感器似乎与加速度计相同,但只有重力加速,所以我想我应该使用重力传感器吗?

任何类型的答案都很有用,甚至可以将这个问题声明为已经回答并提供链接。谢谢。

1 个答案:

答案 0 :(得分:1)

对于类似罗盘的功能,我会使用TYPE_MAGNETIC_FIELD。但是你必须将它与TYPE_ACCELEROMETER的值结合起来,就像罗盘一样,你还需要手机相对于地球的当前位置(或重力)。然后你必须计算手机的rotationMatrix:

SensorManager.getRotationMatrix(this.rotationMatrix,null, this.lastAccelerometer, this.lastMagnetometer);
SensorManager.getOrientation(this.rotationMatrix, this.orientation);

float azimuthInRadiands = this.orientation[0];
float azimuthInDegrees = (float) Math.toDegrees(azimuthInRadiands);

这个代码来自我写的助手。如果你不能用它来提供指南针,那你就不必实现它了:

CompassAssistant Helper Class

如果你不想,你可以阅读代码。

对于地平线倾斜,您可以选择TYPE_GRAVITY或TYPE_ACCELEROMETER。如果您在API级别9之上开发Android,则应使用TYPE_GRAVITY。你应该这样做,因为TYPE_GRAVITY只给你重力的影响,加速度计给你引力加上手机的加速度。如果您想使用加速度计,您应该使用高通滤波器来减去加速度,这样您才能获得重力。另外,当用户移动手机时,您的倾向会发生变化。因此,这取决于您必须提供的API级别。

希望我能帮助你。