Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Android端末のセンサーの情報を取得してみましょう

こんばんは。kimukimuです。

Android2.3の新機能シリーズ、まだまだ続きます。

・・・なんですが、Android SDK 3.2も出ていますし、
この子。(下)もAndroid3.1になったんですよね。

もしかするとAndroid2.3って既に古くなりつつあるのかもしれません。
とまぁ、ただ携帯電話Androidとして最新なのは変わりません。
まだまだ続きますよ。

今回紹介するのは「センサー」です。

1. センサーで何が見えるのか?

当然ながら、ジャイロセンサーなどでしたらAndroid2.3以前からあります。
Android2.3では下記のセンサーがOSとしてサポートされるようになっています。

  • 重力センサー
  • 加速度センサー
  • 回転角度センサー
  • 温度計(!)

・・・ただ、残念ながら温度計の搭載された機種は私は持っていません。
そのため、「重力」「加速度」「回転角度」について確認してみます。

2.アプリケーションマニフェストの記述

今回のアプリケーションマニフェストは下記です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.gr.t3.sensor" android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="9" />

  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".SensorTestActivity" android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <!-- ★ジャイロセンサーを積んでいない機種でAndroidマーケットを見た場合表示されないようにする ★ -->
    <uses-feature android:name="android.hardware.sensor.gyroscope"
      android:required="true" />
  </application>
</manifest>

今回はuses-featureタグを新たに使用しています。(★)
これは何かというと、特定のハードを使用するアプリの場合、
そのハードを搭載していないAndroid端末にインストールされないためのタグです。

uses-featureタグを設定しておくと、要求される機能を持たないAndroid端末で
Androidマーケットにアクセスしてもそのアプリは表示されなくなります。

地味ですが、無駄なダウンロードをされてアプリの評判を下げないためには重要です。

3. どんなコードで実現できるのか?

いつも通りAndroidプロジェクトを作ってセンサー用の処理を記述してみました。
・・ウィンドウのデザインが変わっているのはお気になさらず。

今回はソースを乗せる部分は
「センサーを取得する箇所」「センサーのイベントから値を取得する箇所」にしぼります。
全部乗せると結構な量になりますので^^;
(実際に動かしたソースは:SensorTest.zip 直

■センサーオブジェクト取得

// センサーマネージャ取得
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

// 重力センサー取得
Sensor gravitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

// 加速度センサー取得
Sensor accelerationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

// 回転角度センサー取得
Sensor rotationVectorSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

上記のコードで取得したセンサーをセンサーマネージャにリスナとして登録することで
値の取得が可能となります。

■センサーの値を取得

/**
 * センサーからデータを取得した際、画面に反映する。
 * 
 * @param event
 *            センサーイベント
 */
public void onSensorChanged(SensorEvent event) {

  // センサ計測値。XYZの3軸で取得される。
  final float[] values = event.values;
  synchronized (this) {
    if (mBitmap != null) {
      final Canvas canvas = mCanvas;
      final Paint paint = mPaint;

      for (int i = 0; i < 3; i++) {
        mOrientationValues[i] = values[i] * mScale;
      }

      float deltaX = mSpeed;
      float newX = mLastX + deltaX;
      for (int i = 0; i < 3; i++) {
        final float v = mYOffset + values[i] * mScale;
        paint.setColor(mColors[i]);
        canvas.drawLine(mLastX, mLastValues[i], newX, v, paint);
        mLastValues[i] = v;
      }
      mLastX += mSpeed;
      invalidate();
    }
  }
}

取得される時に値が複数とれますが、それは下記のAPI解説にもあるように、
X軸、Y軸、Z軸の値が配列として取得されています。

4. 早速動かしてみます

では、早速タブレットにインストールして動かしてみます。

こんな感じで値がグラフとして表示されました!(重力)

センサーを切り替えて表示することもできます。(加速度)

という形で、センサーの値を取得できることが確認できました。

5. 何が嬉しいんだっけ?

ぶっちゃけ、今回のアプリだけでは何も嬉しくないです^^;
ただ、これらのセンサーの値/変化量を取得することで疑似的に万歩計を作ったり、
Android端末を傾けることでアプリの操作をする機能を追加することができます。

夢が広がりますよね。

かつ、そういったセンサーを使うアプリをJavaだけで開発できるのが大きなポイントです。
携帯端末ならではの機能をソフトウェアのみで自由に開発できるということは素晴らしいですよね!
ぜひ興味があったらどうぞ。