現在地点の緯度と経度を取得する
前回、緯度と経度から都道府県を判別する処理を解説しました。処理の流れと説明が逆となってしまいましたが、今回は、現在位置の緯度と経度を取得する処理から解説していきます。
位置情報にアクセスするには
現在地の緯度と経度を求めるには、多くのAndroid端末に備わっているGPSセンサーを利用します。また、GPSセンサーが搭載されていない機種でも、設定によって、WiFiなどのネットワークから位置情報を取得することもできます。
位置情報にアクセスするには、まずマニフェストファイルの変更が必要です。AndroidManifest.xmlに、以下のように位置情報取得のパーミッションを追加しましょう。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
LocationManagerを取得する
アプリから位置情報にアクセスするには、次のような手順です。
- LocationManagerを取得する。
- ロケーションプロバイダの選択基準を設定する。
- 位置情報リスナーを実装する。
- 位置情報の更新を要求する。
Androidの位置情報は、LocationManagerというサービスで管理されていますので、まず、このLocationManagerのインスタンスを取得します(1)。
ImaSoraActivity.javaの一部] // ロケーションマネージャー private LocationManager locationManager; protected void onCreate(Bundle savedInstanceState) { // LocationManagerのインスタンスを取得する(1) locationManager = (LocationManager)getSystemService(LOCATION_SERVICE); if ( locationManager == null ) { return; } // メインの処理開始 execStart(); } // メイン処理 public void execStart() { // プロバイダの選択基準を設定する(2) Criteria criteria = new Criteria(); criteria.setBearingRequired(false); // 方位不要 criteria.setSpeedRequired(false); // 速度不要 criteria.setAltitudeRequired(false); // 高度不要 try { // 位置情報の更新を要求する(4) locationManager.requestSingleUpdate(criteria, // 位置情報リスナー(3) new LocationListener(){ @Override public void onLocationChanged(Location location) { // 住所を取得する getCurrentAddress(location); } @Override public void onProviderDisabled(String arg0) {} @Override public void onProviderEnabled(String arg0) {} @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) {} }, null ); } catch (Exception e) { // 位置情報サービスが利用できない場合(5) } }
ロケーションプロバイダの選択基準を設定する
前述したように、位置情報を取得する手段(ロケーションプロバイダ)は複数ありますので、どのプロバイダを利用するのかを指定する必要があります。
アプリから特定のロケーションプロバイダを指定することもできますが、通常は、どのようなプロバイダを選択するのかの条件だけを指定して、プロバイダの決定はAndroidに任せるようにします。
条件の指定は、Criteriaというクラスを使います。Criteriaクラスでは、位置情報の精度や、必要な情報の指定が可能です。
今回のアプリでは、単に緯度、経度のみを利用しますので、不要な情報を取得しないようにしています(2)。端末によっては、位置情報の取得に時間がかかる場合がありますので、少しでも早く終わるように必要な情報のみに絞っています。
位置情報リスナーを実装する
位置情報のリスナーでは、LocationListenerというインターフェースを実装します(3)。LocationListenerインターフェースでは、4つのメソッドの実装が必要です。ただし今回は、位置情報の変化を受け取るonLocationChangedメソッドのみにコードを追加します。
onLocationChangedメソッドのLocationパラメータには、測定した緯度、経度が含まれています。
位置情報の更新を要求する
位置情報の更新を要求するには、LocationManagerに実装されているrequestLocationUpdatesメソッド、またはrequestSingleUpdateメソッドを実行します。
requestLocationUpdatesの場合は、removeUpdatesというメソッドで更新を停止させない限り、位置情報を測定し続けます。今回のアプリでは、位置を追跡する必要もないでしょうから、位置情報を1回のみ取得するrequestSingleUpdateメソッドを使います(4)。
なお、requestSingleUpdateメソッドは、異なる引数のものが複数定義されています。サンプルのコードでは、Criteriaオブジェクト、リスナー、メッセージキュー(nullなら同じスレッドのキュー)を指定しています。
Criteriaオブジェクトで、ロケーションプロバイダの選択基準のみを指定していますので、Android端末の状況によって適切なプロバイダが選択され、位置情報の更新を要求します。
なお、位置情報にアクセスできない状況であれば、例外が発生します(5)。