天道酬勤,学无止境

Android SensorManager 和 Google Fit 原始传感器数据之间的区别?(Difference between Android SensorManager and Google Fit raw sensor data?)

问题

对于我的应用程序,我需要阅读用户的最新心率以发送每条消息。

一个是 Android SensorManager,另一个是 Google Fit 的 Sensors。 还有三星的健康应用程序(不要认为这个应用程序会给我我需要的数据,因为我不需要过去的数据,除非我只是查询最新的心率)。

这些获取用户心率的方法有什么区别? 就我的目的而言,一个比另一个更好吗? 还是它们都一样?

https://developer.android.com/reference/android/hardware/Sensor.html#STRING_TYPE_HEART_RATE

https://developers.google.com/fit/android/sensors

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Android Wear:如何获取原始 PPG 数据?(Android Wear: How to get raw PPG data?)
    问题 我可以使用SensorEventListener使用光学心率传感器访问用户的心率: sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE), SensorManager.SENSOR_DELAY_NORMAL); 我需要的是获取原始 PPG 数据,例如:https://ars.els-cdn.com/content/image/1-s2.0-S0960077915001344-gr1.jpg 我可以通过 Google Fit 或任何其他方式获取这些数据吗? 我查看了 Google Fit API 的使用情况:https://developers.google.com/fit/android/sensors 它提供TYPE_HEART_RATE_BPM和HEART_RATE_SUMMARY ,但不提供 PPG 原始数据。 回答1 我花了一些时间弄清楚从 android API 获取原始 PPG 信号是否可行,与某些人可能说的相反,绝对有可能做到这一点。 这是如何做到的: 1- 获取 PPG 传感器的传感器类型(由数字表示)(它是描述传感器的常量)。 这可以通过列出您设备上的所有可用传感器来完成: List<Sensor> sensorList =
  • 在后台服务中使用 TYPE_STEP_COUNTER?(Using TYPE_STEP_COUNTER in a background service?)
    问题 我正在考虑实现 Android 4.4 (http://youtu.be/yv9jskPvLUc) 中引入的步进传感器 API。 但是,我无法找到有关在后台监控此建议的方法的明确解释? 似乎大多数示例只展示了如何在应用程序运行时对 Activity 执行此操作。 我并不特别需要高频率的更新 - 我基本上想记录用户每小时步行到后端服务的步数。 我应该启动一个在 SensorManager 上调用 registerListener 的后台服务,还是有更优雅的方法? 回答1 据我所知, SensorManager没有办法解决,但如果您很少需要数据,您可以手动触发传感器并使用TriggerEventListener获取其值,这比SensorEventListener更SensorEventListener 。 AlarmManager通常是启动每小时计时器的最佳选择,即使您的应用程序未运行,它也能工作。 AlarmManager将Intent发送到扩展BroadcastReceiver的类,该类将启动您的Service 。 根据您的实现,可以在您的应用程序中的任何位置设置AlarmManager 。 计步服务 SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); Sensor
  • 如何访问 Galaxy S5 心率传感器?(How to access Galaxy S5 heart rate sensor?)
    问题 在三星的编程指南(第 77 - 81 页)中,有关于如何使用 S Health Service SDK 设置和获取心率信息的参考。 但是,我希望直接访问 Galaxy S5 的心率传感器,就像访问加速度计、陀螺仪、光传感器和其他传感器一样。 我找到了这个三星装备的例子,但我找不到任何 Galaxy S5 的例子。 是否可以直接访问 Galaxy S5 的心率传感器? 有没有人有关于如何做到这一点的代码示例? 谢谢你。 回答1 您无法从三星 Galaxy S5 获取原始心率监测器数据。 从 Google Android 不支持的传感器获取原始数据需要传感器扩展 SDK,此页面指出: Sensor Extension SDK 有以下限制: HRM 传感器 IR/RED 信号需要 Android 5.0(Lollipop API 级别 21)或更高版本的设备。 Galaxy S5和 Galaxy S5mini除外。 仅支持带有 HRM 传感器的三星设备。 回答2 使用SensorManager.getDefaultSensor(65562)直接访问 HRM 传感器。 回答3 要访问和启用红外线: 在清单中使用使用权限 android:name="android.permission.BODY_SENSORS"/> 在 Activity 中实现 SensorEventListener
  • 如何获得与人类方位匹配的Android手机方位?(How to get Android phone orientation matching human orientation?)
    问题 我正在制作一个地图应用程序,其中包括位置箭头,该箭头向您显示所面对的方向,如下所示: 我使用第一个返回值:方位角直接从SensorManager.getOrientation()获取方向。 握住手机,使屏幕指向水平上方并纵向放置时,箭头可以正常工作。 然而: 握住手机使屏幕指向地平线以下时,箭头指向与用户面对的方向相距180度的位置。 握住手机,使屏幕的朝向与水平线齐平时,箭头不知道其指向的方向。 方位角根本不会返回有意义的结果。 当手机向左或向右倾斜(或在横向模式下)时,箭头向左或向右倾斜。 下面精心构造的科学图像显示了我的意思(蓝色是用户的脸,红色是箭头方向,屏幕大约是用户的脸,而Google Maps正是我想要的): (请注意,在使用Google Maps的情况下,如果关闭了自动旋转功能,它不会成功执行列表中的最后两项操作。但是我什至还没有在那个阶段。一次只能做一件事。) 看起来好像只是在使用Y轴指向方向,如下所示:http://developer.android.com/reference/android/hardware/SensorEvent.html,当我希望它使用与Z轴指向相反的方向时,大多数情况下,手机平放时为Y。 但是,考虑到getOrientation()返回的值,我不得不编写复杂的案例来解决某些问题,并且面向电话的用例是无法解决的。 我敢肯定
  • android地图自动旋转(android maps auto-rotate)
    问题 如果您打开Goog​​le地图应用,则屏幕右上角会出现一个按钮,您可以按此按钮将地图放在当前位置的中心。 该按钮的图标随即更改。 如果再次按同一按钮,则地图会根据您的指南针方向自动旋转。 换句话说,地图变得以自我为中心(相对于始终向北的同素中心AKA而言)。 Google最近发布了适用于Android的maps API V2,我当然比旧版本更喜欢它。 默认情况下,Android Maps V2将包含“位置中心”按钮。 但是,多次按下并不能启用自动旋转功能。 它只是尝试将地图再次以您的位置为中心。 有谁知道我可以像谷歌地图应用一样使用maps API v2自动旋转地图? 我必须自己实现此功能还是在API中实现,而我只是看不到它? 我感谢所有帮助。 回答1 好的,这就是我认为应该在一年后完成的方式。 如果发现任何问题,请纠正我。 以下大多数代码处理坐标系之间的差异。 我正在使用旋转矢量传感器。 从文档开始: Y is tangential to the ground at the device's current location and points towards magnetic north. 另一方面,谷歌地图中的轴承似乎指向了真正的北方。 此页面显示了转换如何完成 1)从您当前的GPS位置获取当前的磁偏角 @Override public void
  • 使用Android陀螺仪代替加速度计。 我发现了很多点点滴滴,但没有完整的代码(Using Android gyroscope instead of accelerometer. I find lots of bits and pieces, but no complete code)
    问题 Sensor Fusion视频看起来不错,但是没有代码:http://www.youtube.com/watch?v=C7JQ7Rpwn2k&feature=player_detailpage#t=1315s 这是我的代码,仅使用加速度计和指南针。 我还在3个方向值上使用了Kalman滤波器,但这在此处无法显示太多代码。 最终,这可以正常工作,但结果取决于我对结果的处理方式和过滤因子的低劣程度,从而导致抖动或抖动太大。 /** Just accelerometer and magnetic sensors */ public abstract class SensorsListener2 implements SensorEventListener { /** The lower this is, the greater the preference which is given to previous values. (slows change) */ private static final float accelFilteringFactor = 0.1f; private static final float magFilteringFactor = 0.01f; public abstract boolean getIsLandscape(); @Override
  • 如何从Google Fit REST API这样的Google Fit REST API获取步骤计数?(How to get step count from Google Fit REST API like Google Fit app?)
    问题 我正在开发一个与Google Fit API配合使用的PHP应用程序,以收集每日用户的步数。 我想获得从“ 2015年1月15日00:00:00 GMT + 0700”到“ 2015年1月16日00:00:00 GMT + 0700”的步数。 -首先,我得到了所有数据源。 -然后,对于数据类型等于“ com.google.step_count.delta”的每个数据源,我将获得上述时间戳之间的数据集,并将返回值加在一起。 我的代码:https://gist.github.com/daitr-gu/472c4f18522172542cca 我的结果是:https://gist.github.com/daitr-gu/1a7e11eb483a657bdc8b 我发现,有许多数据源,它们返回不同的值。 而且这些值与我在手机上的Google Fit应用程序中看到的值太不同了。 问题: 1. Google Fit应用程序使用哪个数据源来计算步数? 2.为什么数据源的价值和Google Fit的价值有所不同? 3.如何获得Google Fit的价值? 回答1 我认为您所看到的区别是Google如何使用History API和Sensors API之间的区别。 如果您使用的是PHP,则通过可用的健身API查询Google Fit商店,这取决于应用程序通过录音API进行保存的能力。 因此
  • 如何在Android中使用加速度计计算精确的脚步数?(how to calculate exact foot step count using accelerometer in android?)
    问题 我正在使用该算法开发一些应用程序,例如Runtastic计步器,但结果之间没有任何相似之处。 我的代码如下: public void onSensorChanged(SensorEvent event) { Sensor sensor = event.sensor; synchronized (this) { if (sensor.getType() == Sensor.TYPE_ORIENTATION) {} else { int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0; if (j == 1) { float vSum = 0; for (int i=0 ; i<3 ; i++) { final float v = mYOffset + event.values[i] * mScale[j]; vSum += v; } int k = 0; float v = vSum / 3; //Log.e("data", "data"+v); float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0)); if (direction == - mLastDirections[k]) { // Direction
  • 委托模式的目的是什么?(What is the purpose of a delegation pattern?)
    问题 我在 Android 中查看 SensorManager 的源代码,发现当您注册SensorEventListener , SensorManager会将侦听ListenerDelegate控制权传递给ListenerDelegate 。 我只举这个例子。 我阅读了维基百科关于委托编程的文章,但我仍然不确定它的目的。 为什么要使用“委托”? 它如何帮助程序的控制流? 使用(或不使用)一个的缺点是什么? 与听众一起使用是否最实用? 编辑: ListenerDelegate在第 487 行,有问题的方法在第 1054 行左右。 回答1 委派并不是 GoF 书中使用的那种意义上的“设计模式”。 它在许多场景中都很有用,并且是其他模式的基础 当您想在委托之前/之后执行一些额外的操作时(这是装饰器模式,但它基于委托)。 例如, Collections.synchronizedList(..)创建一个新的集合,该集合委托给原始集合,但其方法是同步的。 当您有不兼容的接口并且您希望使一个接口适应另一个时(适配器模式)。 您获取原始对象并从符合所需接口的方法委托给它。 例如,有EnumerationIterator类,它使EnumerationIterator适应Iterator接口。 该类有一个hasNext()方法,该方法委托给enumeration.hasMoreElements()
  • 平板电脑或手机-Android(Tablet or Phone - Android)
    问题 有没有一种方法可以检查用户使用的是平板电脑还是电话? 我的倾斜功能和新平板电脑(变形金刚)出现问题 回答1 如前所述,您不想检查该设备是平板电脑还是电话,但想了解该设备的功能, 在大多数情况下,平板电脑和手机之间的区别在于屏幕尺寸,这就是为什么要使用不同的布局文件的原因。 这些文件存储在res/layout-<qualifiers>目录中。 您可以在directoy res/values-<same qualifiers>为每个布局创建一个XML文件,然后将int / bool / string资源放入其中,以区分所使用的布局。 例子: 文件res/values/screen.xml (假设res/layout/包含手机的布局文件) <?xml version="1.0" encoding="utf-8"?> <resources> <string name="screen_type">phone</string> </resources> 文件res/values-sw600dp/screen.xml (假设res/layout-sw600dp/包含Nexus 7等小型平板电脑的布局文件) <?xml version="1.0" encoding="utf-8"?> <resources> <string name="screen_type">7-inch-tablet<
  • 访问 Microsoft Band 上的环境光传感器(Accessing Ambient Light Sensor on Microsoft Band)
    问题 有一个带有 Microsoft Band 的环境光传感器,Windows Store 中的一些应用程序以 Lux 显示 ALS 值,但我在 Band SDK 中找不到读取 ALS Lux 值的方法。 如何访问 ALS? 回答1 如前所述,该传感器没有被公共 SDK 公开——但显然可以通过使用原始蓝牙接口来获取信息(和一堆其他东西)——公共 API 是一种围绕原始蓝牙协议的包装器. 因此,如果您不害怕逆向工程和摆弄原始字节,您也许能够弄清楚如何解码传感器数据。 您可以使用 Windows.Devices.Bluetooth.Rfcomm 库 - 微软有一个代码示例,展示了如何设置基本的蓝牙 rfccomm 通信:https://code.msdn.microsoft.com/windowsapps/Bluetooth-Rfcomm-Chat-afcee559 回答2 如果您使用的是 Win 或 iOS,您可以使用 RFCOMM。 但是,您必须自己编写所有内容。 订阅传感器数据很容易,解析响应也很容易。 但是,如果您需要与设备进行交互,那就会变得很复杂——与图块通信等等。 如果您使用的是 Android,您将获得 MS Health 应用程序的支持,但由于它没有公开此功能,因此您无法使用它。 仅当您禁用(卸载?)MS Health 应用程序并再次自己编写所有内容时。 回答3
  • Android getOrientation()方法返回不良结果(Android getOrientation() method returns bad results)
    问题 我正在创建3D指南针应用程序。 我正在使用getOrientation方法来获取方向(与此处几乎相同的实现)。 如果我将手机放在桌子上,则效果很好,但是当手机顶部指向天空时(图片中的Z轴减去;球体是地球),getOrientation开始显示效果很差。 它以0到180度之间的几度给出Z轴的值。 有什么办法可以抑制这种行为? 我制作了一段视频,描述了问题(对不起,质量很差)。 提前致谢。 解决方案:旋转模型时,它们之间存在差异: gl.glRotatef(_angleY, 0f, 1f, 0f); //ROLL gl.glRotatef(_angleX, 1f, 0f, 0f); //ELEVATION gl.glRotatef(_angleZ, 0f, 0f, 1f); //AZIMUTH gl.glRotatef(_angleX, 1f, 0f, 0f); //ELEVATION gl.glRotatef(_angleY, 0f, 1f, 0f); //ROLL gl.glRotatef(_angleZ, 0f, 0f, 1f); //AZIMUTH 回答1 好吧,我可以看到您的这种方法至少有一个问题。 我假设您将与磁力计相对应的3D矢量与平均低通滤波器结合起来以使数据平滑。 尽管这种方法对于无间断变化的传感器值(例如来自加速度计的原始数据)非常有用
  • 是否可以通过android从智能手表获取PPG(Photoplethysmogram)数据?(Is it possible to get PPG(Photoplethysmogram) data from a smart watch via android?)
    问题 我想使用具有光学心率传感器的 Android 智能手表设备开发一个医疗保健应用程序。 此类设备的示例包括:Samsung gear live、Moto360、LG G watch R 等。 为此,我需要来自这些设备的原始 PPG 信号数据,但我发现 Android API 仅支持 BPM 单位的心率数据。 有谁知道原始信号数据是否可以访问,如果可以,我如何访问该数据? 回答1 是的,这是可能的(至少在三星移动设备上,如 S5、S6 等)。 请参阅此链接:http://developer.samsung.com/galaxy#sensor-extension 从三星网站: HRM 传感器位于电话的后面板上。 如果您放置手指,则测量开始。 光电容积图 (PPG) 信号是指从手指血管反射回来的红外线/红光的数量。 使用三星的 SDK,它会给你原始值(如果我没记错的话,值范围从 0 到 ~64600)。 回答2 是的,有可能做到这一点。 我在这里回答了一个类似的问题:Android Wear: How to get raw PPG data? 基本上,请尝试按照以下步骤操作: 1- 获取 PPG 传感器的传感器类型(由数字表示)(它是描述传感器的常量)。 这可以通过列出您设备上的所有可用传感器来完成: List<Sensor> sensorList = mSensorManager
  • Google Cardboard VR 传感器(Google Cardboard VR sensors)
    问题 我正在使用Google Cardboard (它的HeadTracker类)来检测 AR 应用程序中有关设备旋转的某些事情。 它运作良好。 但是,在某些设备上,它不起作用(没有任何反应)。 我认为这是因为他们没有必要的传感器。 我的问题: 1) 我想在运行时检测当前设备是否支持 HeadTracker,即它有必要的传感器可用。 为此,我需要知道 HeadTracker 使用了哪些传感器,以便我可以查询这些传感器是否存在。 这些传感器是什么? 2) 有没有办法在 AndroidManifest 中指定必要的传感器? 据我所知,没有办法。 因此,如果用户下载我的应用程序,该应用程序必须在运行时通知用户他的设备不受支持。 这不好。 有什么想法吗? 回答1 Google cardboard 的网站有一个设备兼容性列表:似乎有些不完整,所以我尝试查看 Cardboard.jar 的源代码。 HeadTracker.java 似乎有以下逻辑: SensorManager sensorManager = (SensorManager)HeadTracker.this.mContext.getSystemService("sensor"); for (int sensorType : HeadTracker.INPUT_SENSORS) { Sensor sensor =
  • Android方向感应器的奇怪行为(Strange behavior with android orientation sensor)
    问题 目前,我正在尝试使用getRotation()方法使用方向传感器值旋转3D多维数据集。 当android设备旋转到某个界限以上时,会观察到一些意外行为。 例如,如果我将设备“站起来”,那么“ roll”的值就会变得疯狂。 我也正在经历类似于所谓的万向节锁的现象。 唯一的区别是,即使在将传感器值应用于3D旋转之前,我也遇到了非常大的问题。 当我尝试通过仅绕“音高”轴旋转设备来更改“音高”值时,“偏航”值也会根据音高的旋转而变化。 对我来说似乎完全不合理。 有人可以帮我吗? 我在这个问题上停留了一个月。 回答1 这是偏航,俯仰和滚转的常见问题。 只要使用偏航,俯仰和横滚(欧拉角),就无法摆脱它。 该视频说明了原因。 在我的运动传感应用程序中,我使用旋转矩阵而不是欧拉角。 有关旋转矩阵的介绍,我建议: 方向余弦矩阵IMU:理论 旋转矩阵的工作原理就像是一种魅力。 四元数也很受欢迎,据说是最稳定的。 [此答案是从这里复制的。] 回答2 使用四元数来计算YPR并不能解决任何问题。 云台锁定问题(在+/- 90的螺距附近可以驱动偏航和摇摆-实际上是北极的偏航-在基础四元数的轻微变化/噪声下变得疯狂)。 但是,如果使用偏航俯仰和横滚值执行3D对象的旋转,则在万向节锁定位置附近不应表现出任何奇怪的行为。 仅仅是偏航出现了歧义,并且偏航的大变化并不意味着实际方向变得疯狂
  • 无法从Moto 360读取心率传感器-Android Wear(Having trouble reading heart rate sensor from Moto 360 - Android Wear)
    问题 有人成功从Moto 360读取了心率传感器吗? mSensorManager = ((SensorManager)getSystemService(SENSOR_SERVICE)); mHeartRateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); 我收到一条错误消息,指出“ SensorManager:传感器或侦听器为空” 我知道Gear Live使用与Sensor.TYPE_HEART_RATE不同的ID。我想知道Moto 360是否是这种情况。 我尝试了一个传感器值65538,该传感器值将其报告为“健康传感器”,但似乎也未返回数据。 任何意见,将不胜感激。 回答1 我在Moto 360上也做同样的事情,我得到了传感器和心律。 您是否已获得对身体数据的许可: Uses-permission android:name =“ android.permission.BODY_SENSORS” 在您的Manifest.xml中? 回答2 尝试从Moto 360轮询心率时遇到相同的问题,传感器为空。 与您所做的相同,以得出可用的传感器是健康传感器: sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); Sensor
  • 可以补偿倾斜和俯仰的Android指南针(Android Compass that can Compensate for Tilt and Pitch)
    问题 我正在尝试在Android手机(Nexus 4)上制作一个应用程序,该应用程序将在模型船中使用。 我添加了低通滤波器,以滤除传感器的抖动。 但是,指南针仅在手机平放时才稳定。 如果我将其向上倾斜(例如翻开嘘声的一页),则指南针的方向会偏离-多达50 *。 我已经使用Sensor.TYPE_MAGNETIC_FIELD和Sensor.TYPE_GRAVITY和Sensor.TYPE_ACCELEROMETER进行了尝试,效果是相同的。 我已经使用了这里提到的解决方案以及许多其他地方。 我的数学不是很好,但这肯定是一个普遍的问题,令我沮丧的是,没有API可以处理它。 我已经研究了3天,但仍未找到任何解决方案,但是当我使用Catch的Compass时,无论手机倾斜了多少,他们都能保持稳定。 所以我知道这是有可能的。 我要做的就是创建一个指南针,如果电话指向北,则指南针将向北读取,并且当电话沿任何其他轴(滚动或俯仰)移动时,指南针不会跳来跳去。 在我不得不放弃我的项目之前,任何人都可以帮忙。 谢谢亚当 回答1 碰巧的是,我已经考虑了好几个星期了,因为作为数学家,我对在其他地方看到的任何答案都不满意。 和对于我正在开发的应用程序,我需要一个好的答案。 因此,在过去的几天里,我想出了自己的方法来计算在指南针中使用的方位角值。 我已经将要在此处使用的数学函数放在math
  • 如何以固定速率记录来自 Android 运动传感器的数据(How to log data from Android Motion Sensors at a fixed rate)
    问题 我正在学习 Android 编程的基础知识。 我有一个简单的 android 测试应用程序,我将加速度计、磁力计和方向数据记录到一个外部文件中,同时还显示它。 我通过调用initLogger方法在单击“开始”按钮(相关传感器的 registerListener)时启动日志记录过程。 看起来与此类似... public void initLogger(View view) { boolean bFlag = false; Button btnStart = (Button)findViewById(R.id.btnStartLog); Button btnStop = (Button)findViewById(R.id.btnStopLog); btnStart.setEnabled(bFlag); btnStop.setEnabled(!bFlag); bEnableLogging = true; //Start reading the sensor values sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI); sensorManager
  • 加速度计记录器:偶尔遇到帧之间的长时间延迟(Accelerometer logger: experiencing occasional long delays between frames)
    问题 我正在编写一个应用程序,每 40 毫秒(25 赫兹)记录一次手机的加速度。 这个帧速率可以保持平均,但有时我会遇到时间帧之间 5'000 毫秒 - 50'000 毫秒的延迟。 我想知道为什么会发生这种情况。 在这里你有一个延迟图表,你可以看到它们经常发生: 这是我正在做的事情(这可能很糟糕): 该活动指向一个加速度计记录器类(单例、纯 Java、无 android 类扩展)。 加速度计记录器单例继续在后台登录。 加速度计记录器将每个日志直接保存到 sqlite 数据库。 我也在后台记录 GPS 数据。 DAO(数据访问对象)将每个 Log 分配给 LinkedBlockingQueue 并将它们保存在单独的线程中。 以下是我认为可能存在的问题: 也许我必须实现进一步的生命周期方法,或扩展特定的 android 类,以便加速度计记录器获得优先级(或只是在某处设置优先级)。 我可能会使用event.timestamp而不是System.currentTimeMills() 。 (我不想这样做,因为有些传感器有不同的时区,这就是我使用System.currentTimeMillis() ,但如有必要,我会切换。) 您有这方面的经验或建议可能存在的问题吗? 这是我的代码: @SuppressLint("NewApi") public class AccelerometerLogger
  • 倾斜手机时,Android getOrientation方位角会受到污染(Android getOrientation Azimuth gets polluted when phone is tilted)
    问题 我的AR视图像指南针一样遇到了一个非常烦人的问题。 因此,当我以纵向握住手机(以便屏幕指向我的脸)时,然后以纵向握住0时调用remapCoordinateSystem 。 这样,方位角(罗盘功能)就完美了,但是一旦我倾斜手机,方位角就会毁了,如果我向前弯曲,方位角会增加,而如果我向后弯曲,方位角会减小。 我使用2个传感器来获取读数,即Sensor.TYPE_MAGNETIC_FIELD和Sensor.TYPE_GRAVITY 。 我使用了一个非常基本的低通滤波器,它通过一个alpha常量实现,并直接用于传感器的读取值。 这是我的代码: float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues, magnetometerValues); float[] remappedRotationMatrix = new float[9]; SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRotationMatrix); float results[] = new