条件にあう位置情報プロバイダから、位置情報を利用する簡単な例
位置情報を利用するために、 Android では現在はネットワークからの位置情報と、GPSからの位置情報が利用できます。
ネットワークは位置を特性する精度が低く、 GPS は高精度です。
しかし一概に GPS が常に良いというものでもなく、必要とされる条件の範囲内で適切な方法を選択するべきです。
例えば 「カリフォルニアにいるかどうか」ということがわかればいい程度の場合に、 GPS は無駄に高精度でしょう。
プログラムから利用するときは、どちらがより適切であるか?ということを判断しつつ、最適な位置情報プロバイダを取得する方法があります。
ここでは最適な位置情報プロバイダを取得して、位置情報を利用する簡単な例を示します。
パーミッションの設定
まずは位置情報を利用するために、 マニフェストファイル AndroidManifest.xml に次のパーミッションを設定します。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
ここでは、 ACCESS_FINE_LOCATION と ACCESS_COARSE_LOCATION の両方を指定しています。
ちなみに、 ACCESS_FINE_LOCATION は ACCESS_COARSE_LOCATION を含んでいますので FINE を指定したら COARSE は指定しなくても構いません。
条件の指定
欲しいロケーションプロバイダの条件は次のように指定します。
locationManager = (LocationManager)
getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
bestProvider =
locationManager.getBestProvider(criteria, true);
...
まず、ロケーションマネージャを使うために getSystemService に LOCATION_SERVICE を渡して呼び出します。
次に Criteria オブジェクトの setAccuracy メソッドや setPowerRequirement で位置情報の精度や消費電力の条件を指定します。
ここでは精度としては ACCURACY_FINE (高精度)、消費電力は POWER_MEDIUM (中くらい) という条件を指定しています。
すると、その戻り値としては "gps" が取得されました。
プロバイダの選択はこれだけで OK です。
GPS のリスナーを設定する例
Activityが Runnning (実行中) の状態に入るときは onResume が呼ばれます。また一時停止、あるいは停止状態になるときは、 onPause が呼ばれます。
そこで onResume でリスナーの設定、 onPause でリスナーの削除を行います。
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class LocationTest extends Activity
implements LocationListener {
protected TextView geoText;
protected TextView logText;
protected TextView provText;
protected LocationManager locationManager;
protected String bestProvider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
initLocationService();
}
@Override
protected void onResume(){
super.onResume();
locationManager.requestLocationUpdates(
bestProvider, 60000, 1, this);
}
@Override
protected void onPause(){
super.onPause();
locationManager.removeUpdates(this);
}
protected void initLocationService(){
locationManager = (LocationManager)
getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
bestProvider =
locationManager.getBestProvider(criteria, true);
provText.setText(bestProvider);
}
protected void findViews(){
geoText = (TextView)findViewById(R.id.geo);
logText = (TextView)findViewById(R.id.log);
provText = (TextView)findViewById(R.id.provider);
}
protected void refreshGeoLocation(Location location){
String desc = location.getLongitude()
+ ", " + location.getLatitude();
geoText.setText(desc);
}
@Override
public void onLocationChanged(Location location) {
refreshGeoLocation(location);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(
String provider, int status, Bundle extras) {}
}
ここでは LocationListener が実装してあり、位置が変わったことを知らせる onLocationChanged が呼ばれたときに表示を更新しています。