My Photo

« 上越線の被害はかなり大きい | Main | Androidアプリ開発メモ010:プリファレンス、ファイルアクセス »

August 05, 2011

Androidアプリ開発メモ009:Google Mapsの利用

2011/09/28更新
2011/09/29追記
2012/06/03追記

GoogleMapsの利用の準備

Google Maps APIキーを取得して、レイアウトファイルを使用する場合はレイアウトファイルに記述する。レイアウトファイルを使用しない場合はソースコード中でMapViewのコンストラクタに引数でAPIキーを渡す。
Gogole Mapsライブラリは外部ライブラリなのでAndroidManifest.xmlにインターネット接続の許可に加え、下記のようにapplication要素の子要素としてGogole Mapsライブラリの使用宣言をする必要がある。

<uses-library android:name="com.google.android.maps" />

Google Mapsライブラリのパッケージは com.google.android.maps
Google MapsライブラリのAPIリファレンスは
<android sdkのフォルダ>/add-ons/addon-google_apis-google_inc_-<APIバージョン>/doc/reference
にある。

MapView

GoogleMapを表示するView。

public GeoPoint getMapCenter()
地図の中央の位置をGeoPointで返す。

GeoPointは緯度・経度を10の6乗した整数のペアを持つ。例えば東京駅あたりを示すGeoPointのインスタンスは(35681381,139766083)を持つ。

public void setBuiltInZoomControls(boolean on)
on:trueの場合、地図の拡大・縮小ができるようになる。
public MapController getController()
MapControllerを取得する。

MapControllerについては後述。

MapActivity

MapViewを利用する場合、アクティビティはActivityではなくMapActivityを拡張して実装する。

protected abstract boolean isRouteDisplayed()
経路情報を表示しているかどうかを示す。とりあえずfalseを返すように実装しておけばいい?

位置情報取得の準備

アプリが位置情報を得ることができるようにするには、AndroidManifest.xmlのmanifest要素の子要素に以下を追加する。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

1行目は無線ネットーワークの基地局から大まかな位置情報の取得を許可する。
2行目はGPSからの位置情報の取得を許可する。

MapController

地図を移動したり縮尺を変更したりする機能を持つクラス。

public int setZoom(int zoomLevel)
zoomLevel:1~21で、1つ数字が大きくなるごとに2倍拡大。
ズームレベルを指定する。

下記はWVGAのAVDにおいてズームレベル9,11,13,15に設定したときのMapViewの表示。
Zoom09_2 Zoom11_2 Zoom13_2 Zoom15_2

public void setCenter(GeoPoint point)
地図を指定した場所に移動する。
public void animateTo(GeoPoint point)
地図を指定した場所にアニメーションする。
public boolean zoomIn()
1段階ズームインする。
public boolean zoomOut()
1段階ズームアウトする。

MyLocationOverlay

現在位置を地図に表示するためのクラス。
MapViewとContextを渡して生成する。

public boolean enableMyLocation()
GPSから現在位置を取得できるようにする。
戻り値:成功した場合true。
public boolean enableCompass()
コンパスからの情報を取得できるようにする。
戻り値:成功した場合true。
public boolean runOnFirstFix(java.lang.Runnable runnable)
位置情報が更新されたときに呼び出されるRunnableのインスタンスを設定する。

以下のように位置情報更新時の処理を実装する(thisはMapActivityのサブクラス)。

// オーバーレイの生成
MyLocationOverlay overlay = new MyLocationOverlay(this, mapView);

// オーバーレイにRunnableオブジェクトを設定する
overlay.runOnFirstFix(new Runnable() {
  public void run() {
    // ここに位置情報更新時の処理を記述
  }
});

LocationManger

Google MapsライブラリではなくAndroid SDKの標準ライブラリのクラス。パッケージはandroid.location。
ロケーションマネージャを使用すれば位置情報の提供元(Provider)、取得間隔を指定して、現在位置が更新された際の処理を指定できる。
LocationManager や LocationListener は位置情報を扱うクラスであるが地図と直接関係はない。現在位置が変わったときに地図に関する処理を行わず位置情報を保存したり、位置情報から何かを計算するといったことできる。もちろん、リスナー内でGoogle MapsのAPIで地図に関する処理を呼ぶこともできるが、それはGoogle Mapsの機能であって LocationManager や LocationListener の機能ではない。

public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
名づけられたプロバイダによって定期的に通知されるカレントアクティビティを通知する(?)。なんのこっちゃ?
ようは位置情報通知の開始。
provider:位置情報の提供元(電波とかGPSとか)
minTime:通知のための最小時間間隔。最低限これくらいの間隔を空けて位置情報を更新しますよ、ということ。
minDistance:通知のための最小距離間隔。ここで指定した値動いたら位置情報を通知されますよ、ということ。
listener:位置情報リスナー

minTimeとminDistanceは大きい値を設定すればバッテリーの節約になるかもしれない。minTimeが十分長ければ位置情報取得から次取得までの間GPSがOFFになるとか。しかし必ずしも設定どおりに動く訳ではないようだ。頻繁に位置情報を更新したければどちらも0を設定すればよい。

public void removeUpdates(LocationListener listener)
どんなカレントの登録も削除する、カレントアクティビティの位置情報更新のための、与えられた位置情報リスナによる。
ようは位置情報通知を停止する。

LocationListenerのメソッド。

public void onLocationChanged(Location location)
位置変更時に呼ばれる。

public void onProviderEnabled(String provider)
ユーザによってプロバイダがenableにされた時に呼ばれる。

public void onProviderDisabled(String provider)
ユーザによってプロバイダがdisableにされた時に呼ばれる。

public void onStatusChanged(String provider, int status, Bundle extras)
プロバイダのステータスが変わったときに呼ばれる。

実装

protected void onStart() {
  super.onStart();
  
  // ロケーションマネージャの設定
  locationManger = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
  locationManger.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); // GPSの場合
  //locationManger.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); // 網の場合
}

protected void onStop() {
  super.onStop();
  
  // ロケーションマネージャの設定
  locationManger.removeUpdates(this);
}

public void onLocationChanged(Location location) {
  Log.v("TEST", "onLocationChanged() called.");
  // 緯度と経度の取得
  GeoPoint pos = new GeoPoint(
      (int)(location.getLatitude() * 1E6),
      (int)(location.getLongitude() * 1E6));
  mapCtrl.setCenter(pos);
}

public void onProviderEnabled(String provider) {
}

public void onProviderDisabled(String provider) {
}

public void onStatusChanged(String provider, int status, Bundle extras) {
}

参考ページ:
com.google.android.mapsパッケージのAPIリファレンスの在り処 | mucchinのAndroid戦記
地図アプリの作成-Android版その2 | SpiriteK Blog

« 上越線の被害はかなり大きい | Main | Androidアプリ開発メモ010:プリファレンス、ファイルアクセス »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/52400967

Listed below are links to weblogs that reference Androidアプリ開発メモ009:Google Mapsの利用:

« 上越線の被害はかなり大きい | Main | Androidアプリ開発メモ010:プリファレンス、ファイルアクセス »

September 2017
Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof