【发布时间】:2021-08-31 14:23:44
【问题描述】:
我正在尝试读取 Java android 应用中的加速度计和/或地磁传感器,以确定设备在某一时刻的方向。但是传感器本身并不重要,我的问题可以应用于您想读取的任何类型的传感器,无论是运动、温度、光、压力等等。
我到处都可以看到用于设置来自传感器的数据“流”的代码,具有事件侦听器以及对传感器通过回调发送给您的数据进行“反应”的能力。
这不是我所追求的,我认为可能无法做到我想要的。
想要的是读取传感器数据一次。 不是两次,不是连续 3 秒,不是当传感器向我发送事件时。 开启、阅读、关闭。
当我要求阅读时,我只需要阅读。 当我得到那个读数后,我就不需要更多的读数了。
一旦你拥有足够的权限,比如anysensor.getCurrentState(),感觉应该是一个简单的单行操作。
但是从我可以阅读的内容来看,我只找到依赖于 sensorManager 事件侦听器的文档,并且必须设置整个类和 5 个不同的事件回调:
https://developer.android.com/guide/topics/sensors/sensors_position#sensors-pos-orient
我猜我可以做到这一点,并尝试使其尽可能轻,让 eventListeners 在第一次阅读时自动停止。但是对于我需要的东西来说,感觉很潮,而且代码很多。而且我正在尝试做一个非常简单的任务,阅读相关内容,并完成它,这将需要一些异步的东西。 所以我想我必须“暂停”应用程序,直到我得到第一个结果。
这实际上是最简单/唯一的方法吗?
【问题讨论】:
-
该页面上的第一个示例有什么问题?
-
这是一个异步设置,有 5 个事件监听器,两个函数组成两页代码。我的问题是“有没有办法在没有事件监听器的情况下只读取传感器数据一次”像
sensor.getcurrentState()之类的东西(我做了一个)。一行,可能是 5,而不是 100。我不需要任何异步的东西,我不需要来自传感器的连续数据。我以为我写的解释了这一点? -
如果除了必须进行完整设置之外别无他法,我也想知道。但理想情况下,我希望有一种更简单的方法来读取传感器一次。
-
真的吗?您在该页面上看到的第一个示例可能就是您要查找的内容!
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9); SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3); SensorManager.getOrientation(rotationMatrix, orientationAngles); -
@AlbertoSinigaglia 谢谢你,对不起,我以为你在谈论另一段代码。但我认为它不起作用。也许我错了,但在他们的例子中,“...”会丢失一些代码。据我了解,您必须将来自传感器的数据作为参数提供给
SensorManager.getRotationMatrix( (float[] R, float[] I, float[] gravity, float[] geomagnetic)(在他们的示例中为 accelerometerReading 和 magnetometerReading)。但他们没有展示如何获取这些值,除了在 eventListeners 的示例中......
标签: java android android-studio sensors sensormanager