实现指南针的新方法SensorManager.getOrientation( )
来源:互联网 发布:sql select两个表 编辑:程序博客网 时间:2024/06/05 09:27
研究了下传感器,一时兴起做了个小的指南针APP,网上讲的比较多的方法:
1、注册一个针对方位传感器的事件监听器;
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor compassSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mSensorManager.registerListener(this, compassSensor, SensorManager.SENSOR_DELAY_NORMAL);
2、得到传感器事件的values[0],作为手机头部朝向的方位角,从而得到相对正北的角度(顺时针)
@Override
public void onSensorChanged(SensorEvent event) {
// 获取绕Z轴转过的角度
float degree = event.values[0];
System.out.println("方位角=" + degree);
}
但是其实谷歌官方已经在API 8 开始就已经弃用了Sensor.TYPE_ORIENTATION这种方式,转而推荐使用SensorManager.getOrientation( )的方式来获取到方位、横滚、俯仰值。
我看了看API文档,试着用新方法实现了,肉眼对比了一下,大概和旧方法获取的方位值有不到1度的误差,也可以使用了。
不多说,关键代码如下,大家一看便知。
public class CompassActivity extends Activity implements SensorEventListener { private static final String TAG = "CompassActivity"; //记录rotationMatrix矩阵值 private float[] r = new float[9]; //记录通过getOrientation()计算出来的方位横滚俯仰值 private float[] values = new float[3]; private float[] gravity = null; private float[] geomagnetic = null; // 定义真机的Sensor管理器 private SensorManager mSensorManager; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(gravity!=null && geomagnetic!=null) { if(SensorManager.getRotationMatrix(r, null, gravity, geomagnetic)) { SensorManager.getOrientation(r, values); float degree = (float) ((360f+values[0]*180f/Math.PI)%360); Log.i(TAG, "计算出来的方位角=" + degree); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_compass); // 获取真机的传感器管理服务 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); //注册加速度传感器监听 Sensor acceleSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, acceleSensor, SensorManager.SENSOR_DELAY_NORMAL); //注册磁场传感器监听 Sensor magSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mSensorManager.registerListener(this, magSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); // 取消所有注册 mSensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: //加速度传感器 gravity = event.values; handler.sendEmptyMessage(0); break; case Sensor.TYPE_MAGNETIC_FIELD://磁场传感器 geomagnetic = event.values; handler.sendEmptyMessage(0); break; } }}
- 实现指南针的新方法SensorManager.getOrientation( )
- SensorManager的方向传感器Orientation -- 指南针的简易实现
- Android SensorManager getOrientation getRotationMatrix
- 安卓传感器SensorManager实现简单指南针
- 指南针的实现
- 简易指南针的实现
- Android学习篇章56-SensorManager 指南针
- 安卓 方向传感器The field Sensor.TYPE_ORIENTATION is deprecated use SensorManager.getOrientation()instead介绍
- Android指南针程序的实现
- sensorManager实现小球滚动
- Android传感器介绍及指南针的实现
- Android传感器介绍及指南针的实现
- Android指南针app的实现原理总结
- Android指南针app的实现原理总结
- 实现GPRS数据传输新方法的研究
- 实现嵌入式Linux系统的新方法
- 转:实现GPRS数据传输新方法的研究
- 一种实现嵌入式Linux的新方法-ramdisk
- ViewPager + Fragment 实现页面滑动
- nginx和tomcat之间连接复用要注意的问题
- .NET基础回顾
- C语言学习资源汇总
- 在iOS7中修改状态栏字体的颜色
- 实现指南针的新方法SensorManager.getOrientation( )
- 开发者建站免费.或者.收费空间
- 面试题5-从尾到头打印链表
- spring中一些aware接口
- iOS中self和super区别
- 基础练习6_杨辉三角
- Head First Html+CSS 笔记(三)
- linux下目录读权限与执行权限区别
- win7 system文件损坏修复办法(刚刚出锅的经验)