恵方巻きコンパスを作りたい&地磁気・加速度センサーの値の取得

スポンサーリンク
スポンサーリンク

スポンサーリンク

恵方巻きコンパス

スーパーやコンビニに行くともう恵方巻きの予約やらの広告が掲示されている。GooglePlayで恵方巻きコンパスを探してみたら、普通のコンパスに加えて、恵方巻きコンパスも腐るほど出てきた。これなら俺が作っても大丈夫ではなかろうかと思った。なんとなくだけど、センサーから数値を引っ張るところまではできそうだけど、それを元に画像(磁針とか)を動かすのに苦戦しそうだなと思う。でもまあやってみよう、節分に間に合うかな。間に合わなかったらそれはそれでいいや。

センサーを扱う

とりあえず画像とかは後回しにして、テキストで数値を表示するようなものを作ってみたい。いろんなサイトを見ると、加速度センサーと磁気センサーを使うみたい。方位で、なんで加速度が必要なんだろうと思ったけどよく分かってない。

private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mMagneticField;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

センサーを使うときは、SensorManagerを使うみたい。

public class CompassActivity extends AppCompatActivity implements SensorEventListener {

implements SensorEventListnerを追加すると

@Override
public void onSensorChanged(SensorEvent event) {

}

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

}

の2つを追加するように言われる。2つの違いがあまり良く分からんが、普通上のメソッドの中に処理を書くみたい。

@Override
protected void onResume() {
    super.onResume();
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mMagneticField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(this, mMagneticField, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
}

onResumeとonPauseでリスナの登録と解除。onStopで解除してるとこもあったけどなぜかな。これで使う準備できたはず。

private float[] fAccell;
private float[] fMagnetic;
@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            fAccell = event.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            fMagnetic = event.values.clone();
            break;
    }
}

switchでセンサーの種類を判断し、それぞれ値をfloat型の変数に代入する。とりあえずTextViewに表示してみよう。

StringBuilder sb = new StringBuilder();
if (fAccell != null && fMagnetic != null) {
    sb.append("加速度\nX _ ");
    sb.append(fAccell[0]);
    sb.append("\nY _ ");
    sb.append(fAccell[1]);
    sb.append("\nZ _ ");
    sb.append(fAccell[2]);

    sb.append("\n\n地磁気\nX _ ");
    sb.append(fMagnetic[0]);
    sb.append("\nY _ ");
    sb.append(fMagnetic[1]);
    sb.append("\nZ _ ");
    sb.append(fMagnetic[2]);

    textView.setText(sb.toString());
}

どっちもnullじゃないことを確認して表示。

できた。ぐるーっと回したり、傾けてみたり、数字が変わるが、意味がよく分かってないぞ。

参考

Sensors Overview  |  Sensors and location  |  Android Developers
Motion sensors  |  Sensors and location  |  Android Developers
Position sensors  |  Sensors and location  |  Android Developers
Android勉強会 vol.3 センサーの値をリアルタイムでグラフ表示する - Qiita
この記事では Android Studio 2.1.2 を使用しています。大学の研究室で開催している勉強会の資料共有とアーカイブのためにQiitaに投稿しています。まずはプロジェクトを作成する…
[Android 開発] 端末の傾きと方位角を求める
前回の記事で紹介した傾きと方位角を求める方法は、最新の Android OS では非推奨(deprecated)とされています。現在のリファレンスでは、加速度センサと方位角センサそれぞれの測定値から計算するよう求められています。開発者が記述すべきコードが増えるため、一見すると面倒になったように思えますが、この過程で.....

コメント

タイトルとURLをコピーしました