サンプルページ3(GPSから緯度経度を知る)

13. Map の利用
Android 端末では Google マップを利用したアプリケーションが構築可能です。もち
ろん GPS も搭載していますから、現在の場所、目的地への案内なども可能です。こ
のようなサービスをロケーション・ベースのサービス(LBS)と呼びます。Google マ
ップのズームや移動もプログラムから可能です。
13.1. GPS から緯度経度を知る
次のサンプルは GPS から緯度、経度を読み取って表示するものです。
① 精度をよくするパーミッション
② テストのためのパーミッション
★AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myandroid">
<application android:icon="@drawable/icon">
<activity android:name=".Map1" android:label="My Map Activity1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>・・①
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>・・②
</manifest>
★res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/myTextView"
275
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
Map1.java のポイントは次のとおりです。
① 緯度、経度を入手し、結果を表示します。
② ロケーションサービスを利用できるようにします。
③ ロケーションプロバイダーを取得します。true を渡すと現在利用可能なプロバイ
ダーだけを返します。このサンプルでは GPS だけが返されます。
④ 後で使用するリスナーです。onLocationChanged()メソッドだけ実装し、情報に
変化があったら表示を更新するようにします。
⑤ ロケーションのリクエストを出します。メソッドは次のとおり。
public void requestLocationUpdates(String provider, long minTime, float minDistance,
LocationListener listener)
provider:プロバイダー名
minTime:notification の最小時間間隔、ミリ秒単位。これは大体の目安で実際は更
新間隔は前後する
minDistance:notification の最小距離、メートル単位。
listener:位置が変化したときに、そのリスナーの onLocationChanged(Location)が
コールされる
⑥ ロケーションを取得します。
⑦ 緯度を取得
⑧ 経緯を取得
★Map1.java
package com.myandroid;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class Map1 extends Activity {
TextView tv;
@Override
276
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
tv = (TextView)findViewById(R.id.myTextView);
tv.setText(checkProviders());・・・①
}
private String checkProviders(){
LocationManager locationManager =
(LocationManager)getSystemService(Context.LOCATION_SERVICE);・・・②
String position = "";
List<String> providers = locationManager.getProviders(true);・・・③
LocationListener listener = new LocationListener(){・・・④
@Override
public void onLocationChanged(Location location){
if(location != null){
double latitude = location.getLatitude();
double longitude = location.getLongitude();
tv.setText("北緯" + latitude + " 東経" + longitude);
} else{
tv.setText("No Location.");
}
}
@Override
public void onProviderDisabled(String provider){}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
for(String provider : providers){
locationManager.requestLocationUpdates(provider, 1000, 0, listener);・・⑤
Location location = locationManager.getLastKnownLocation(provider);・・⑥
if(location != null){
double latitude = location.getLatitude();・・・⑦
double longitude = location.getLongitude();・・・⑧
position = "緯度" + latitude + " 経度" + longitude;
} else{
position = "No Location.";
}
}
return position;
}
}
277
これを実行するにはちょっと事前に操作が必要です。Eclipse で[ウインドウ]-[パース
ペクティブを開く]-[DDMS]を実行します。左下にエミュレータ・コントロールという
ペインがあります。その中に Location Controls があり、ここで、緯度、経度がデフ
ォルトで入力されていますので、好きな数字にして「送信」ボタンを押します。これ
で GPS からデータが発せられた状態になります。これはあくまでテスト環境です。
▲DDMS
122
GPX、KML というタブがあります。
GPX は GPS Exchange Format で、KML は Keyhole Markup Language です。それ
ぞれ都市名と緯度、経度のデータが入っているファイルのことです。ファイルを入手
して取り込むことも、自分で作ることもできます。
278
アクティビティを実行してみます。
▲123 実行結果
DDMS の Location Controls で緯度 38 にして、送信ボタンを押すとすぐに表示が変
わります。
▲124 位置の変化があった場合
13.2. 緯度経度から住所を調べる
Geocoder クラスを使うと緯度経度から住所を調べることができます。Locale を指定
すれば、その地域の言語で表示することも可能ですが、今の Android のバージョンで
はロケールはサポートされていないようです。
① Geocoder を取得します
② getFromLocation()メソッドで住所を取得します。第 1 引数は緯度、第 2 引数は経
度、第 3 引数は候補数で 1 から 5 が望ましいとされています。
③ 詳細な住所
④ サブの行政区域
⑤ 行政区域(州など)
⑥ 国名
279