libro
www.tuyano.com
Google androidプログラミング入門

ハードウェア・アクセス (2/7)

作成:2010-06-01 17:25
更新:2010-06-01 17:29

■加速度センサーを使ってみる

では、実際に簡単なセンサー利用のプログラムを作ってみましょう。ここでは、加速度センサーを利用してみます。画面にTextViewを用意し、現在のセンサーの値を表示させる、ごくごくシンプルなプログラムを作成してみましょう。

まずレイアウト関係ですが、main.xmlandroid:id="@+id/text"という形で<TextView>を用意しておきましょう。他は適当でかまいません。ここに値を表示させます。

アクティビティは、SampleAppとして用意することにします。下にソースコードを掲載しておきますので、これを参考に作成してください。プログラムを実行すると、現在の加速度センサーの値が表示されます。加速度センサーは、X、Y、Zの各軸向きに3種類の値が用意されてます。それらの値をまとめて表示しています。

なお、このプログラムは、エミュレータでは正常な動作は保証しません。実際に実機で動かして動作を確認してください。

■ソースコードの流れ

では、ソースコードを見ていきましょう。まずクラスの定義部分です。ここでは以下のように書かれていますね。

1.クラス定義
public class SampleApp extends Activity
        implements SensorEventListener {……}
ここでは、SampleApp自身にSensorEventListenerをimplementsしておきました。従って、このクラスにイベント処理用のメソッドを用意すればよいわけですね。

2.SensorManagerの取得
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
まずはSensorManagerを取得します。これはActivity内の「getSystemService」メソッドを使います。これはシステムのサービスを取得するためのもので、引数に「SENSOR_SERVICE」というクラスフィールドを指定します。これが、センサーのサービスを示す値です。これで取得したインスタンスをSensorManagerにキャストします。

3.getSensorListでSensorのListを得る
List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_ACCELEROMETER);
SensorManagerから、加速度センサーのSensorを取得します。このとき注意すべきは、「センサーは1つとは限らないない」という点です。

このSensorの取得は、SensorManagerの「getSensorList」メソッドを使います。引数に、取得したいセンサーを示す値を指定して呼び出すと、そのSensorすべてがListにまとめられて返されます。引数には、Sensorクラスのフィールドを使います。ここでは、Sensor.TYPE_ACCELEROMETERを指定していますが、これが加速度センサーを示す値です。

4.イベントの登録
manager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_FASTEST);
ここでは、返されたListから、最初のSensorを取得し、これにSensorManagerの「registerListener」でイベントリスナーの登録をしています。

ここでは、implements SensorEventListenerしてクラスを定義していますから、イベントリスナーにはthisを指定しています。

5.必須メソッドの実装
public void onAccuracyChanged(Sensor arg0, int arg1) {}
public void onSensorChanged(SensorEvent event) {……}
SensorEventListenerには2つのメソッドが必要です。それが、onAccuracyChangedonSensorChangedです。onAccuracyChangedはセンサーの精度が変更された時のイベント処理です。onSensorChangedはセンサーの値が変更された時のイベント処理です。ここでは、onSensorChangedメソッドのみ使っています。

6.加速度センサーの値かどうかをチェック
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {……}
onSensorChangedメソッドでは、まずイベントが発生したのが加速度センサーかどうかをチェックしています。メソッドの引数にSensorEventというセンサーのイベント情報を管理するオブジェクトが渡されます。このsensorフィールドの「getType」メソッドにより、センサーの種類がわかります。

この値が、Sensor.TYPE_ACCELEROMETERであったなら、加速度センサーのイベントが発生したことがわかります。

7.センサーの値を取り出す
result = "Gx: " + String.valueOf(event.values[0]) + "\n";
result += "Gy: " + String.valueOf(event.values[1]) + "\n";
result += "Gz: " + String.valueOf(event.values[2]);
センサーの値は、eventインスタンスの「values」に配列としてまとめられています。加速度センサーでは、X、Y、Zの各軸方向の値がまとめられていますので、それぞれ取り出してテキストにまとめています。

後は、TextViewに値を設定して終わり!というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano;

import java.util.List;

import android.app.Activity;
import android.hardware.*;
import android.os.Bundle;
import android.widget.TextView;

public class SampleApp extends Activity
		implements SensorEventListener {
	private SensorManager manager;
	private TextView text1;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		text1 = (TextView)this.findViewById(R.id.text);
		manager = (SensorManager)getSystemService(SENSOR_SERVICE);
		List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_ACCELEROMETER);
		if (sensors.size() > 0) {
			Sensor sensor = sensors.get(0);
			manager.registerListener(this, sensor,
					SensorManager.SENSOR_DELAY_FASTEST);
		}
	}

	@Override
	public void onAccuracyChanged(Sensor arg0, int arg1) {}

	@Override
	public void onSensorChanged(SensorEvent event) {
		String result = "";
		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
			result = "Gx: " + String.valueOf(event.values[0]) + "\n";
			result += "Gy: " + String.valueOf(event.values[1]) + "\n";
			result += "Gz: " + String.valueOf(event.values[2]);
		}
		text1.setText(result);
	}

}

※関連コンテンツ

「Google androidプログラミング入門」に戻る