android - 我应该使用哪个 Android 传感器来获取地平线的磁方向和倾斜度?

标签 android android-sensors

到目前为止,我一直在 Android 上使用 TYPE_ORIENTATION 传感器,尽管它已被弃用并且非常不准确,所以我决定我需要更好的东西。我需要得到的是朝向磁北的方向(如指南针)和朝向地平线的倾斜度(手机相机指向的位置与地平线之间的角度)。

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

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

任何类型的答案都是有用的,甚至将此问题声明为已回答并提供链接。谢谢。

最佳答案

对于类似罗盘的功能,我会使用 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);

这个代码 fragment 来 self 写的一个 Helper。如果你不想,你可以用它来提供指南针,这样你就不必实现它了:

CompassAssistant Helper Class

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

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

希望能帮到你。

关于android - 我应该使用哪个 Android 传感器来获取地平线的磁方向和倾斜度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38870051/

相关文章:

java - Android项目中的Gradle错误

android - 选择项目后,PartialTextChanged 停止在 MvxAutoCompleteTextView 上触发

android - 获取传感器 event.values.length()(无需等待 onSensorChanged())

android - 在 AlertDialog 上显示 NumberPicker

android - 将按钮从相对布局更改为线性布局奇怪的副作用

java - OpenCV Android : how to find all max locations of a Mat

Android 传感器读数不返回所有传感器

java - 收集特定时间段的android传感器并计算平均值

Android Sensor 同时记录值

android - 传感器更新率的动态变化