安卓开发-拍照方向的一个解决方法

拍照方向的一个解决方法

在开发过程中遇到一个问题,需要记录安卓设备在拍摄时的朝向(以正北方为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];
			//关键在这里,通过旋转坐标系把Y轴对应到-Z轴上
			SensorManager.remapCoordinateSystem(rotationMatrix,SensorManager.AXIS_X,SensorManager.AXIS_MINUS_Z,newRotationMatrix);
			SensorManager.getOrientation(newRotationMatrix, orientationAngles);
			float azimuthInRadians = orientationAngles[0];  // 方位角(azimuth),以弧度表示
			float azimuthInDegrees = (float) Math.toDegrees(azimuthInRadians)+180;  // 将方位角转换为度,原值为-180到180,所以加一个180转换为0-360;
			
			//上面azimuthInDegrees极为得到的拍摄方向(角度)
		}
		@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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值