連載
» 2011年06月07日 00時00分 公開

App InventorでAndroidのセンサを操作するにはApp Inventorでアプリ開発はどこまでできるのか(3)(2/3 ページ)

[多田 丈晃,株式会社ビーブレイクシステムズ]

ロケーションセンサでのApp InventorとJavaの違い

 ロケーションセンサはGPSやケータイの基地局などを利用して現在位置を取得するものです。

イベント

 ロケーションセンサが感知できるイベントの違いを見ていきましょう。なお、Javaのロケーションセンサで扱えるイベントが定義されているのは「android.hardware.LocationListener」インターフェイスです。

イベント App Inventor上のイベント名 Java上のイベント名
現在位置の変化時 LocationChanged onLocationChanged
プロバイダがユ−ザ−によって使用不可にされたとき onProviderDisabled
プロバイダがユ−ザ−によって使用可能にされたとき onProviderEnabled
センサの状態変化時 StatusChanged onStatusChanged

 ロケーションセンサで扱えるイベントのApp InventorとJavaのSDKとの違いは、Java側にあってApp Inventor側にはない「onProviderDisabled」と「onProviderEnabled」の存在です。これらはロケーションセンサの使用目的と直接関係のないイベントで、アプリを動かすケータイの状況によって動作を制御し、無駄な動作を減らすためなど細かな制御を行うために存在します。

 App Inventorでは、ロケーションセンサの利用目的に直接関係しないこれらのイベントは取り扱うことはできません。

プロパティ

 次に、プロパティの違いを見ます。App InventorとJavaのSDKで扱えるプロパティの一覧を以下に示します。なお、JavaのSDKでロケーションセンサのプロパティを持つのは「android.hardware.Location」クラスです。

プロパティ App Inventorでの部品名 Javaでのプロパティ参照メソッド 内容
Accuracy Accuracy getAccuracy 精度を表す
Altitude Altitude getAltitude 標高を表す
Bearing なし getBearing 東経の絶対値を表す
CurrentAddress CurrentAddress なし 現在位置の住所を表す
Enabled Enabled なし(※注1) ロケ−ションセンサが有効かどうかを表す
Extras なし getExtras 追加情報を表す
Latitude Latitude getLatitude 緯度を表す
Longitude Longitude getLongitude 経度を表す
Provider AvailableProviders ProviderLocked ProviderName getProvider ロケ−ションを取得するセンサに関する情報の取得
Speed なし getSpeed 秒間何m進んだかのスピ−ドを表す
Time なし getTime エポックタイム(※注2)からのミリ秒を表す

※注1:「android.hardware.LocationManager」クラスにはプロバイダが有効かどうかの値を持つ
※注2:エポックタイムは1970年1月1日

 この表を見ると、App Inventorで扱えないプロパティが分かると思います。「Bearing」「Extras」「Speed」「Time」が扱えないのですが、そのうち「Extras」はロケーションセンサで必要な主だった値ではないので省略されているようです。「Time」についても細かい制御を行わなければ不要なので、省略されています。

 残った「Bearing」「Speed」は、App Inventorのロケーションセンサには存在しませんが、後述する方向センサには存在するので必要なら、そちらを利用するのがいいでしょう。

方向センサでのApp InventorとJavaのSDKの違い

 方向センサはケータイの傾きや回転に関する情報を取得するものです。

イベント

 方向センサが感知できるイベントの違いを見ていきましょう。なお、Javaの方向センサのイベントは先に説明した加速度センサと同じイベントになります。これは、「SensorEventListener」というロケーションセンサ以外のセンサ共通のインターフェイスを使うためです。

イベント App Inventor上のイベント名 Java上のイベント名
センサの変化時 OrientationChanged onSensorChanged
センサの精度変化時 onAccuracyChanged

 Java側の方向センサに関するイベントは加速度センサと同じ「SensorEventListener」インターフェイスを使用しているため、加速度センサのイベントと同じ内容です。

 なお、方向センサでも精度変化時のイベントを扱えません。方向センサはイベントよりもプロパティに特徴があります。

プロパティ

 App Inventorのロケーションセンサで取れるプロパティを見てみましょう。なお、Javaの方向センサの値はとり方が少し他のセンサと異なり「android.hardware.SensorManager」クラスの「getOrientation」メソッドで取得します。センサの値はfloat型の配列で取得します。

 以下に配列の要素番号とその内容を挙げます。

プロパティ App Inventorの部品名 Javaのプロパティに当たる配列の要素番号 内容
Available Available 動かしているケ−タイでハ−ドウェア的に方位センサが使えるかを表す
Enabled Enabled 方位センサが使用可能かどうかを表す
Yaw Yaw 0 方位の角度を表す(Z軸に対応)
Pitch Pitch 1 水平方向の角度を表す(X軸に対応)
Roll Roll 2 垂直方向の角度を表す(Y軸に対応)
Magnitude Magnitude どの程度回転されたかを表し、その度合いを0.0〜1.0の間の値を持つ(回転の勢いを表す)
Angle Angle Ptichの0.0度を基準とした3次元の角度の絶対値0.0〜359.9……の値を持つ
ALT 図3 「android.hardware.SensorManager」クラスのドキュメントにあるケータイに対する各軸の図

 また、「getOrientation」メソッドのドキュメントにある図3とともに見ると分かりやすいと思います。

 方向センサに関しては、App Inventorで扱うプロパティの方がJavaより多いです。App Inventorの「Available」「Enabled」に当たるプロパティは「SensorManager」クラスで別途取得できます。また、「Magnitude」は厳密には対応していませんが、似たところではロケーションセンサで取得できるプロパティ「Speed」で代用可能です。「Angle」についてもロケーションセンサで取得できるプロパティ「Bearing」で代用できます。

 こうしてセンサのイベントとプロパティを見ると細かい制御、例えば消費電力を抑えるための工夫を凝らすようなことがApp Inventorではできないことを除けばJavaと同様のことができると言えます。

App InventorでAndroidセンサアプリを作ってみよう

 App Inventorが持つセンサ機能に関して一通り理解したところで、次は実際にセンサを使ったアプリを作りましょう。

 今回はロケーションセンサを使ったアプリ作りを説明します。このアプリはApp Inventorの公式サイトにある「Where is my car」というチュートリアルの内容を日本語化したものです。

 アプリの内容はロケーションセンサでケータイの位置を記憶し、別の場所に移動した後に記憶した場所がどの方向にあるかを示すものです。なお、ロケーションセンサはエミュレータでは動作しません。動作の確認はAndroidケータイで行ってください。

デザイナで部品を並べる

 アプリの作成に入る前に、センサ以外にデザイナ上で新しい部品を使用するので、以下に簡単に説明します。

グル−プ 部品名 内容
Screen Arrangement HorizontalArrangement 水平方向のレイアウト部品。この中に配置した部品は横に並ぶ
Other staff ActivityStarter 指定したクラスの別アクティビティ(アプリ)を起動できる
Basic TinyDB アプリを終了させても残るデ−タを持つことができる部品。デ−タはキ−とバリュ−の対で記憶される

 今までのように部品ごとに、どこを開いて何を置くのかを説明する必要はもうないと思います。必要な部品を図と部品の一覧表を提示するので、それに倣って組み立てていきましょう。

ALT 図4 デザイナの完成状態(画像をクリックすると、拡大します)

 以下が部品の一覧です。上から順に部品を置けばできるようにしています。変更が必要なプロパティも表にしておきますので、プロパティも変更してください。

グル−プ 部品名 Component上の部品名 プロパティ名 プロパティ値
Screen Screen1 Title 私の車はどこですか?
Basic Label CurrentHeaderLabel FontBold ON
Text あなたの現在位置
Screen Arrangement HorizontalArrangement HorizontalArrangement1
Screen Arrangement HorizontalArrangement HorizontalArrangement2
Basic Button RememberButton Text 現在位置を記憶
Enabled OFF
Basic Label RememberedHeaderLabel FontBold ON
Text 記憶した位置
Screen Arrangement HorizontalArrangement HorizontalArrangement3
Screen Arrangement HorizontalArrangement HorizontalArrangement4
Basic Button DirectionsButton Text 現在位置から記憶した位置の方向を表示
Enabled OFF
Sensors LocationSensor LocationSensor1
Basic TinyDB TinyDB1
Other Staff ActivityStarter ActivityStarter1 Action android.intent.action.VIEW
ActivityClass com.google.android.maps.MapsActivity
ActivityPackage com.google.android.apps.maps
HorizontalArrangement1の中
Basic Label CurrentAddressLabel Text Address:
Basic Label CurrentAddressDataLabel Text 値は空にしておく
HorizontalArrangement2の中
Basic Label GPSLabel Text GPS:
Basic Label CurrentLatLabel Text 0.0
Basic Label CommaLabel Text ,(カンマ)
Basic Label CurrentLongLabel Text 0.0
HorizontalArrangement3の中
Basic Label RememberedAddressLabel Text Address:
Basic Label RememberedAddressDataLabel Text 空にする
HorizontalArrangement4の中
Basic Label RememberedGPSLabel Text GPS:
Basic Label RememberedLatLabel Text 0.0
Basic Label Comma2Label Text ,(カンマ)
Basic Label RememberedLongLabel Text 0.0

編集部より、おわびと訂正(2015年4月27日)

上記表について部品の名称が間違っていましたので、下記のように訂正しました。

  • 下から3行目の「RememberedCurrentLatLabel」→正しくは「RememberedLatLabel」
  • 最後の行の「RememberedCurrentLongLabel」→正しくは「RememberedLongLabel」

記事の内容に正確を期せず、申訳ありませんでした。訂正して、おわび申し上げます。


 これでデザイナでの画面の作成は終わりです。次ページでは続いて、ブロックエディタでアプリに動きを付けていきましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。