ユーザーID パスワード

技術情報

  • FAQ よくある質問
  • 個人ユーザー向けサービスのお手続きについて
  • M2Mソリューション
  • (PR)FAQを利用してお問い合わせコスト削減

コード&コラム

第8回
センサーを使ってみよう(後編)


前へ 1 |2 |3 |4 次へ

Step1 プロジェクトの作成とセンサーの利用

方位磁針の設計として、画面の真ん中に大きな矢印があり、常に矢印が北側を向くアプリを作成していきます。

まずは[ファイル]→[新規]→[Androidプロジェクト]より新規プロジェクトを作成しましょう。 ターゲットやプロパティーは次のように設定します。

プロジェクト名 CompassApp
ビルド・ターゲット Android2.2
アプリケーション名 CompassApp
パッケージ名 com.example.compassapp
アクティビティーの作成 CameraApp
最小SDKバージョン 8

img

細かい指定は画像を参考にしてください。


今回は「CompassApp」に加えて「CompassView」というクラスを作成し、2つのクラスでアプリを構成します。前者にはセンサーの中核的なコードを、後者には矢印を描くコードを加えていきます。

それでは「ComassView」クラスを作成します。
[ファイル]→[新規]→[クラス]より「新規Javaクラス」ダイアログを立ち上げます。名前を「CompassView」、修飾子は「public」として「完了」を押しましょう。これで[src]→[com.example.compassapp]内に「CameraView.java」というファイルが生成されます。


img

CompassView.javaは上記のように設定します。


まずは「CompassApp」を編集していきましょう。センサーを利用するためには、始めに センサーマネージャを使用します。その後、 List<Sensor>を利用してセンサーマネージャより端末に搭載されているセンサーを取得します。

今回は 方位センサーを利用するため引数に「Sensor.TYPE_ORIENTATION」を設定します。(ここではlistというオブジェクト名をつけています)
orientationというのはセンサーのオブジェクトで、今後センサーの処理を始めたり、止めたりする際に指定するオブジェクトです。

画面表示を指定するsetContentViewは、compassViewとオブジェクト名をつけた後に指定します。

public class CompassApp extends Activity {

	private SensorManager sensorManager;
	private Sensor orientation;

	@Override
	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);

    	sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    	List<Sensor>list;
    	list = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
    	orientation = list.get(0);

		  compassView = new CompassView(this);
		  setContentView(compassView);s
    	}
}

次に、アクティビティのサイクルにもあった「onCreate()」の次の処理である「onStart()」、「onResume()」、「onStop()」という流れを一気に書き加えたいと思います。

センサーの利用には、「SensorEventsListener」の実装が必要です。まずはその旨を書き加えます。するとクイックフィックス(赤い波下線)より「onAccuracyChanged()」と「onSensorChanged()」というメソッドが自動生成されますが、これについては後で説明します。

続いて、「onResume()」にてセンサー処理を開始させます。そのためには以下のように 「registerListener」メソッドを利用します。

registerListener(SensorEventListener listener, Sensor sensor, Rate rate);

第1引数であるlistenerには「this」と指定します。 第2引数には開始するセンサーのオブジェクトを指定します。今回は「orientation」というオブジェクト名をつけたのでそれを指定しています。

最後の第3引数ですが、これには情報通知頻度を設定する値が入ります。速度が早い順に最高速〜UI速度(ユーザーインターフェースに適している速度)と用意されています。
今回はこの中で通常速度の定数、「SENSOR_DELAY_NORMAL」を指定します。

SensorManager.SENSOR_DELAY_FASTEST 最高速
SensorManager.SENSOR_DELAY_GAME ゲーム速度
SensorManager.SENSOR_DELAY_NORMAL 通常速度
SensorManager.SENSOR_DELAY_UI UI速度

下記のコードで ifにてorientationオブジェクトの値の有無を確かめているのはオブジェクトの指定なしに処理が進まないようにする為です。

最後の「onStop()」では、センサー処理の停止を記述します。以下のように「unregisterListener()」メソッドを利用します。

unregisterListener(SensorEventListener listener);

センサー処理の開始でオブジェクトや速度を指定するのとは違って、停止させるListenerを指定するだけです。

上記の作業を加えたコードは、以下のようになります。

public class CompassApp extends Activity implements SensorEventListener {

	private SensorManager sensorManager;
	private Sensor orientation;

	@Override
	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);

    	sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		List list;
		list = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
		orientation = list.get(0);

		setContentView(R.layout.main);
	}

	@Override
	public void onStart() {
		super.onStart();
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (orientation != null) {
			sensorManager.registerListener(this, orientation,
				SensorManager.SENSOR_DELAY_NORMAL);
		}
	}

	@Override
	public void onStop() {
		super.onStop();
		sensorManager.unregisterListener(this);
	}

	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}
	public void onSensorChanged(SensorEvent event) {
	}
}

CompassApp.javaの編集も、あと少しです。「SensorEventListener」を先ほど実装した際に、「onAccuracyChanged()」と「onSensorChanged()」というメソッドが自動生成されました。これについて記述を加えます。

まず「onAccuracyChanged()」ですが、センサー精度の変更を行うときに利用するメソッドです。必要なメソッドなのですが、精度を変更する必要はないのでこれについては、何も記述しなくて大丈夫です。 続いて「onSensorChanged()」です。これはセンサーの値が変わったときに呼び出されるメソッドです。今回利用する傾きセンサーには、「0:方位」、「1:ロール」、「2:ヨー」の配列で格納されている0から始まる3つの値が格納されています。(ロール・ヨーに関しては今回は利用しませんので詳しくは解説しませんが、進行方向に対して正面から左右に回転する軸をロール軸、上から俯瞰で見て地面と並行に回転する軸をヨー軸と言います。)

これについては、Android SDKに入っている「API Demos」の中の[OS]→[Sensors]という項目を試すことで実感できると思います。


img

センサーを利用するときに参考になるデモです。


ここで、センサーの値の「0:方位」を新しく作成した配列sensorValuesのsensorValues[0]に代入しています。「1:ロール」、「2:ヨー」も、利用はしませんが代入しています。その後、代入した値を画面表示を担当する 「CompassView.java」のdrawScreenメソッドに渡します。これについてはStep3で詳しく説明します。

以上でCompassApp.javaの編集は終了です。最終的なコードは以下のようになります。

public class CompassApp extends Activity implements SensorEventListener {

	private SensorManager sensorManager;
	private Sensor orientation;
	private float[] sensorValues = new float[3];
	private CompassView compassView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		compassView = new CompassView(this);

		sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		List list;
		list = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
		orientation = list.get(0);

		compassView = new CompassView(this);
		setContentView(compassView);
	}

	@Override
	public void onStart() {
		super.onStart();
	}

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

		if (orientation != null) {
			sensorManager.registerListener(this, orientation,
					SensorManager.SENSOR_DELAY_NORMAL);
		}
	}

	@Override
	public void onStop() {
		super.onStop();

		sensorManager.unregisterListener(this);
	}

	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	public void onSensorChanged(SensorEvent event) {
		if (event.sensor == orientation) {
			sensorValues[0] = (event.values[0]);
			sensorValues[1] = (event.values[1]);
			sensorValues[2] = (event.values[2]);
			compassView.drawScreen(sensorValues);
		}
	}

}

第8回 センサーを使ってみよう(後編)
 Step1 プロジェクトの作成とセンサーの利用
 Step2 矢印の作成と値の受け渡し
 Step3 実際に起動してみましょう

サンプルコード

第1回 リファレンスコード(文字列編)

第2回 リファレンスコード2(グラフィックス編)

第3回 リファレンスコード3(タッチイベント編)

第4回 リファレンスコード4(チェックボックス/ラジオグループ編)

第5回 リファレンスコード5(スピナー編)

第6回 リファレンスコード6(サウンド/ムービー編)

第7回 リファレンスコード7(トースト編)

第8回 リファレンスコード8(Google Maps API利用編)

第9回 リファレンスコード9(SQLite編)

第10回 リファレンスコード10(音声認識編)

第11回 リファレンスコード11(日付/時刻ダイアログ編)

第12回 リファレンスコード12(Bluetooth編)