其实获取方向本应该很简单的事情,在文章一中看到 有个TYPE_ORIENTATION 关键字,说明可以直接获取设备的移动方向,但是最新版的SDK加上了这么一句话“TYPE_ORIENTATION This constant is deprecated. use SensorManager.getOrientation() instead. ”也就是说,这种方式已经被取消,要开发者使用 SensorManager.getOrientation()来获取原来的数据。
实际上,android获取方向是通过磁场感应器和加速度感应器共同获得的,至于具体的算法SDK已经封装好了。也就是说现在获取用户方向有两种方式,一是官方推荐的,通过SensorManager.getOrientation()来获取,这个方法表面看似容易(那是因为你还没看到他的参数。。一会再说),但实际上需要用到两个感应器共同完成工作,特点是更加的准确。第二种方法非常简单,就像前一篇文章获取加速度一样,直接得到三个轴上的数据。
额,从难一些的介绍吧,因为毕竟第一种方法会是android未来的一个选择,第二种不知道什么时候就要成为历史了。
android给我们提供的方向数据是一个float型的数组,包含三个方向的值 如图
当你的手机水平放置时,被默认为静置状态,即XY角度均为0
values[0] 表示Z轴的角度:方向角,我们平时判断的东西南北就是看这个数据的,经过我的实验,发现了一个有意思的事情,也就是说使用第一种方式获得方向(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而第二种方式(直接通过方向感应器)数据范围是(0~360)360/0表示正北,90表示正东,180表示正南,270表示正西。
values[1] 表示X轴的角度:俯仰角 即由静止状态开始,前后翻转
values[2] 表示Y轴的角度:翻转角 即由静止状态开始,左右翻转
可见统一获取方向的方法是必须的,因为处理这些数据的算法可能针对第一种获取方式,那么当用在第二种方式时,移植性就不好了。
看下面的方法
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public static float[] getOrientation (float[] R, float[] values)
Computes the device's orientation based on the rotation matrix.
When it returns, the array values is filled with the result:
- values[0]: azimuth, rotation around the Z axis.
- values[1]: pitch, rotation around the X axis.
- values[2]: roll, rotation around the Y axis.
The reference coordinate-system used is different from the world coordinate-system defined for the rotation matrix:
- X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points West).
- Y is tangential to the ground at the device's current location and points towards the magnetic North Pole.
- Z points towards the center of the Earth and is perpendicular to the ground.
All three angles above are in radians and positive in the counter-clockwise direction.
通常我们并不需要获取这个函数的返回值,这个方法会根据参数R[]的数据填充values[]而后者就是我们想要的。
那么R表示什么呢?又将怎么获取呢?
R[] 是一个旋转矩阵,用来保存磁场和加速度的数据,大家可以理解未加工的方向数据吧
R通过下面的静态方法获取,这个方法也是用来填充R[]
public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
解释以下参数,第一个就是我们需要填充的R数组,大小是9
第二个是是一个转换矩阵,将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
第三个是一个大小为3的数组,表示从加速度感应器获取来的数据 在onSensorChanged中
第四个是一个大小为3的数组,表示从磁场感应器获取来的数据 在onSensorChanged中
好了基本逻辑就是这样的,下面给大家演示一个简单的测试方向的例子,可以时刻监听用户的方向
- /*
- * @author octobershiner
- * 2011 07 28
- * SE.HIT
- * 一个演示通过磁场和加速度两个感应器获取方向数据的例子
- * */
- package uni.sensor;
- import android.app.Activity;
- import android.content.Context;
- import android.hardware.Sensor;
- import android.hardware.SensorEvent;
- import android.hardware.SensorEventListener;
- import android.hardware.SensorManager;
- import android.os.Bundle;
- import android.util.Log;
- public class OrientationActivity extends Activity{
- private SensorManager sm;
- //需要两个Sensor
- private Sensor aSensor;
- private Sensor mSensor;
- float[] accelerometerValues = new float[3];
- float[] magneticFieldValues = new float[3];
- private static final String TAG = "sensor";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
- aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- mSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
- sm.registerListener(myListener, aSensor, SensorManager.SENSOR_DELAY_NORMAL);
- sm.registerListener(myListener, mSensor,SensorManager.SENSOR_DELAY_NORMAL);
- //更新显示数据的方法
- calculateOrientation();
- }
- //再次强调:注意activity暂停的时候释放
- public void onPause(){
- sm.unregisterListener(myListener);
- super.onPause();
- }
- final SensorEventListener myListener = new SensorEventListener() {
- public void onSensorChanged(SensorEvent sensorEvent) {
- if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
- magneticFieldValues = sensorEvent.values;
- if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
- accelerometerValues = sensorEvent.values;
- calculateOrientation();
- }
- public void onAccuracyChanged(Sensor sensor, int accuracy) {}
- };
- private void calculateOrientation() {
- float[] values = new float[3];
- float[] R = new float[9];
- SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);
- SensorManager.getOrientation(R, values);
- // 要经过一次数据格式的转换,转换为度
- values[0] = (float) Math.toDegrees(values[0]);
- Log.i(TAG, values[0]+"");
- //values[1] = (float) Math.toDegrees(values[1]);
- //values[2] = (float) Math.toDegrees(values[2]);
- if(values[0] >= -5 && values[0] < 5){
- Log.i(TAG, "正北");
- }
- else if(values[0] >= 5 && values[0] < 85){
- Log.i(TAG, "东北");
- }
- else if(values[0] >= 85 && values[0] <=95){
- Log.i(TAG, "正东");
- }
- else if(values[0] >= 95 && values[0] <175){
- Log.i(TAG, "东南");
- }
- else if((values[0] >= 175 && values[0] <= 180) || (values[0]) >= -180 && values[0] < -175){
- Log.i(TAG, "正南");
- }
- else if(values[0] >= -175 && values[0] <-95){
- Log.i(TAG, "西南");
- }
- else if(values[0] >= -95 && values[0] < -85){
- Log.i(TAG, "正西");
- }
- else if(values[0] >= -85 && values[0] <-5){
- Log.i(TAG, "西北");
- }
- }
- }
实训的时间非常紧张,抽时间写总结感觉很累,但是感觉收获很多,如果有时间的话,也想给大家分享第二种方法,和这种比起来简单很多,其实大家可以完全参考上篇文章中的代码http://blog.csdn.net/octobershiner/article/details/6639040
只要把其中的两个Sensor。TYPE_ACCELEROMETER改成 Sensor.TYPE_ORIENTATIO就好了,但是今天分享的方法大家最好掌握,这应该是未来android的标准。
Sensor感应器应该就先暂时介绍到这里吧,该看一下进程线程的东西了,其实hardware包中还有个非常重要的类,Camera摄像头,相信大家也听过android扫描器,很强大。以后有时间和大家分享吧。
接下来的安排 应该是 线程 activity然后是geocode
话说我也没有个指导老师,一个人对着SDK研究这些,有些累阿~求高人指点。
转自:http://blog.csdn.net/octobershiner/article/details/6641942
相关推荐
主要介绍了Android使用Sensor感应器获取用户移动方向的方法,实例分析了指南针原理极其应用,需要的朋友可以参考下
phonegap技术实现了指南针功能,界面跟iphone上的指南针一样,
指南针功能:该应用程序通过移动设备的方向感应器实现了指南针功能,可以显示用户当前的方向。用户可以根据指南针上的方向箭头来确定自己的前进方向。 地图功能:该应用程序还提供了地图功能,用户可以在地图上查看...
mapbox 视角切换,模仿baidu地图的3d与2d的切换,与指南针的旋转
写的一个简单的指南针demo,根据用户当前的经纬度坐标,指向目标经纬度的方向,可随手机移动翻转发生变化。
android获取用户方向,晚上好~今天继续给大家分享一下第二个重要的感应器,其实获取方向本应该很简单的事情,在文章一中看到 有个TYPE_ORIENTATION 关键字,说明可以直接获取设备的移动方向,但是最新版的SDK加上了...
指南针 一个传单控制插件,用于制作简单的旋转罗盘 在传单 0.7 和 1.2 中测试 在移动设备上需要 HTML5 API! 测试平台: 安卓上的 Chrome iOS 上的 Safari 在线演示: 用法 将指南针控件添加到地图: map....
介绍移动通信原理,供广大通信专业人员学习
《移动通信原理》期末复习题 一、判断题 1. 数字移动通信系统要求调制技术使已调信号的频谱越宽越好,以便更好地抗衰落 × 2. π/4-DQPSK是恒包络的调制技术,其优点是可采用成本低廉的非线性功放 × 3. RAKE接收...
《移动应用用户体验评价指南》 国家标准 T/CQAE,参考 ISO 9241,草案 从用户体验角度针对移动应用产品特点,目前尚未有行业协商一致的专门针对移动应用(APP)用户体验质量评价标准。 GB/T 16260《软件工程 产质量...
移动通信原理 牛凯 北京邮电大学移动通信原理课件
介绍移动通信的基本原理,ppt
移动通信与手机原理 讲解细致,深入原理,图文并茂
移动操作系统原理与实践——基于Java语言的Android应用开发 目录 基础篇 第1章移动操作系统概论 1.1操作系统的原理与概念 1.1.1隐藏硬件细节 1.1.2资源管理 1.1.3操作系统的历史 1.2操作系统的分类 1.2.1...
对信号进行加扰 加入用于识别用户的信息,将窄带信号拓宽 将数字信号调制成模拟信号 将模拟信号加到载波上进行发射 移动通信基本原理(岗前培训)全文共36页,当前为第4页。 多址技术 频率复用 位置登记 切换 爱尔兰 ...
unity 手机 触屏 控制玩家 移动 方向
移动智能网原理。pdf
移动硬盘原理图,详细介绍移动硬盘原理图,可根据此图进行移动硬盘设计,制作。进行PCB绘制。
移动通信原理系统 第四版 西安电子科技大学出版社出版
GSM移动通信技术原理与应用:原理,设备,仿真实践