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));
}

}