m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

android5.xで加速度センサーと地磁気センサーで方位や傾きを検出

X、Y、Zの意味がちょーっとずつ理解出来てきたかも

と思っているうちはわかっていない(´・ω・`)

実装

MainActivity
package jp.mshige1979.app.samplesensor03;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends Activity {

    // センサーマネージャー
    private SensorManager manager;

    // センサーイベントリスナー
    private SensorEventListener listener;

    // 加速度の値
    private float[] fAccell = null;

    // 地磁気の値
    private float[] fMagnetic = null;

    private static final int MATRIX_SIZE = 16;
    float[] inR = new float[MATRIX_SIZE];
    float[] outR = new float[MATRIX_SIZE];
    float[] I = new float[MATRIX_SIZE];

    //
    TextView textView1 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // センサーマネージャーを取得
        manager = (SensorManager)getSystemService(SENSOR_SERVICE);

        // センサーのイベントリスナーを登録
        listener = new SensorEventListener() {

            // 値変更時
            @Override
            public void onSensorChanged(SensorEvent sensorEvent) {

                // センサーの種類で値を取得
                switch( sensorEvent.sensor.getType()) {
                    // 加速度
                    case Sensor.TYPE_ACCELEROMETER:
                        fAccell = sensorEvent.values.clone();
                        break;

                    // 地磁気
                    case Sensor.TYPE_MAGNETIC_FIELD:
                        fMagnetic = sensorEvent.values.clone();
                        break;
                }

                // 両方確保した時点でチェック
                if(fAccell != null && fMagnetic != null){
                    // 回転行列を得る
                    SensorManager.getRotationMatrix(inR, I, fAccell, fMagnetic);

                    // ワールド座標とデバイス座標のマッピングを変換する
                    SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR);

                    // 姿勢を得る
                    float[] fAttitude = new float[3];
                    SensorManager.getOrientation(outR, fAttitude);

                    for (int i = 0; i < 3; i++) {
                        fAttitude[i] = (float)(fAttitude[i] * 180 / Math.PI);
                        fAttitude[i] = (fAttitude[i] < 0) ? fAttitude[i] + 360 : fAttitude[i];
                    }

                    // 出力内容を編集
                    String buf =
                            "---------- Orientation --------\n" +
                                    String.format( "方位角\n\t%f\n", fAttitude[0]) +
                                    String.format( "前後の傾斜\n\t%f\n", fAttitude[1]) +
                                    String.format( "左右の傾斜\n\t%f\n", fAttitude[2]);
                    textView1.setText( buf );
                }

            }

            //
            @Override
            public void onAccuracyChanged(Sensor sensor, int i) {

            }
        };

        // text
        textView1 = (TextView)findViewById(R.id.text1);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // リスナー設定:加速度
        manager.registerListener (
                listener,
                manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_FASTEST);

        // リスナー設定:地磁気
        manager.registerListener (
                listener,
                manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_FASTEST);
    }


    @Override
    protected void onPause() {
        super.onPause();

        // リスナー解除
        manager.unregisterListener(listener);
    }

}

※今回はリスナーオブジェクトを生成して登録

結果

f:id:m_shige1979:20150710233435p:plain
※マイナスが気になったので360で表記しています