通过SensorManager获取手机方位,从而实现指南针功能。

在很多旧的文档介绍中,都是通过SensorManager .getDefaultSensor(Sensor.TYPE_ORIENTATION); 但是,这个方法其实是已经被android抛弃的方法,现在我们来讲一下新的方法。

一 首先我们需要认识到在手机里是没有方位传感器这个实体的硬件,它只是通过一些逻辑运算而计算出来的。而它是通过磁场传感器和加速度传感器计算得来的。

二 实现方法,注册磁场传感器和加速度传感器监听,在监听中获取加速度传感器的Values值和磁场传感器的Values值,根据这俩个值计算方位传感器的value

三 通过SensorManager类的俩个重要方法:getRotationMatrix()和getOrientation()方法获取方位传感器的value。

boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
float[] getOrientation (float[] R, float[] values)

在getRotationMatrix()方法中, float[] R是输出值,I/gravity/geomagnetic是输入值。

通过float[] I为null,float[] gravity在onSensorChanged()中从加速度传感器中获取,float[] geomagenetic在onSensorChanged()中从磁场传感器中获取。

在getOrientation()方法中,float[] R是输入值,float[] values是输出值,该值就是方位传感器的value值。该值介绍请看下文四。

四 方位传感器的value值是个float[3]数组,

其中values[0]表示手机顶部和正北方的夹角,0表示手机顶部朝向正北,90表示手机顶部朝向正东,180表示手机顶部朝向正南,-90表示手机顶部朝向正西。

values[1]表示手机顶部或尾部翘起的角度。水平放置该值是0。

values[2]表示手机左侧或右侧翘起的角度。水平放置该值是0;

其实我们在指南针的实现中,只用到了values[0]的值。

最后我们看一下完整的代码:

public class MainActivity extends Activity {private static final String TAG ="LinkGame: MainActivity";private SensorManager mSensorManager =null;private Sensor mAcceleSensor = null;private Sensor mMagneticSensor = null;private float targetDegree =0.0f;private MyCompassView mImageView;private boolean mStopUpdateCompass;private float[] mMageneticValues = new float[3];private float[] mAcceleValues = new float[3];@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.d(TAG," onCreate() ysj");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initCompass();}public void initCompass(){Log.d(TAG," initCompass()");mImageView = (MyCompassView)findViewById(R.id.compass_image);   mSensorManager = (SensorManager) this.getSystemService(this.SENSOR_SERVICE);mAcceleSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mMagneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();Log.d(TAG," onResume() ysj targetDegree ="+targetDegree);mStopUpdateCompass = false;mSensorManager.registerListener(mOrientationSensorEventListener,mAcceleSensor , SensorManager.SENSOR_DELAY_NORMAL); //注册加速度传感器监听mSensorManager.registerListener(mOrientationSensorEventListener,mMagneticSensor , SensorManager.SENSOR_DELAY_NORMAL);//注册磁场传感器监听new Handler().postDelayed(mRunnable, 100);}private Runnable mRunnable = new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubif(mImageView != null && mStopUpdateCompass == false){  Log.d(TAG," mImageView().updateCompass: targetDegree ="+targetDegree);mImageView.updateCompass(targetDegree);new Handler().postDelayed(mRunnable, 500);}}};@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();Log.d(TAG," onPause() ysj");mStopUpdateCompass = true;mSensorManager.unregisterListener(mOrientationSensorEventListener);}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();Log.d(TAG," onStop() ysj");mStopUpdateCompass = true;mSensorManager.unregisterListener(mOrientationSensorEventListener);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.d(TAG," onDestroy() ysj");}private SensorEventListener mOrientationSensorEventListener = new SensorEventListener(){@Overridepublic void onAccuracyChanged(Sensor arg0, int arg1) {// TODO Auto-generated method stubLog.d(TAG," onAccuracyChanged()");}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubint sensorType = event.sensor.getType();Log.d(TAG," onSensorChanged()  sensorType = "+sensorType);//通过加速度传感器的mAcceleValues和磁场传感器的mMageneticValues,来计算方位传感器的valueif(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){mAcceleValues = event.values;   }if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){mMageneticValues = event.values;   }calculateOrientation();}
};public void calculateOrientation(){float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null, mAcceleValues, mMageneticValues);SensorManager.getOrientation(R, values);values[0] = (float)Math.toDegrees(values[0]);Log.d(TAG," calculateOrientation() values[0]="+values[0] );targetDegree = (-values[0]+360.0f) % 360; }}

SensorManager的方向传感器Orientation -- 指南针的简易实现相关推荐

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

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

  2. Android -- 传感器使用示例, 用方向传感器做指南针

    1. 传感器类型:方向.加速度(重力).光线.磁场.距离(临近性).温度等. 方向传感器:   Sensor.TYPE_ORIENTATION 加速度(重力)传感器: Sensor.TYPE_ACCE ...

  3. Android传感器之-方向传感器Orientation功能实现与源码

    先明确一下空间坐标系的三个方向: x 方向就是手机的水平方向,右为正: y 方向就是手机的水平垂直方向,前为正: z 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负. 方向角的定义是手机y ...

  4. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  5. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  6. android学习笔记---57_采用方向传感器实现指南针,android设备传感器介绍,以及使用方法

    Java技术qq交流群:JavaDream:251572072 ------------------------------------------------------ 传感器类型:方向.加速度( ...

  7. 传感器--方向传感器制作指南针

    我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向 同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向 public class MainAc ...

  8. Android基于方向传感器实现指南针功能

    这里做了一个指南针,主要用到了Android里的加速度传感器和地磁传感器 Github源码 1.数据初始化 private USensor(Context context) {if (sorMgr = ...

  9. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...

  10. Android 电子罗盘 --指南针(方向传感器的应用)

    ,图片神马的在网上搜个指南针图片就好了,本来没有注释,发上来之后感觉不行,还是加上吧,方便学习 main.xml <?xml version="1.0" encoding=& ...

最新文章

  1. python笔记基础-python笔记(二)基础二
  2. 头条二面:你们公司怎么处理 MySQL 的 Binlog 日志?
  3. java char 8192_java.net.ProtocolException:预期229个字节,但收到8192
  4. 修改firefox的默认缩放比
  5. Promise 的四种常用方法。
  6. Linux的操作系统原理详解
  7. Android原生框架--Xui使用
  8. 【Ignite】使用数据库软件DBeaver管理Apache Ignite
  9. knowledge distillation 综述
  10. linux sniffer 程序使用,Linux下Sniffer程序的实现
  11. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 二
  12. Unity-安卓端透明背景设置
  13. vue 背景透明度_vue添加星空背景特效
  14. assoc fetch mysql 用法_php mysql_fetch_assoc 循环遍历表格
  15. 比 996 更可怕的是职场 PUA
  16. c/c++静态库和动态库制作
  17. 如何在虚拟机安装的Win10系统里快速打开【此电脑】图标?(图文详解)
  18. Codeforces Round#768(Div.2)A-F
  19. 基于javaspringboot+vue的汽车租赁管理系统含文档
  20. 我的showkey 刷挂了。

热门文章

  1. 微信小程序的选择框<checkbox-group>和<checkbox>
  2. 采埃孚全球首发coPILOT 以自动驾驶产品切入中国市场 | 2019上海车展...
  3. xxl-job 在业务代码中添加任务
  4. html捉虫游戏,[讨论]大家一起来捉虫!!
  5. 案例|容智信息携手富士胶片商业创新,赋能虎牙实现自动化转型!
  6. 最大子段和问题,拾捡硬币问题, 矩阵连乘问题,最短公共超序列问题,最优二分搜索树,买卖股票的最佳时机,天平秤金条问题,动态规划解最短路径问题
  7. 孙子兵法(论证.白话)-谋攻
  8. python file tell_Python File tell() 方法
  9. d3-折线图-中日GDP
  10. 股票day级历史数据的下载方法