使用传感器的步骤:
获取SensorManeger对象
获取Sensor对象
注册Sensor对象
重写onAccuracyChanged,onSensorChangged这两个方法
注销Sensor对象
public class MainActivity
extends AppCompatActivity{
private SensorManagermSensorManager;
private Sensoraccelerometer;
// 加速度传感器
private Sensor
magnetic; //
地磁场传感器
private ImageView
azimuthAngle;
private float mstartDegree=0f;
private float[] accelerometerValues=
new float[3];
private float[] magneticFieldValues=
new float[3];
private static final String
TAG = "---MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService( Context.SENSOR_SERVICE);
// 初始化加速度传感器
accelerometer =
mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 初始化地磁场传感器
magnetic =
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
azimuthAngle = (ImageView) findViewById(R.id.imageview);
calculateOrientation();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
// 注册监听
mSensorManager.registerListener(new
MySensorEventListener(),
accelerometer, Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(new
MySensorEventListener(),magnetic,
Sensor.TYPE_MAGNETIC_FIELD);
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
// 解除注册
mSensorManager.unregisterListener(new
MySensorEventListener());
super.onPause();
}
// 计算方向
private void calculateOrientation() {
float[]values =
new float[3];
float[] R =new float[9];
SensorManager.getRotationMatrix(R,null,
accelerometerValues,
magneticFieldValues);
SensorManager.getOrientation(R,values);
values[0] = (float) Math.toDegrees(values[0]);
RotateAnimation rotateAnimation=new
RotateAnimation (mstartDegree,values[0],Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f
);
rotateAnimation.setDuration ( 300 );
azimuthAngle.setAnimation(rotateAnimation );
mstartDegree=values[0];
}
class MySensorEventListenerimplements
SensorEventListener {
@Override
publicvoid onSensorChanged(SensorEventevent) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values;
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticFieldValues = event.values;
}
calculateOrientation();
}
@Override
public void onAccuracyChanged(Sensorsensor,
int accuracy) {
// TODO Auto-generated method stub
}
}
}