如何在安卓设备上通过Javascript访问加速度计?

18

有没有办法在安卓浏览器上使用Javascript访问加速度计数据?我知道它支持“onorientationchange”,但我想获取全部数据。

澄清一下:我是在问如何在网站中实现,而不是本地应用程序。


我真的希望安卓不允许JavaScript做这一切。这似乎是一个巨大的安全漏洞。 - Falmarri
3
据我所知,Android 尚未实现这一功能。你应该关注的是苹果。=) - Jeff Lamb
1
从ICS(Android 4.0)开始,它现在可用。请参见下面的答案。 - Bamerza
6个回答

17
从ICS(即Android 4.0)开始,您可以通过JavaScript事件监听器使用“devicemotion”事件来访问加速度计数据。请参阅W3C文档以了解如何访问此事件-http://dev.w3.org/geo/api/spec-source-orientation.html
注意- W3C文档的标题名为“设备方向”,但规范确实包括“devicemotion”事件的文档。

15

更新此帖。

HTML5可以实现这一点。检测加速度计是否存在很容易。

    if (window.DeviceMotionEvent == undefined) {
        //No accelerometer is present. Use buttons. 
        alert("no accelerometer");
    }
    else {
        alert("accelerometer found");
        window.addEventListener("devicemotion", accelerometerUpdate, true);
    }
在您定义用于接收加速度计事件的函数中,您可以查看accelerationIncludingGravity成员。
function accelerometerUpdate(e) {
   var aX = event.accelerationIncludingGravity.x*1;
   var aY = event.accelerationIncludingGravity.y*1;
   var aZ = event.accelerationIncludingGravity.z*1;
   //The following two lines are just to calculate a
   // tilt. Not really needed. 
   xPosition = Math.atan2(aY, aZ);
   yPosition = Math.atan2(aX, aZ);
}

更多信息可以在这里找到:http://dev.w3.org/geo/api/spec-source-orientation.html


1
我刚在运行Windows 10的台式电脑上的Chrome中尝试了一下,Chrome似乎报告了window.DeviceMotionEvent,即存在加速度计。但我非常确定实际上并没有,至少当我拿起我的电脑主机并摇晃它时没有任何反应。 - Maximillian Laumeister
我不确定桌面版 Chrome 的实现是什么。桌面计算机可以拥有加速度计(我曾经通过 USB 连接一个进行测试)。此外,便携式电脑通常运行相同版本的 Chrome 和 Windows。 - Joel
@MaximillianLaumeister - 这是一个被低估的评论。干得好。 - Barrie Reader

5
你可以尝试使用PhoneGap,它提供了通过javascript访问加速度计的API。

这里是相关文档。


Galaxy S 的加速度计和设备不适用于 PhoneGap..:( - Muhammad Umer

4

1
如果我正确阅读文档的话,您可以在Java/Android中设置一个类来提供所需的加速度计功能,并通过公共函数进行调用。
然后,使用addJavascriptInterface调用为webview设置javascript接口,从而使该类中的公共函数能够被javascript调用。

那需要定制重建Android吗? - Jeff Lamb
您不需要进行“Android的定制重建”。您只需使用WebView的一个功能即可:http://developer.android.com/reference/android/webkit/WebView.html - Eric Levine
是的。您是否尝试通过网站而不是本地应用程序中的WebView来完成此操作?如果是这样,您可能需要在原始问题中澄清。 - Eric Levine

0
看了这篇文章在Web浏览器中使用Android上的flash.sensors.Accelerometer,似乎加速度计数据可用于Flash。因此,一个可能的解决方法(至少适用于具有Flash的设备)是创建一个小型Flash应用程序来获取数据。
听起来像是一个hack,但仍然比完全使用Flash做整个事情要好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接