App InventorでAndroidのセンサを操作するには:App Inventorでアプリ開発はどこまでできるのか(3)(2/3 ページ)
プログラミング未経験でも手軽にAndroidアプリが作れるApp Inventor。本連載では、App Inventorでアプリを作り、使用しているコンポーネントに関して実際にJavaのAPIと比較して、できることを検証していきます。
ロケーションセンサでの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……の値を持つ |
また、「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 | アプリを終了させても残るデ−タを持つことができる部品。デ−タはキ−とバリュ−の対で記憶される |
今までのように部品ごとに、どこを開いて何を置くのかを説明する必要はもうないと思います。必要な部品を図と部品の一覧表を提示するので、それに倣って組み立てていきましょう。
以下が部品の一覧です。上から順に部品を置けばできるようにしています。変更が必要なプロパティも表にしておきますので、プロパティも変更してください。
グル−プ | 部品名 | 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.