目前,我面临同样的问题。在 Chrome 桌面 deviceorientation 事件似乎正在工作,但在 Chrome Android 上却没有。此外,在 FireFox 中,反之亦然。
我不知道为什么。但我可以建议一个非常基本的方法来尝试,另一种方法是让它在 Chrome 上运行,也可以在 FireFox 上运行,包括桌面和 Android。
第一个只是卸载您的 Chrome 浏览器,或者只卸载它的更新,然后重新安装它。它已经修复了我手机上的deviceorientation 问题。
另一种如下:
您可以使用OrientationSensors 之一,即Sensor APIs 中的AbsoluteOrientationSensor 和RelativeOrientationSensor 来使事情在Chrome Android 上运行,并且仍然保留deviceorientation 方式作为其工作位置的后备,即。 Chrome 桌面和 FireFox Android。如我所见,传感器 API 仅在 Chrome 中可用。这些Sensor APIs 需要在安全上下文中,例如 https 页面等 (https://www.w3.org/TR/secure-contexts/)。我想添加更多关于网络中设备方向测量的绝对性的信息:正如这两个传感器 api 的名称所暗示的那样,一个用于绝对方向,即。相对于地球的真北,另一个是相对的。如果您从浏览器获取absolute 属性true,您也可以通过deviceorientation 事件实现绝对性。如果您的设备理论上没有磁力计,它将是false。此外,移动 Safari 并不关心最后一个属性。哎呀!它还有另一个属性webkitCompassHeading,您可以在Apple Developer 和MDN 中看到它,但在规范本身中没有。同样,在 deviceorientation 事件规范中提到了 Apple Developer 或 MDN compassneedscalibration Event 和 deviceorientationabsolute Event 中未提及的两种不同的事情。但我在浏览器的deviceorientation 事件中看不到它们中的任何一个。好像没有身体在乎。
作为个人的补充说明,我认为这不应该那么复杂。只需给我们absolute 道具值true 或false 然后alpha 始终与从真北或磁北的指南针角度相关,无论如何。 Sensor APIs 即将解决这些问题,但尚未实现太多。
结合 Permissions API,你必须使用如下(来自 MDN 示例):
const sensor = new AbsoluteOrientationSensor();
Promise.all([navigator.permissions.query({ name: "accelerometer" }),
navigator.permissions.query({ name: "magnetometer" }),
navigator.permissions.query({ name: "gyroscope" })])
.then(results => {
if (results.every(result => result.state === "granted")) {
sensor.start();
...
} else {
console.log("No permissions to use AbsoluteOrientationSensor.");
}
});
此 API 为您提供了一个四元数,它对于方向和旋转非常有用,如果您特别使用 three.js 或 babylonjs 或类似的东西,它非常方便。使用传感器的 onreading 事件处理程序或 reading 事件来获取四元数并使用它来更新您的 场景相机 或 3d 引擎的 渲染循环 中的其他对象的方向选择。
您可以从开发人员工具检查器中检查代码的一些示例(页面下方是 AbsoluteOrientationSensor 示例):
https://sensorbox.glitch.me
上面的其中一个 cmets 建议您必须使用 https 以使 deviceorientation 事件起作用。正如我从这里理解的那样,规范确实如此:https://w3c.github.io/deviceorientation/#security-and-privacy,但据我尝试,它适用于 http 页面。在你的情况下,和我的一样,它不会在 https 页面中工作。
希望它有所帮助,在当前使用传感器进行 Web 开发的最新技术中,这里有点混乱。