先明确一下空间坐标系的三个方向:
x 方向就是手机的水平方向,右为正;
y 方向就是手机的水平垂直方向,前为正;
z 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负。
方向角的定义是手机y轴 水平面上的投影 与 正北方向的夹角。 (值得范围是 0 ~ 359 其中0=North, 90=East, 180=South, 270=West)
倾斜角的定义是手机y轴 与水平面的夹角 (手机z轴向y轴方向移动为正 ,值得范围是 -180 ~ 180)
旋转角的定义是手机x轴 与水平面的夹角 (手机x轴离开z轴方向为正, 值得范围是 -90 ~ 90)
也就是说,当你把手机水平放置在桌面上(屏幕向上)且手机指向正北(Y轴方向),此时传感器获得的xyz三个值应该都为0。

基于Rexsee对于方向传感器Orientation的扩展,我们可以很快的实现传感器功能,比如读取X/Y/Z方向角度值:rexseeOrientation.getLastKnownX();读取响应速度:rexseeOrientation.getRate();设置传感器检测周期:rexseeOrientation.setCycle(1000)等。具体的函数介绍可以在Rexsee社区的手册与源码中查阅: http://www.rexsee.com/CN/helpReference.php

如下是Rexsee用Java封装的的方向传感器功能详细源码。感兴趣的也可以直接去Rexsee社区查阅: http://www.rexsee.com。
但是首先需要知道,并不是所有的Android手机都支持方向传感器。。比如说乐Phone,好像就是加速度、重力和光线,方向和磁场貌似都不支持。

/*
* Copyright (C) 2011 The Rexsee Open Source Project
*
* Licensed under the Rexsee License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.rexsee.com/CN/legal/license.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package rexsee.sensor;  import rexsee.core.browser.JavascriptInterface;
import rexsee.core.browser.RexseeBrowser;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;  public class RexseeSensorOrientation implements JavascriptInterface {  public static final String INTERFACE_NAME = "Orientation";  @Override  public String getInterfaceName() {  return mBrowser.application.resources.prefix + INTERFACE_NAME;  }  @Override  public JavascriptInterface getInheritInterface(RexseeBrowser childBrowser) {  return this;  }  @Override  public JavascriptInterface getNewInterface(RexseeBrowser childBrowser) {  return new RexseeSensorOrientation(childBrowser);  }  public static final String EVENT_ONORIENTATIONCHANGED = "onOrientationChanged";  private final Context mContext;  private final RexseeBrowser mBrowser;  private final SensorManager mSensorManager;  private SensorEventListener mSensorListener;  private final Sensor mSensor;  private int mRate = SensorManager.SENSOR_DELAY_NORMAL;  private int mCycle = 100; //milliseconds  private int mEventCycle = 100; //milliseconds  private float mAccuracyX = 0;  private float mAccuracyY = 0;  private float mAccuracyZ = 0;  private long lastUpdate = -1;  private long lastEvent = -1;  private float x = -999f;  private float y = -999f;  private float z = -999f;  public RexseeSensorOrientation(RexseeBrowser browser) {  mContext = browser.getContext();  mBrowser = browser;  browser.eventList.add(EVENT_ONORIENTATIONCHANGED);  mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);  mSensorListener = new SensorEventListener() {  @Override  public void onAccuracyChanged(Sensor sensor, int accuracy) {  }  @Override  public void onSensorChanged(SensorEvent event) {  if (event.sensor.getType() != Sensor.TYPE_ORIENTATION) return;  long curTime = System.currentTimeMillis();  if (lastUpdate == -1 || (curTime - lastUpdate) > mCycle) {  lastUpdate = curTime;  float lastX = x;  float lastY = y;  float lastZ = z;  x = event.values[SensorManager.DATA_X];  y = event.values[SensorManager.DATA_Y];  z = event.values[SensorManager.DATA_Z];  if (lastEvent == -1 || (curTime - lastEvent) > mEventCycle) {  if (  (mAccuracyX >= 0 && Math.abs(x - lastX) > mAccuracyX)  || (mAccuracyY >= 0 && Math.abs(y - lastY) > mAccuracyY)  || (mAccuracyZ >= 0 && Math.abs(z - lastZ) > mAccuracyZ)  ) {  lastEvent = curTime;  mBrowser.eventList.run(EVENT_ONORIENTATIONCHANGED);  }  }  }  }  };  }  public String getLastKnownX() {  return (x == -999) ? "null" : String.valueOf(x);  }  public String getLastKnownY() {  return (y == -999) ? "null" : String.valueOf(y);  }  public String getLastKnownZ() {  return (z == -999) ? "null" : String.valueOf(z);  }  public void setRate(String rate) {  mRate = SensorRate.getInt(rate);  }  public String getRate() {  return SensorRate.getString(mRate);  }  public void setCycle(int milliseconds) {  mCycle = milliseconds;  }  public int getCycle() {  return mCycle;  }  public void setEventCycle(int milliseconds) {  mEventCycle = milliseconds;  }  public int getEventCycle() {  return mEventCycle;  }  public void setAccuracy(float x, float y, float z) {  mAccuracyX = x;  mAccuracyY = y;  mAccuracyZ = z;  }  public float getAccuracyX() {  return mAccuracyX;  }  public float getAccuracyY() {  return mAccuracyY;  }  public float getAccuracyZ() {  return mAccuracyZ;  }  public boolean isReady() {  return (mSensor == null) ? false : true;  }  public void start() {  if (isReady()) {  mSensorManager.registerListener(mSensorListener, mSensor, mRate);  } else {  mBrowser.exception(getInterfaceName(), "Orientation sensor is not found.");  }  }  public void stop() {  if (isReady()) {  mSensorManager.unregisterListener(mSensorListener);  }  }  }

仅对Rexsee的源码和函数事件做了整理,相关的demo或源码解析可以在Rexsee社区了解,目前Rexsee已提供了近2000个扩展,覆盖Android原生功能超过90%,且全部开放:   http://www.rexsee.com/

Android传感器之-方向传感器Orientation功能实现与源码相关推荐

  1. Android 传感器之方向传感器

    一般情况下,在android系统中获取手机的方位信息在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TY ...

  2. 集成Android 科大讯飞免费在线语音合成播报功能(附源码)

    概述 开篇先介绍一下'科大讯飞',毕竟是我家乡合肥的科技公司,我感到骄傲,更重要的是它在语音识别行业也是佼佼者,在如今人工智能横飞的时代,依然能够保持着较高水准的技术优势.在此,希望科大在AI之战中能 ...

  3. Android传感器之陀螺仪传感器

    代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  4. Android可滑动画板,Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...

  5. php写字板代码,Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...

  6. Android Manager之SensorManager(传感器)—方向传感器(Orientation sensor)

    本章节讲述方向传感器(Orientation sensor)的相关使用. 如果您还不了解传感器的相关知识,请点击:Android Manager之SensorManager(传感器)-基础知识 1.方 ...

  7. SLAM总结(三)-传感器之各传感器特性

    SLAM总结(三)-传感器之各传感器特性 一.综述 二.相机 1.单目相机 2.深度相机 双目相机 结构光相机 ToF相机 三.激光雷达 1.2D激光雷达 2.3D激光雷达 四.IMU 六.编码器 五 ...

  8. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  9. 【TarsosDSP】TarsosDSP 简介 ( TarsosDSP 功能 | 相关链接 | 源码和相关资源收集 | TarsosDSP 示例应用 | TarsosDSP 源码路径解析 )

    文章目录 I . TarsosDSP 函数库简介 II . TarsosDSP 功能 III . TarsosDSP 相关资源链接 ( 官方资料 ) IV . TarsosDSP 源码和相关资源收集 ...

最新文章

  1. 嵌入式开发都需要会些什么
  2. 小米6关闭位置服务器,关闭这6个设置,让你的小米手机从回青春,再战3年
  3. apache php linux 安全,Centos7环境下的apache和php安全设置及优化 | 彬菌
  4. 字符串html在线互转,将string 的字符串转换为HTML的两种方法
  5. vectorPoint points未声明的标识符
  6. C++11 中值得关注的几大变化
  7. php课程 6-20 字符串基础和去除空格和字符串填补函数
  8. 探索处理数据的新方法,8 个重点带你搞懂云数据库——DBaaS(数据库即服务)到底是什么!...
  9. Scala的抽象语法树打印小工具-小拉达
  10. HDFS内副本和块的状态分析
  11. vue项目白屏问题汇总,多方案详细解决
  12. js获取某节点的特定父节点
  13. 拓端tecdat|R语言估计获胜概率:模拟分析学生多项选择考试通过概率可视化
  14. TOP100summit分享实录 | JFrog高欣:Kubernetes is hard!JFrog的Kubernetes实践
  15. [473]tf.nn.*()函数and tf.add()函数
  16. 服务器硬盘数据备份到nas,谁说固态硬盘做存储是鸡肋?NAS存储服务器还能这样玩...
  17. 《自控力》分享一些减缓压力小妙招
  18. 怎样将几个pdf文件合成一个?
  19. 大数据 端到端_成为数据科学家的端到端指南
  20. iSee图片专家 V3.8.7.3 圣诞贺岁版

热门文章

  1. 架构进化的本质——用一个例子讲清楚
  2. js 触发 select onchange事件
  3. ps -ef 和ps -aux 和ps aux
  4. QQ音乐页面效果模仿制作
  5. 启发式算法求解混合整数线性优化问题—— 生产计划安排和资源分配
  6. 超过4G如何制作NTFS格式WINPE?
  7. python or的用法_详细介绍Python中and和or实际用法
  8. 动态函数监控技术在缓冲区溢出检测中的应用
  9. HTML Input标签输入限制
  10. ArcBlock ⑪ 月报 | 无惧寒冬 ABT 2019 区块链远征启程