Android擷取三軸方向基礎知識
基礎知識
繞Z軸旋轉角度:Azimuth,我稱之為正北轉角(指南針的磁北方向)
繞X軸旋轉角度:Pitch,我稱之為頂尾翹角
繞Y軸旋轉角度:Roll,我稱之為左右轉角
方案一:磁場感應器+加速度感應器(推薦)
第一步:擷取感應器系統服務
private SensorManager sensorManager;初始化protected void onCreate(Bundle savedInstanceState) { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);}
第二步:初始化加速度的三軸變數和磁場感應器的三軸變數
private float[] accelerometerValues;private float[] magnetFieldValues;
第三步:重寫監聽器
private final SensorEventListener sensorEventListener = new SensorEventListener() {@SuppressWarnings(deprecation)@Overridepublic void onSensorChanged(SensorEvent event) {// TODO 自動產生的方法存根if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accelerometerValues = event.values;}if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magnetFieldValues = event.values;}}
第四步:註冊相應的感應器到相應的監聽器
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 擷取系統的感應器服務 */ sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); getSensorService(); }
private void getSensorService() {//int rate=SensorManager.SENSOR_DELAY_FASTEST;int rate=SensorManager.SENSOR_DELAY_NORMAL;Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sensorManager.registerListener(sensorEventListener,accelerometerSensor, rate);Sensor magnetSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);sensorManager.registerListener(sensorEventListener, magnetSensor,rate);}
第五步:擷取當前方向(定時200ms擷取方向)
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 擷取系統的感應器服務 */sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);getSensorService();Timer updateTimer = new Timer(gForceUpdate);updateTimer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {// TODO 自動產生的方法存根if (accelerometerValues != null &&magnetFieldValues != null) {float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null,accelerometerValues, magnetFieldValues);SensorManager.getOrientation(R, values);values[0] = (float) Math.toDegrees(values[0]);// 正北轉角values[1] = (float) Math.toDegrees(values[1]);// 頂尾翹角values[2] = (float) Math.toDegrees(values[2]);// 左右轉角/* 將三軸方向插入到資料庫中 */}}}, 0, 200);}
方案二:使用廢棄的虛擬方向感應器
第一步:擷取感應器系統服務
private SensorManager sensorManager;初始化protected void onCreate(Bundle savedInstanceState) { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);}
第二步:初始化方向變數
private float x_orientation = -999;private float y_orientation = -999;private float z_orientation = -999;
第三步:重寫監聽器
private final SensorEventListener sensorEventListener = new SensorEventListener() {@SuppressWarnings(deprecation)@Overridepublic void onSensorChanged(SensorEvent event) {// TODO 自動產生的方法存根if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {orientationValues = event.values;z_orientation = event.values[0]; // 正北轉角x_orientation = event.values[1]; // 頂尾翹角y_orientation = event.values[2]; // 左右轉角}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO 自動產生的方法存根}};
第四步:註冊相應的感應器
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 擷取系統的感應器服務 */ sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); getSensorService(); }
private void getSensorService() {// int rate=SensorManager.SENSOR_DELAY_FASTEST; int rate=SensorManager.SENSOR_DELAY_NORMAL; @SuppressWarnings(deprecation) Sensor orientationSensor = sensorManager .getDefaultSensor(Sensor.TYPE_ORIENTATION); sensorManager.registerListener(sensorEventListener,orientationSensor, rate); }
第五步:擷取當前方向——定時200ms擷取方向
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 擷取系統的感應器服務 */sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);getSensorService();Timer updateTimer = new Timer(gForceUpdate);updateTimer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {// TODO 自動產生的方法存根if (x_orientation!=-999&& y_orientation!=-999&& z_orientation!=-999) {/* 將三軸方向插入到資料庫中 */}}}, 0, 200);}
注意:需要在onResume()中註冊感應器,在onDestroy()、onDestroy()和onPause()中登出感應器監聽
@Overrideprotected void onResume() {// TODO 自動產生的方法存根super.onResume();getSensorService();}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();sensorManager.unregisterListener(sensorEventListener);}@Overrideprotected void onPause() {// TODO 自動產生的方法存根super.onPause();sensorManager.unregisterListener(sensorEventListener);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();sensorManager.unregisterListener(sensorEventListener);}