参考:《Android 4》高级编程(第三版)第12章
基础知识
绕Z轴旋转角度:Azimuth,我称之为正北转角(指南针的磁北方向)
绕X轴旋转角度:Pitch,我称之为顶尾翘角
绕Y轴旋转角度:Roll,我称之为左右转角
方案一:磁场传感器+加速度传感器(推荐)
第一步:获取传感器系统服务
private SensorManager sensorManager;
初始化
protected void onCreate(Bundle savedInstanceState) {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
第二步:初始化加速度的三轴变量和磁场传感器的三轴变量
private float[] accelerometerValues;
private float[] magnetFieldValues;
第三步:重写监听器
private final SensorEventListener sensorEventListener = new SensorEventListener() {
@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event) {
// TODO 自动生成的方法存根
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values;
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magnetFieldValues = event.values;
}
}
第四步:注册相应的传感器到相应的监听器
<pre name="code" class="java">@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 获取系统的传感器服务 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
}
private void getSensorService() {
// int rate=SensorManager.SENSOR_DELAY_FASTEST;
int rate=SensorManager.SENSOR_DELAY_NORMAL;
Sensor accelerometerSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(sensorEventListener,
accelerometerSensor, rate);
Sensor magnetSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sensorManager.registerListener(sensorEventListener, magnetSensor,
rate);
}
第五步:获取当前方向(定时200ms获取方向)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 获取系统的传感器服务 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
Timer updateTimer = new Timer("gForceUpdate");
updateTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO 自动生成的方法存根
if (accelerometerValues != null &&magnetFieldValues != null) {
float[] values = new float[3];
float[] R = new float[9];
SensorManager.getRotationMatrix(R, null,
accelerometerValues, magnetFieldValues);
SensorManager.getOrientation(R, values);
values[0] = (float) Math.toDegrees(values[0]);// 正北转角
values[1] = (float) Math.toDegrees(values[1]);// 顶尾翘角
values[2] = (float) Math.toDegrees(values[2]);// 左右转角
/* 将三轴方向插入到数据库中 */
}
}
}, 0, 200);
}
方案二:使用废弃的虚拟方向传感器
第一步:获取传感器系统服务
private SensorManager sensorManager;
初始化
protected void onCreate(Bundle savedInstanceState) {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
第二步:初始化方向变量
private float x_orientation = -999;
private float y_orientation = -999;
private float z_orientation = -999;
第三步:重写监听器
private final SensorEventListener sensorEventListener = new SensorEventListener() {
@SuppressWarnings("deprecation")
@Override
public void onSensorChanged(SensorEvent event) {
// TODO 自动生成的方法存根
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
orientationValues = event.values;
z_orientation = event.values[0]; // 正北转角
x_orientation = event.values[1]; // 顶尾翘角
y_orientation = event.values[2]; // 左右转角
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO 自动生成的方法存根
}
};
第四步:注册相应的传感器
<pre name="code" class="java">@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 获取系统的传感器服务 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
}
private void getSensorService() {
// int rate=SensorManager.SENSOR_DELAY_FASTEST;
int rate=SensorManager.SENSOR_DELAY_NORMAL;
@SuppressWarnings("deprecation")
Sensor orientationSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(sensorEventListener,orientationSensor,
rate);
}
第五步:获取当前方向——定时200ms获取方向
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 获取系统的传感器服务 */
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
getSensorService();
Timer updateTimer = new Timer("gForceUpdate");
updateTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO 自动生成的方法存根
if (x_orientation!=-999&& y_orientation!=-999&& z_orientation!=-999) {
/* 将三轴方向插入到数据库中 */
}
}
}, 0, 200);
}
注意:需要在onResume()中注册传感器,在onDestroy()、onDestroy()和onPause()中注销传感器监听
@Override
protected void onResume() {
// TODO 自动生成的方法存根
super.onResume();
getSensorService();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
sensorManager.unregisterListener(sensorEventListener);
}
@Override
protected void onPause() {
// TODO 自动生成的方法存根
super.onPause();
sensorManager.unregisterListener(sensorEventListener);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
sensorManager.unregisterListener(sensorEventListener);
}