转:http://book.51cto.com/art/201411/457105.htm

2014-11-15 19:07 张亚飞/崔巍 中国铁道出版社 字号:T | T
 

《PhoneGap 3.0移动应用开发实战详解》本书对PhoneGap的相关知识进行介绍,共4个部分,31章。主要内容包括:PhoneGap的基本概念和开发环境的建立;原生插件的使用;软件配置、GUI设计以及一些综合性的开发案例;PhoneGap运行原理、自定义插件开发和第三方插件的使用。本节为大家介绍获取设备手持方向——电子罗盘。

AD:

10.5  获取设备手持方向——电子罗盘

很多手机都带有电子罗盘传感器,也被称为电子指南针,就是根据地球的磁场来确定方向。

PhoneGap电子罗盘插件的完全限定名是org.apache.cordova.device-orientation,可以使用下面的命令安装插件。

  1. phonegap plugin add org.apache.cordova.device-orientation

一旦安装了插件,就可以使用该插件公开的API,它们都可以使用windows.navigator对象访问。

通过PhoneGap插件公开的Compass类可以获取罗盘传感器的数据,从而获知手机当前朝向,即设备的手持方向。

navigator.compass可以返回Compass类的一个实例,该类有以下三个方法:

compass.getCurrentHeading():获取当前的朝向。

compass.watchHeading:设置监控,以特定时间间隔获取朝向。

compass.clearWatch:清除监控设置。

语法格式如下:

  1. navigator.compass.getCurrentHeading(compassSuccess, compassError, compassOptions);
  2. var watchID = navigator.compass.watchHeading(compassSuccess, compassError, [compassOptions]);
  3. navigator.compass.clearWatch(watchID);

这三个方法与重力感应器的三个方法使用完全一致,只是成功回调函数会返回一个compassHeading对象,该对象包含了朝向信息。

例如下面的代码,即演示了如何监控电子罗盘的朝向。

代码内容Chapter_10-06

  1. var watchID = null;
  2. // 注册deviceready事件监听,指定deviceready事件处理函数
  3. document.addEventListener("deviceready", onDeviceReady, false);
  4. // deviceready事件处理函数,PhoneGap完成加载后调用该函数
  5. function onDeviceReady() {
  6. startWatch(); // 开始监控
  7. }
  8. // 开始监控
  9. function startWatch() {
  10. // 定义一个选项,传递给Compass.watchHeading()方法,表示每3秒更新一次
  11. var options = { frequency: 3000 };
  12. // 调用Compass.watchHeading()方法来持续获取罗盘数据
  13. watchID = navigator.compass.watchHeading(onSuccess, onError,
  14. options);
  15. }
  16. // 停止监控
  17. function stopWatch() {
  18. if (watchID) {
  19. // 调用clearWatch()方法终止持续监控
  20. navigator.compass.clearWatch(watchID);
  21. watchID = null;                   // 赋值为null清空内存
  22. }
  23. }
  24. // 成功获取当前罗盘数据后的回调函数
  25. function onSuccess(heading) {
  26. var element = document.getElementById('compassHeading');
  27. element.innerHTML = '当前朝向是 ' + heading.magneticHeading;
  28. }
  29. // 不能获取当前罗盘数据后的回调函数
  30. function onError() {
  31. alert('onError!');
  32. }

时间间隔可以使用第三个参数compassOptions来设定。compassOptions是一个对象,该对象包含一个属性frequency,用于以毫秒为单位指定间隔时间。

compassOptions还可以包含一个属性filter,用于指定一个数字,只有变化超过这个数字才会触发回调函数。目前只有iPhone支持该属性。

1.失败回调函数

监控方法的失败回调函数有一个参数error。

  1. function onError(error) {
  2. navigator.notification.alert(error.code, null, 'Error!');
  3. }

Error中有一个名为code的属性,该属性值可以是如下常量之一,以分别表示出错的原因:

CompassError.COMPASS_INTERNAL_ERR常量:表示内部错误。

CompassError.COMPASS_NOT_SUPPORTED常量:表示不支持。

2.compassHeading对象

监控方法的成功回调函数会返回一个compassHeading对象。

  1. function onSuccess(compassHeading) {
  2. }

该对象包含一个特殊时间点捕获的朝向数据,它包含如下几个属性,如表10-2所示。

表10-2  compassHeading对象属性

属    性

功 能 描 述

magneticHeading

当前朝向,朝向是一个0~359.99的数字

trueHeading

相对于北极点的朝向,是一个0~359.99的数字。负值表示不能确定朝向

headingAccuracy

表示当前朝向与trueHeading之间的偏差

timestamp

以毫秒为单位的时间戳(DOM时间戳),表示捕捉到的时间

在Android环境下,其不支持trueHeading,与magneticHeading返回相同的值。headingAccuracy属性将总是返回0,也就是说,magneticHeading和trueHeading之间没有什么差别。

iOS注意事项

在iOS环境下,trueHeading仅在使用watchLocation()方法返回的compassHeading对象中才被支持。对于iOS 在4.0以上版本的设备中,如果设备旋转,并且程序支持竖握或横握,那么compassHeading返回的是相对于当前竖握或横握的朝向值。

ios获取设备手持方向——电子罗盘的更多相关文章

  1. iOS获取设备唯一标识的8种方法

    8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...

  2. iOS获取设备型号、装置类型等信息

    iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...

  3. iOS获取设备型号和App版本号等信息(OC+Swift)

    iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...

  4. iOS 获取设备唯一标示符的方法

    在开发中会遇到应用需要记录设备标示,即使应用卸载后再安装也可重新识别的情况,在这写一种实现方式--读取设备的UUID(Universally Unique Identifier)并通过KeyChain ...

  5. ios获取设备信息总结

    1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name;       //获取设备所有者的名 ...

  6. iOS 获取设备信息,mac地址,IP地址,设备名称

    #import "DeviceInfoUtil.h" #import "GlobleData.h" #import "sys/utsname.h&qu ...

  7. ios 获取设备相关的信息

    .获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...

  8. iOS获取设备IP地址

    项目用到要获取iOS设备的IP地址,有2种方法: 1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行.代码如下: #import <ifa ...

  9. iOS获取设备型号、设备类型等信息

    摘自 :http://www.mamicode.com/info-detail-1165460.html 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然 ...

随机推荐

  1. history统计命令最多的20条

    1.1.1 统计使用命令最多的20条 [root@ob1 ~]# history|awk '{ml[$2]++}END{for (i in ml) print i,ml[i]}'|sort -nrk ...

  2. Jquery判断某字符串中是否包含某个字符

    if(!(to_city_value.indexOf("(")>0){ //code..... }

  3. C++ IO流小结

    撒花庆祝下,终于看完了(C++Primer)第一部分,即将进入第二部分! IO部分,最基本的是iostream(istream.ostream),子类有fstream(ifstream.ofstrea ...

  4. c++ 的vector、array和数组的比较

    ref:  http://blog.csdn.net/haust_wang/article/details/49848169

  5. PHP截断函数mb_substr()

    提示:mb_substr在于php中是默认不被支持的我们需要在在windows目录下找到php.ini打开编辑,搜索mbstring.dll,找到;extension=php_mbstring.dll ...

  6. vc 获取 硬盘序列号 和 cpu

    vc 获取 硬盘序列号 和 cpu 唯一iD的方法?如题---------网上找来很多资料 也没找到, 要支持xp win7 32/64 系统下都能获取 硬盘序列号 和cpu ID 哪位朋友帮帮忙: ...

  7. 如何强制关闭Tomcat

    用Myeclipse打开后启动Tomcat提示信息为:Address already in use: JVM_Bind:80 ,表示该地址和端口已经被占用显示已经打开了.但是关不掉他...所以只能去关 ...

  8. NSArray打印汉字的方法

    (1) NSArray打印汉字 通过重载NSArray的- (NSString *)descriptionWithLocale:(id)locale方法 方法体例如以下: //依据设置的locale ...

  9. CentOS 6.5配置SSH免密码登录

    centos 系统对权限的设置非常微妙,如果权限设置大了则ssh 拒绝,如果权限小了,则ssh 更是被拒绝(我曾经配置好久没有打通,就是因为权限过大的原因) 参考链接:http://www.linux ...

  10. js事件总结

    事件冒泡: 什么是事件冒泡,就是最深dom节点触发事件,然后逐级向最外层触发事件.打个比方一棵dom tree:li<ul<div每级都有事件绑定,然后我们触发li的事件,这时ul上的事件 ...