到目前为止,我一直在Android上使用TYPE_ORIENTATION
传感器,即使它已被弃用,但它确实不准确,所以我觉得我需要更好的东西。我需要得到的是朝向磁北方(如指南针)和倾向于地平线(电话相机指向的地方和地平线之间的角度)。
对于类似罗盘的功能,我不知道是否必须使用TYPE_MAGNETIC_FIELD
传感器或TYPE_ROTATION_VECTOR
。
对于倾向于地平线,我不知道是否应该使用TYPE_ACCELEROMETER
传感器或TYPE_GRAVITY
传感器。重力传感器似乎与加速度计相同,但只有重力加速,所以我想我应该使用重力传感器吗?
任何类型的答案都很有用,甚至可以将这个问题声明为已经回答并提供链接。谢谢。
答案 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);
这个代码来自我写的助手。如果你不能用它来提供指南针,那你就不必实现它了:
如果你不想,你可以阅读代码。
对于地平线倾斜,您可以选择TYPE_GRAVITY或TYPE_ACCELEROMETER。如果您在API级别9之上开发Android,则应使用TYPE_GRAVITY。你应该这样做,因为TYPE_GRAVITY只给你重力的影响,加速度计给你引力加上手机的加速度。如果您想使用加速度计,您应该使用高通滤波器来减去加速度,这样您才能获得重力。另外,当用户移动手机时,您的倾向会发生变化。因此,这取决于您必须提供的API级别。
希望我能帮助你。