Android罗盘又稱指南針,指北針

罗盘
罗盘又稱指南針,指北針,遊行必備,尋找目的地的方位!
支持磁偏角,真北极与磁北极之间转换!
偏航度:0-360
傾斜度:-90 ~ +90
橫搖度:-180 ~ +180
利用安桌手机的加速度传感器与磁场传感器,我在这里同时注册两个传感器.
1.获取传感器管理器
Sensor_Manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
2.创建罗盘监听器对像
Compass_Listener = new CompassListener();
3.判断是否有加速度计
if(Sensor_Manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() == 0)
return false;
4.获取第一个加速度计
Sensor_Accelerometer = Sensor_Manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
或着获取默认的加速度计
Sensor_Accelerometer = Sensor_Manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
5.注册传感器事件
Sensor_Manager.registerListener(Compass_Listener, Sensor_Accelerometer, SensorManager.SENSOR_DELAY_UI);

6.判断是否有磁场传感器
if(Sensor_Manager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).size() == 0)
return false;
7.获取第一个磁场传感器
Sensor_Magnetic = Sensor_Manager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(0);
或着获取默认的磁场传感器
Sensor_Magnetic = Sensor_Manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
5.注册传感器事件
Sensor_Manager.registerListener(Compass_Listener, Sensor_Magnetic, SensorManager.SENSOR_DELAY_UI);
退出时释放传感器监听
Sensor_Manager.unregisterListener(Compass_Listener);
Sensor_Manager.unregisterListener(Sensor_Manager);

6.生成罗盘的监听器
static class CompassListener implements SensorEventListener{
7.罗盘改变
@Override
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
Accelerometer_Values = event.values.clone();// 获取重力
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
GetAcceleration(x,y,z);// 获取重力
}
else
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
{
Magnetic_Values = event.values.clone();  // 获取磁场
}
GetYaw();// 偏航度
GetPitch(); // 倾斜度
GetRoll();//  横摇度
//发送选择通知
notifyVisibility();
}
}

public static float Yaw=0;// 偏航度
public static float Pitch=0;//倾斜度
public static float Roll=0;//  横摇度

static float[] inR = new float[9];
static float[] outR = new float[9];
static float[] V = new float[3];

计算横摇度
倾斜度为0度时横摇度最准确
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_X;
y_axis = SensorManager.AXIS_Y;
校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度,横摇度
Roll =  (float) Math.toDegrees(V[2]);

获取倾斜度
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_X;
y_axis = SensorManager.AXIS_MINUS_Z;

校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度
Pitch = (float) Math.toDegrees(V[1]);

获取偏航度
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_Y;
y_axis = SensorManager.AXIS_MINUS_X;
校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度
Yaw = (float) Math.toDegrees(V[0]);
磁北极=正北极+偏磁角
正北极=磁北极-偏磁角
Yaw = Yaw – GPSService.Declination;

http://shouji.baidu.com/software/8452414.html

發表評論