Android 方位センサー
◯方位センサー
package com.example.tossy.sensorget;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity
implements SensorEventListener{
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mMagField;
private static final int MATRIX_SIZE = 16;
// センサーの値
private float[] mgValues = new float[3];
private float[] acValues = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
// 加速度センサー取得
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 地磁気センサー取得
mMagField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
// リスナー登録
@Override
public void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, mMagField,SensorManager.SENSOR_DELAY_NORMAL);
}
// リスナー解除
@Override
public void onPause() {
super.onPause();
mSensorManager.unregisterListener(this,mAccelerometer);
mSensorManager.unregisterListener(this,mMagField);
}
@Override
public void onAccuracyChanged(Sensor sensor,int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
TextView txt01 = (TextView)findViewById(R.id.txt01);
float[] inR = new float[MATRIX_SIZE];
float[] outR = new float[MATRIX_SIZE];
float[] I = new float[MATRIX_SIZE];
float[] orValues = new float[3];
// 加速度センサーと、地磁気センサーを配列に入れる
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
acValues = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mgValues = event.values.clone();
break;
}
if(acValues != null && mgValues != null) {
// getRotationMatrix メソッドで加速度センサーと地磁気センサーの値から回転行列 inR, Iを作成する
SensorManager.getRotationMatrix(inR, I, acValues, mgValues);
// 携帯を水平に持ち、アクティビティはポートレイト
// remapCoordinateSystem メソッドの第2引数、第3引数には、Android端末のX軸、Y軸が指す世界座標系の方向を指定する
SensorManager.remapCoordinateSystem(inR,SensorManager.AXIS_X,
SensorManager.AXIS_Y,outR);
// getOrientation メソッドで、方位角(アジマス)、傾斜角(ピッチ)、回転角(ロール)を配列として取得
SensorManager.getOrientation(outR,orValues);
StringBuilder strBuild = new StringBuilder();
strBuild.append("方位角(アジマス):");
strBuild.append(rad2Deg(orValues[0]));
strBuild.append("\n");
strBuild.append("傾斜角(ピッチ):");
strBuild.append(rad2Deg(orValues[1]));
strBuild.append("\n");
strBuild.append("回転角(ロール):");
strBuild.append(rad2Deg(orValues[2]));
strBuild.append("\n");
txt01.setText(strBuild.toString());
}
}
// onValues の値はラジアンで計測した角度なので、MathのtoDegreesで角度にする
public int rad2Deg(float rad) {
return (int) Math.floor(Math.toDegrees(rad));
}
}