android获取手机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的,
a 获取到加速度传感器的实例
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
b获取地磁传感器的实例
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
c 注册监听器
sensorManager.registerListener(lister,Sensor,SensorManager.SENSOR_DELAY_GAME)
package com.yifei.myapplication;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
SensorManager manager;//声明一个传感器管理器变量
Sensor accelerSensor; //声明加速度传感器变量
Sensor magneticSensor;//声明一个地磁传感器的变量
//监听器
private MySensorListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取传感器管理器的实例
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
if (manager != null) {
//获取加速度传感器
accelerSensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//获取地磁传感器的实例
magneticSensor = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
listener = new MySensorListener();
if (accelerSensor != null && magneticSensor != null) {
//注册
manager.registerListener(listener, accelerSensor, SensorManager.SENSOR_DELAY_GAME);
}
}
}
class MySensorListener implements SensorEventListener {
//当传感器检测到的数值发生变化式调用
@Override
public void onSensorChanged(SensorEvent event) {
float[] acceler = new float[3];
float[] magnetic = new float[3];
//如果传感器的类型是加速度传感器
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
acceler = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {//如果传感器的类型是地磁传感器
magnetic = event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, acceler, magnetic);
SensorManager.getOrientation(R, values);
Log.d("MainActivity12", "onSensorChanged: " + Math.toDegrees(values[0]));
}
//当传感器精度发生变化时调用
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(manager!=null){
manager.unregisterListener(listener);
}
}
}