Android SDKには、Androidプラットフォームにおいて位置情報ベースのサービスを構築するためのandroid.location、com.google.android.mapsというパッケージが含まれています。現時点のSDK全体にいえることですが、これらはあくまでも暫定のものであるため、後々のSDKでは機能やドキュメントに変更が加わる可能性もあります。しかし『早めのリリース、しょっちゅうリリース』の精神から、これらのAPIを公開しフィードバックを受けるようにしています。以下に、各パッケージについての簡単な説明と既知の問題点を示します。
android.locationパッケージはAndroidプラットフォームにおける位置情報サービスに関連するいくつかのクラスをまとめたものです。これには、デバイス側がサポートする場合に位置・方角情報を取得するためのサービスであるLocationManagerシステムサービスが含まれています。LocationManagerを直接インスタンス化すべきではなく、Context.getSystemService(Context.LOCATION_SERVICE).を呼び出すことでLocationManagerへのハンドラを取得して利用すべきです。
LocationManagerへのハンドラが取得できたら、以下のようなことを行えます
以下のようにしてテスト用途のLocationProviderモックを作成することが出来ます。これらのLocationProvider群は同名の実際のLocationProvider情報をオーバーライドします。[※2]
ダミーLocationProvider情報は以下のディレクトリ内に作成する必要があります。/data/misc/location/<プロバイダ名 >
ダミーのLocationProviderは上記のディレクトリ内で以下の順でファイルを検索します。
GPSプロバイダのモックはエミュレータの/data/misc/location/gps/内にあります。
classファイルが存在すれば、そのファイル内1行目に書かれている名前のクラスがプロバイダとしてインスタンス化されます。
kmlファイルが存在する場合は、そのファイル内の<coordinates>タグ群が処理されます。<coodinates>タグ内は以下のようになります。
<longitude>,<latitude>,<altitude> <longitude>,<latitude>,<altitude> <longitude>,<latitude>,<altitude> <longitude>,<latitude>,<altitude>
タグ群はルートを構成するようにつなげられます。ルート上を移動する速度は後述するpropertiesファイルにより制御出来ます。
KMLファイルを作成する簡単な方法は、Google Earth内を利用するというものです。Google Earth内のルートで最後に表示される”Route”エントリを右クリックし、”Save as…”メニューから”Save as type:”を選択し、出力タイプをKml(*.kml)に指定することでkmlファイルでの出力が可能です。
kmlファイルが見つからなかった場合は、nmeaファイルが検索され、存在した場合はNMEA 0183コードとして解釈されます。現時点では$GPRMC構文のみが完全にサポートされています(ほとんどのGPSユニットがこれをサポートしているはずです)。NMEAファイル内で最初のタイムスタンプは基準時刻として使われ、ファイル解釈時から各エントリ間の相対時間を求めるためのデルタ値計算に使われます。 [※3]
kmlファイルもnmeaファイルも無く、trackファイルが存在する場合、trackファイルは以下の構文で解釈されます。
<time> <longitude> <latitude> <altitude>あるいは
<time> <longitude> <latitude> <altitude> <bearing> <speed>
timeは0から始める必要があり、これはファイル解釈実行時からの相対時間として変換されます。bearingは存在すれば北から時計回りの角度として解釈されます。またspeedは、存在する場合は速度をメートル/秒単位で表すものとします。
kml、nmea、trackファイルに加え、LocationProviderにはpropertiesファイルを用いてパラメータを与えることが出来ます。propertiesファイルの各行はキーと任意指定の値を持ちます。値が省略された場合はboolean値についてはtrueが、整数値については0が指定されたものと解釈されます。指定可能なキー/値は以下の通りです。
altitude、speedとbearingのそれぞれの値[※4] はpropertiesファイル内でhasAltitude、hasBearing、hasSpeedのそれぞれがtrueに設定されている場合のみLocationProviderから取得可能です。
デフォルトで現状のLocationManagerは”gps”というサンフランシスコ湾岸エリアの2点間移動をシミュレートする単一のLocationProviderのみを提供します。
com.google.android.mapsはGoogle Maps上にレンダリングを行ったりしたり、制御をかけたり、その他の情報をオーバーレイしたりするための様々なクラスを提供するパッケージです。アプリケーション内でMapViewを表示したい場合はMapViewを含むアクティビティ自体をMapActivityのサブクラスとする必要があります。
MapViewの作成後は、MapView自体の制御したければgetController()を利用、MapView上に追加情報をオーバーレイしたければgetOverlayController()を利用する、という具合で処理を記述することになります。
MapViewに関する詳細と、MapViewとMapActivity[※5] との違いについてはGoogle APIs and Servicesページをご参照下さい。