拍照方向的一个解决方法
在开发过程中遇到一个问题,需要记录安卓设备在拍摄时的朝向(以正北方为0°顺时针记录0-360)
手机的坐标是屏幕为XY平面,Z轴垂直于屏幕指向天空。
发现通过获取地磁传感器和旋转状态时获取到的磁航向是以Y轴(平行于手机屏幕,方向朝向手机顶部)为指向的。可以通过换算到【-Z轴】方向解决。
不多说,上代码:
public class MainActivity extends AppCompatActivity{
private SensorManager sensorManager;
private Sensor rotationSensor;
SensorEventListener listener = new SensorEventListener() {
float[] mRotationVec;
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType()==Sensor.TYPE_ROTATION_VECTOR) {
mRotationVec=event.values;
if(mRotationVec!=null){
float[] rotationMatrix = new float[9];
float[] orientationAngles = new float[3];
SensorManager.getRotationMatrixFromVector(rotationMatrix,mRotationVec);
float[] newRotationMatrix=new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix,SensorManager.AXIS_X,SensorManager.AXIS_MINUS_Z,newRotationMatrix);
SensorManager.getOrientation(newRotationMatrix, orientationAngles);
float azimuthInRadians = orientationAngles[0];
float azimuthInDegrees = (float) Math.toDegrees(azimuthInRadians)+180;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy){
}
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
rotationSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(listener,rotationSensor,SensorManager.SENSOR_DELAY_NORMAL);
}
}