SensorManager的方向传感器Orientation -- 指南针的简易实现
通过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 -- 指南针的简易实现相关推荐
- Android Manager之SensorManager(传感器)—方向传感器(Orientation sensor)
本章节讲述方向传感器(Orientation sensor)的相关使用. 如果您还不了解传感器的相关知识,请点击:Android Manager之SensorManager(传感器)-基础知识 1.方 ...
- Android -- 传感器使用示例, 用方向传感器做指南针
1. 传感器类型:方向.加速度(重力).光线.磁场.距离(临近性).温度等. 方向传感器: Sensor.TYPE_ORIENTATION 加速度(重力)传感器: Sensor.TYPE_ACCE ...
- Android传感器之-方向传感器Orientation功能实现与源码
先明确一下空间坐标系的三个方向: x 方向就是手机的水平方向,右为正: y 方向就是手机的水平垂直方向,前为正: z 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负. 方向角的定义是手机y ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- android学习笔记---57_采用方向传感器实现指南针,android设备传感器介绍,以及使用方法
Java技术qq交流群:JavaDream:251572072 ------------------------------------------------------ 传感器类型:方向.加速度( ...
- 传感器--方向传感器制作指南针
我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向 同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向 public class MainAc ...
- Android基于方向传感器实现指南针功能
这里做了一个指南针,主要用到了Android里的加速度传感器和地磁传感器 Github源码 1.数据初始化 private USensor(Context context) {if (sorMgr = ...
- 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...
- Android 电子罗盘 --指南针(方向传感器的应用)
,图片神马的在网上搜个指南针图片就好了,本来没有注释,发上来之后感觉不行,还是加上吧,方便学习 main.xml <?xml version="1.0" encoding=& ...
最新文章
- python笔记基础-python笔记(二)基础二
- 头条二面:你们公司怎么处理 MySQL 的 Binlog 日志?
- java char 8192_java.net.ProtocolException:预期229个字节,但收到8192
- 修改firefox的默认缩放比
- Promise 的四种常用方法。
- Linux的操作系统原理详解
- Android原生框架--Xui使用
- 【Ignite】使用数据库软件DBeaver管理Apache Ignite
- knowledge distillation 综述
- linux sniffer 程序使用,Linux下Sniffer程序的实现
- 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 二
- Unity-安卓端透明背景设置
- vue 背景透明度_vue添加星空背景特效
- assoc fetch mysql 用法_php mysql_fetch_assoc 循环遍历表格
- 比 996 更可怕的是职场 PUA
- c/c++静态库和动态库制作
- 如何在虚拟机安装的Win10系统里快速打开【此电脑】图标?(图文详解)
- Codeforces Round#768(Div.2)A-F
- 基于javaspringboot+vue的汽车租赁管理系统含文档
- 我的showkey 刷挂了。
热门文章
- 微信小程序的选择框<checkbox-group>和<checkbox>
- 采埃孚全球首发coPILOT 以自动驾驶产品切入中国市场 | 2019上海车展...
- xxl-job 在业务代码中添加任务
- html捉虫游戏,[讨论]大家一起来捉虫!!
- 案例|容智信息携手富士胶片商业创新,赋能虎牙实现自动化转型!
- 最大子段和问题,拾捡硬币问题, 矩阵连乘问题,最短公共超序列问题,最优二分搜索树,买卖股票的最佳时机,天平秤金条问题,动态规划解最短路径问题
- 孙子兵法(论证.白话)-谋攻
- python file tell_Python File tell() 方法
- d3-折线图-中日GDP
- 股票day级历史数据的下载方法