zoukankan      html  css  js  c++  java
  • Android 方向传感器

    一般情况下,在Android系统中获取手机的方位信息在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);然而我们这样做的话在最新版的SDK中就会看到这么一句话:“TYPE_ORIENTATION   This constant is deprecated. use SensorManager.getOrientation() instead. ”即这种方式也过期,不建议使用!Google建议我们在应用程序中使用SensorManager.getOrientation()来获得原始数据。

    public static float[] getOrientation (float[] R, float[] values)

    第一个参数是R[] 是一个旋转矩阵,用来保存磁场和加速度的数据,可以理解为这个函数的传入值,通过它这个函数给你求出方位角。

    第二个参数就是这个函数的输出了,他有函数自动为我们填充,这就是我们想要的。

     

    values[0]  :方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。

    values[1]  pitch 倾斜角  即由静止状态开始,前后翻转,手机顶部往上抬起(0~-90),手机尾部往上抬起(0~90)

    values[2]  roll 旋转角 即由静止状态开始,左右翻转,手机左侧抬起(0~90),手机右侧抬起(0~-90)


    现在问题是这个R[]怎么获取,其实他是通过函数getRotationMatrix得到的。

    看看getRotationMatrix的定义:

     

    public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

    解释以下参数,第一个就是我们需要填充的R数组,大小是9

                                第二个是是一个转换矩阵,将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null

                                第三个是一个大小为3的数组,表示从加速度感应器获取来的数据  在onSensorChanged中

                                第四个是一个大小为3的数组,表示从磁场感应器获取来的数据    在onSensorChanged中

    示例代码:

    package com.example.testoritation;
    
    import android.app.Activity;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.view.Menu;
    import android.widget.TextView;
    //实现传感器事件监听:SensorEventListener
    public class MainActivity extends Activity implements SensorEventListener{
    
    	private SensorManager sensorManager;
    	private Sensor acc_sensor;
    	private Sensor mag_sensor;
    	//加速度传感器数据
    	float accValues[]=new float[3];
    	//地磁传感器数据
    	float magValues[]=new float[3];
    	//旋转矩阵,用来保存磁场和加速度的数据
    	float r[]=new float[9];
    	//模拟方向传感器的数据(原始数据为弧度)
    	float values[]=new float[3];
    	TextView show_change=null;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		show_change=(TextView) findViewById(R.id.show_change);
    		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    		acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    		mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    		//给传感器注册监听:
    		sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME);
    		sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    	//传感器状态改变时的回调方法
    	@Override
    	public void onSensorChanged(SensorEvent event) {
    		if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
    			accValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
    		}
    		else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
    			magValues=event.values.clone();//这里是对象,需要克隆一份,否则共用一份数据
    		}
    		/**public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
    		 * 填充旋转数组r
    		 * r:要填充的旋转数组
    		 * I:将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null
    		 * gravity:加速度传感器数据
    		 * geomagnetic:地磁传感器数据
    		 */
    		SensorManager.getRotationMatrix(r, null, accValues, magValues);
    		/**
    		 * public static float[] getOrientation (float[] R, float[] values)
    		 * R:旋转数组
    		 * values :模拟方向传感器的数据
    		 */
    		
    		SensorManager.getOrientation(r, values);
    		
    		
    		//将弧度转化为角度后输出
    		StringBuffer buff=new StringBuffer();
    		for(float value:values){
    			value=(float) Math.toDegrees(value);
    			buff.append(value+"  ");
    		}
    		show_change.setText(buff.toString());
    		
    	}
    	
    	@Override
    	public void onAccuracyChanged(Sensor sensor, int accuracy) {
    	}
    
    }
    
  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/qiengo/p/6054004.html
Copyright © 2011-2022 走看看