我可以使用Javascript获取iOS和Android的指南针方向吗?

我可以使用Javascript获取iOS和Android的指南针方向吗?,javascript,android,ios,html,Javascript,Android,Ios,Html,我可以在iOS和Android(使用Chrome)中以跨平台的方式使用Javascript来获取指南针方向,而不使用PhoneGap之类的东西吗?我知道iOS有,但我在Chrome上找不到与Android相同的版本 我相信您可以从navigator.geolocation使用位置对象的“heading”字段,请参见此处: 我不知道还有别的办法 希望有帮助, A.作为入门,您应该复习并熟悉web应用程序中的一般知识 我在中提供的简单解决方案仅适用于实现绝对deviceorientation事件的

我可以在iOS和Android(使用Chrome)中以跨平台的方式使用Javascript来获取指南针方向,而不使用PhoneGap之类的东西吗?我知道iOS有,但我在Chrome上找不到与Android相同的版本

我相信您可以从navigator.geolocation使用位置对象的“heading”字段,请参见此处:

我不知道还有别的办法

希望有帮助,
A.

作为入门,您应该复习并熟悉web应用程序中的一般知识

我在中提供的简单解决方案仅适用于实现
绝对
deviceorientation事件的浏览器(即deviceorientation
alpha
属性面向指南针的浏览器)。这意味着提供的解决方案目前仅适用于Android浏览器,而不适用于基于iOS的浏览器或任何其他不提供基于
绝对
的deviceorientation事件数据的浏览器

为了在Android和iOS浏览器上可靠地获取当前的指南针方向,您需要处理提供附加
webkitCompassHeading
属性的
absolute
和非
absolute
实现,并确保将任何当前屏幕方向的更改作为其中的一部分。AFAIK目前唯一一个这样做的库是(免责声明:我是这个库的作者)

考虑到设备定向实现的差异,并应用任何必要的运行时屏幕定向转换,以下代码将在iOS和Android浏览器中为您提供相同的正确指南针方向:


//获得全新的“面向世界”全方位JS DeviceOrientation承诺
var promise=FULLTILT.getDeviceOrientation({'type':'world'});
//等待承诺的结果
然后(函数(deviceOrientation){//支持设备定向事件
//注册一个回调,以便在每次出现新的
//deviceorientation事件由浏览器触发。
deviceOrientation.listen(函数(){
//获取当前*屏幕调整*设备方向角度
var currentOrientation=deviceOrientation.GetScreenAdjustEduler();
//计算用户正在“查看”的当前罗盘航向(以度为单位)
var compassHeading=360-currentOrientation.alpha;
//在这里用“指南针”做点什么。。。
});
}).catch(函数(errorMessage){//不支持设备定向事件
控制台日志(错误消息);
//在这里实现一些回退控制。。。
});
下面是一个示例,演示如何使用此技术获取用户面对的指南针航向。它应该可以在iOS和Android浏览器上正常工作


该演示中代码的实现如上图所示,可以在Github上查看。

是的,您可以!不幸的是,
alpha
在iPhone/iPad上不起作用。对于Mobile Safari,
alpha
基于首次请求设备定向时设备所指向的方向。随附的webkit为您提供指南针航向。要使其适用于所有其他浏览器(所有浏览器都支持
alpha
as
compassheading
),您可以使用以下Javascript代码:

if (window.DeviceOrientationEvent) {
  // Listen for the deviceorientation event and handle the raw data
  window.addEventListener('deviceorientation', function(eventData) {
    var compassdir;

    if(event.webkitCompassHeading) {
      // Apple works only with this, alpha doesn't work
      compassdir = event.webkitCompassHeading;  
    }
    else compassdir = event.alpha;
  });
}
Android也支持Webkit,所以也会使用event.webkitCompassHeading,但这没关系


顺便说一句:“
oncompassneedscalibration
”也不支持iPhone和iPad。

-1。地理定位不提供罗盘数据。这不是真正的答案。航向属性表示旅行方向,而不是指南针;而且不适合在室内使用。有一个。我不知道它的浏览器支持,但您可以尝试在全局范围内访问
getCurrentOrientation
,看看它是否存在。您可能还希望使用
webkit
前缀进行尝试。祝你好运
event.alpha
不足以获得罗盘航向,
alpha
只是设备在其自身轴上的z旋转(请参阅)。不过,可以将阿尔法、贝塔和伽马转换成罗盘航向;请参阅下面@richt的答案。@davidjb:如果没有任何解释,您的答案可能会让读者感到困惑,richt示例也与alpha通道有关。下面是一个可视示例,显示alpha通道与支架视图中的水平方向相关:您可能想说的是:如果仅将alpha通道用于指南针航向,您必须将手机水平地保持在纵向模式,以便正确使用。否则手机可能会失去方向感,显示不正确的方向。你好,Richt,我已经测试了你的库,工作得很好,但我认为它没有给我真正的北方,对吗?这些例子都没有给出android上的北方。这完全是一个笑话。@richt在获得设备方向后,我将如何使用它来获得指南针方向(指向地理点B的方向)?我可以从2个地理点(A点和B点)成功计算方位(度)。此库具有非商业许可证。Chrome上的一个问题自2月起等待PR集成(可能解释以前的一些评论):发布PR:-/