こんばんは。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. 早速動かしてみます
では、早速タブレットにインストールして動かしてみます。
という形で、センサーの値を取得できることが確認できました。