在 Android 中通过 Javascript 访问加速度计?

Posted

技术标签:

【中文标题】在 Android 中通过 Javascript 访问加速度计?【英文标题】:Access accelerometer via Javascript in Android? 【发布时间】:2011-05-27 08:19:59 【问题描述】:

有没有办法在 android 浏览器上使用 javascript 访问加速度计数据?我知道它支持“onorientationchange”,但我想得到一切。

澄清:我问的是如何在网站而不是本机应用程序中执行此操作。

【问题讨论】:

我真希望android不允许javascript来做这一切。这似乎是一个很大的安全漏洞。 据我所知,这还没有在 Android 中实现。你需要关心的是苹果。 =) 从 ICS (Android 4.0) 开始,它现在可用。请参阅下面的答案。 【参考方案1】:

从 ICS、Android 4.0 开始,您可以通过 JavaScript 事件侦听器使用“devicemotion”事件来访问加速度计数据。请参阅 W3C 文档了解如何访问它 - http://dev.w3.org/geo/api/spec-source-orientation.html

注意 - W3C 文档标题以“设备方向”命名,但规范确实包含“设备运动”事件文档。

【讨论】:

【参考方案2】:

对此线程进行更新。

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

【讨论】:

我刚刚在 Windows 10 的台式计算机上运行的 Chrome 中尝试了这个,Chrome 似乎报告了window.DeviceMotionEvent,即存在加速度计。我很确定它不是,至少当我拿起我的电脑塔并敲了一下它时没有任何反应。 我不确定桌面版 Chrome 实现的作用。台式机可以有加速度计(前段时间我通过 USB 连接了一个用于测试)。此外,便携式 PC 通常运行相同版本的 Chrome 和 Windows。 @MaximillianLaumeister - 这是一条被严重低估的评论。干得好。【参考方案3】:

您可以尝试使用PhoneGap,它提供了从 javascript 访问加速度计的 API。

Here 文档。

【讨论】:

galaxy 的加速度计和设备不适用于 phonegap..:(【参考方案4】:

如果您尝试从托管在服务器上的网页访问加速度计(相对于通过 WebView 集成到本机应用程序的网页),那么加速度计数据目前似乎不可用强> 适用于 Android。您可以在此处找到更详细的评估:http://www.mobilexweb.com/blog/android-froyo-html5-accelerometer-flash-player。

您可能还想查看这篇 SO 帖子:Detect rotation of Android phone in the browser with JavaScript

【讨论】:

【参考方案5】:

如果我正确阅读了文档,您可以设置一个类(在 Java/Android 中),以提供您在公共函数中所需的加速度计功能。

然后使用 addJavascriptInterface 调用为 webview 设置一个 javascript 接口,这使得该类中的公共函数可以从 javascript 中调用。

【讨论】:

那么这需要对 Android 进行自定义重建吗? 您不需要“Android 的自定义重建”。您只需使用 WebView 的一个功能:developer.android.com/reference/android/webkit/WebView.html 是的。您是否尝试通过网站而不是本机应用程序中的 WebView 来执行此操作?如果是这样,您可能想在原始问题中澄清这一点。【参考方案6】:

看这篇帖子flash.sensors.Accelerometer on Android within web browser 似乎加速度计数据可用于闪存。因此,一种可能的解决方法(至少对于具有闪存的设备而言)是一个为您抓取数据的小型闪存小程序。

听起来像个 hack,但仍然比在 flash 中制作整个东西听起来更好

【讨论】:

以上是关于在 Android 中通过 Javascript 访问加速度计?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中通过URL获取文件大小

javascript 在url中通过哈希打开模态

如何在 JavaScript 中通过 XPATH 获取元素?

在 Javascript 中通过引用传递字符串

如何在浏览器中通过 Javascript 压缩图像?

如何在joomla模块中通过javascript发送输入文件类型