連載
» 2010年04月07日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(16):地図/位置情報/GPSを使うAndroidアプリを作るには (2/3)

[緒方聡,株式会社イーフロー]

Android Mapsを使った地図の表示

 まずは、地図を表示してみましょう。Android Mapsを使用するうえで必要な手順は、以下の通りです。

ADTのProject Build TargetをGoogle APIsにする

 Android MapsはGoogleの拡張APIなので、ターゲットはGoogle APIsに設定する必要があります。

図2 Project Build Target 図2 Project Build Target

 今回は、最新のAndroid 2.1を使用していますが、Android MapsはAPI Level 4なので、少なくともAndroid 1.6以上を指定する必要があります

AndroidManifest.xmlの設定

 AndroidManifest.xmlには以下、4つの設定が必要です。

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
  <application ...>
    <uses-library android:name="com.google.android.maps" /><!-- 【1】 -->
  </application>
  <uses-permission android:name="android.permission.INTERNET" /><!-- 【2】 -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!-- 【3】 -->
  <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/><!-- 【4】 -->
</manifest>
  1. Android Mapsのライブラリを使用する宣言
  2. インターネットアクセスを行うパーミッション
  3. 実機でロケーションサービスを使用するためのパーミッション
  4. エミュレータでロケーション(位置情報)サービスを使用するためのパーミッション

 上記の【3】【4】は、厳密にはAndroid Mapsではなく、今回Android Mapsと組み合わせて使用したロケーションサービスのための設定ですが、組み合わせて使用することが多いと思いますので、紹介しておきます。

Android Maps API Keyの埋め込み

 あらかじめ取得しておいたAndroid Maps API Keyをアプリに埋め込みます。今回は複数のActivityで使いまわすので、strings.xmlに埋め込んであります。

MapActivityを継承

 Android Mapsを使用するためには通常のActivityではなくMapActivityクラスを継承する必要があります。

 MapActivityは抽象メソッドが1つ定義されていて、それを実装しなければなりません。

メソッド 処理概要
abstract boolean isRouteDisplayed() ルート情報を表示しているならtrueを返す
boolean isLocationDisplayed() 位置情報を表示しているならtrueを返す
表2 MapActivityのメソッド

 上記表はMapActivityに定義されているメソッドです。1つは抽象メソッドなので、必ず実装しなければなりません。ルート情報の詳細について調べてみましたが、Javadocの以下の説明以上の情報がありません。

For accounting purposes, the server needs to know whether or not you are currently displaying any kind of route information, such as a set of driving directions. Subclasses must implement this method to truthfully report this information, or be in violation of our terms of use. TODO: provide link

 ルート情報は例えば走行方向などなのですが、Android Mapsには走行方向が分かる機能が用意されているわけではなく、こうしたルート情報は自前で実装し、それを表示しているかどうかを返す、ということのようです。後述する「Google Maps Navigation」向けの機能のようにも思えます。

 説明の最後のTODOで「リンクを貼る」と書かれているので、Javadocが更新されれば詳細が分かるかもしれません。

 位置情報は、後述するMyLocationOverlayを使用して表示する場合は、自動的に適切な値が返されるように実装されていますが、独自の位置情報表示を行っている場合、メソッドをオーバーライドして適切な値を返す必要があります。

MapViewの作成

 MapViewの作成方法は、XMLでレイアウトを定義する方法と、Javaでコーディングする方法があります。

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:apiKey="@string/map_key" />
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map);
}

 上記はレイアウトをXMLで定義し、Javaからレイアウトを読み出す方法です。

 以下はJavaでコーディングを行う例です。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MapView mapView = new MapView(this,
        getResources().getString(R.string.map_key));
    setContentView(mapView);
}

 今回のほとんどのサンプルは簡単のためJavaでコーディングを行う方法を採用しています。

 実行すると、以下のように地図が表示されます。

図3 地図の表示 図3 地図の表示

地図のさまざまな設定/表示と操作

 Android Mapsには、簡単で効果的な設定がいくつか存在します。

交通量表示
ストリートビュー表示
衛星写真切り替え

図4 左より交通量表示、ストリートビュー表示、衛星写真切り替え


メソッド 説明
setTraffic(boolean)/isTraffic() 交通量を表示/表示しているかどうかを取得
setStreetView(boolean)/isStreetView() ストリートビューを表示/表示しているかどうかを取得
setSatellite(boolean)/isSatellite() 衛星写真で表示/表示しているかどうかを取得
表3 MapViewの表示切り替えメソッド

 これらのメソッドで注意しなければならない点は、以下の4つです。

  1. 交通量は米国でしか機能しない。上記はサンフランシスコ周辺ですが、日本などに座標を移動すると、何も表示されない
  2. 交通量とストリートビューを同時に表示できない
  3. ストリートビューは、カバーしている範囲が表示されるだけで、ストリートビューそのものが利用できるわけではない
  4. 衛星写真でも交通量やストリートビューを表示可能

 交通量は、時間帯を変えて表示し直すと、情報が変化しているため、リアルタイム性を持っていることが分かります。

図3 地図の表示 図5 交通量の変化
図3 地図の表示


 表示色についての説明は特にありませんが、緑が少なく、赤が多いと見てよいと思います。現在は米国に限定され、交通量情報は主要なルートに限定されるようですが、これはとても便利なサービスです。

コントローラで地図を自由自在に操作しよう

 Android Mapsでは、「MapController」という便利なクラスが提供されています。

MapControllerを使用したアニメーション

 地図の拡大・縮小、特定の座標へ移動、特定のピクセル座標へのスクロール、キーイベントの取得などが主な機能です。上動画では拡大・縮小と特定座標への移動を行っています。

 それでは、次ページより地図上にマーカーを指定したり、GPSで自身の位置情報を取得したりする方法を詳しく見ていきましょう。

コラム 「Androidベースのカーナビは、すでにある」

Android Mapsにこれだけの機能があれば、カーナビゲーションシステムが作れるのではないか、と想像するのは難しくありませんが、すでにグーグルが「Google Maps Navigation (Beta)」を提供しています。

このGoogle Maps Navigation (Beta)は音声ガイド音声サーチリアルタイム渋滞情報ルート探索など、カーナビに必要な機能は一通り備えています。そのほか、実際のストリートビューによる表示が利用可能です。


交通量表示
ストリートビュー表示
衛星写真切り替え

図6 「Google Maps Navigation (Beta)」の画面(左よりストリートビュー、周辺情報、サテライトビュー)


このカーナビのダウンロードとサービスの利用は無料です。さすがはグーグル、というべきでしょう。

現在はβ版で、米国のみのサービスですが、日本やそのほかの国でも普及していくであろうと筆者は考えています。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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