GPS機能を使ったアプリを開発する機会があったんですが、調べてみると結構複雑でして。
GPSを使うにも、ネットワークから取得する方法とGPS衛星を使う方法があったりと、複数方法があったのでそれぞれの使い方と違いを書いてみました。
メリット・デメリットについては若干の主観も混じっているため実際の仕様と異なる場合もございます
GPSを使用したアプリサンプルについてはgithubにアップしてます。
GPS機能の使い方とメソッド説明
まずGPS機能を使用するにはAndroidManifest.xmlに下記のパーミッションを追加する必要があります。
・GPSによる位置情報利用
<uses-permission android:name=”android.permission.ACCESS\_FINE\_LOCATION”/>
・ネットワークによる位置情報利用
<uses-permission android:name=”android.permission.ACCESS\_COARSE\_LOCATION”/>
あとはActivityなどで、LocationListenerインターフェースを実装し利用することが出来ます。
実装が必要となるメソッドが4つあります。
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
しかし使用する上では基本的にonLocationChangedメソッドだけ使ってました。
このメソッドは、位置情報が取得出来ると呼び出されるメソッドとなります。
位置情報を取得してみる
// ロケーションマネージャーのインスタンスを取得
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// 利用できるGPSを選択してプロバイダを取得
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
// ネットワークプロバイダを使って検索
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
} else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
// GPSプロバイダを使って検索
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
それぞれの引数についは
- 第一引数:プロバイダ
- 第二引数:通知の最小時間間隔
- 第三引数:通知の最小距離間隔
- 第四引数:リスナー(LocationListenerを実装した自身を渡します)
これで位置が取得できるとonLocationChangedメソッドが呼ばれますので、引数のlocationを使い緯度や経度を取得することが出来ます。
// 緯度を取得
location.getLatitude();
// 経度を取得
location.getLongitude();
// 精度を取得
location.getAccuracy();
// 標高を取得
location.getAltitude();
// 取得時間を取得
location.getTime();
また、注意点としまして、取得が終わった後やアプリを途中で終了したり、バッググラウンドに移る際は必ず位置情報の計測を停止させて下さい。
停止させるまではずっと取得状態となってしまい、定期的に上記のメソッドが呼び出されてしまい、バッテリー消費の原因にもなります。
- 位置情報取得の終了方法
locationManager.removeUpdates(this);
これで停止させる事ができるので、onLocationChangedやActivityのonPauseメソッド内とかでも停止させたほうが良いかと思います。
各プロバイダのメリット・デメリット
若干体感や主観も混ざってしまっているのですが
LocationManager.NETWORK_PROVIDER
- 取得するまでの時間が早い
- バッテリー消費はGPS_PROVIDERより抑える事ができる
- GPS_PROVIDERに比べて精度が低い
- 用途としては、ざっくりとした位置を求めるには良いのかなと思いました。
LocationManager.GPS_PROVIDER
- 取得まで時間がかかる
- 位置情報の精度は高い
- 室内だと場所によるが取得できない場合が多々あった
- 現在の場所から特定の場所までの距離を計測するなど、詳細な位置を求める場合向き
上記の様な感じがしました。
用途によってうまく使い分ける必要がありますね。