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
© Copyright 2025 ExpyDoc