デバイスの現在値取得
デバイスの現在値は
LocationManager.requestLocationUpdate()
へ
LocationListener
を設定することで
定期的に現在値の緯度経度を
GPSを使うことで取得できる
まずは、LocationManagerインスタンス取得
Context.getSystemService()で
LocationManagerのインスタンス取得できる
mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
次に、プロバイダーの設定
現在地の取得につかうロケーションプロバイダーを設定
Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_MEDIUM); criteria.setPowerRequirement(Criteria.POWER_MEDIUM); String provider = mLocationManager.getBestProvider(criteria, true);
次に、ロケーションの取得
これは、LocationManagerクラスの
requestLocationUpdate()
を呼べばロケーションの取得が開始される
mLocationManager.requestLocationUpdate(provider, 0, 0, this);
そして、ロケーションが更新されると
onLocationChanged()が呼ばれる
@Override public void onLocationChanged(Location location){ //ロケーションが変更されたときの処理 //今回は、緯度経度をTextViewへ表示 TextView latitude=(TextView)findViewById(R.id.latitude); TextView longitude = (TextView)findViewById(R.id.longitude); latitude.setText(String.valueOf(location.getLatitude())); longitude.setText(String.valueOf(location.getLongitude())); }
なお、利用するロケーションプロバイダーにより、権限が必要になる
android.permission.ACCESS_FINE_LOCATION
GPS、基地局、Wi-Fiを使い
正確な位置情報へのアクセスを許可
android.permission.ACCESS_COARSE_LOCATION
基地局、Wi-Fiのネットワーク位置情報を使い
概ねの位置情報へのアクセスを許可
android.permission.ACCESS_MOCK_LOCATION
テスト用位置情報へのアクセスを許可
また、ロケーションプロバイダーには
2タイプあり
精度や検出精度が違う
LocationManager.GPS_PROVIDER
検出時間はGPSを使うため遅い
さらに、バッテリーも多く消費する
精度は高性能だけど
屋内やビルの間だと精度が落ちる
これは
正確な位置情報を得るときに使う
LocationManager.NETWORK_PROVIDER
検出時間は、ネットワーク情報を使うため
GPSより速くなる
また、GPSを使わないため、消費電力も低め
ただし、
電波の基地局、Wi-FiのAPをアクセス基準にするため
精度は低くなる
こちらは、大まかな位置情報を得るときに使う
またCriteriaクラスを使い
バッテリー消費や検出条件からロケーションプロバイダーを選択する事もできる
バッテリー消費なら
Criteria.POWER_LOW
バッテリー消費低
Criteria.POWER_MEDIUM
バッテリー消費中
Criteria.POWER_HIGH
バッテリー消費高
GPS精度にするなら
Criteria.ACCURACY_LOW
GPS精度低
Criteria.ACCURACY_MEDIUM
GPS精度中
Criteria.ACCURACY_HIGH
GPS精度高
これらを設定して
LocationManagerの
getBestProvider()を呼ぶことで
最適なプロバイダーを取得できる
次に、ロケーションの更新
requestLocationUpdate()を使ったときに
LocationListenerを継承することで、
以下のメソッドが追加実装される
これらは、プロバイダーのGPS精度を示す
onLocationChanged(Location location)
ロケーションが変更されたとき
onProviderDisabled(String provider)
ロケーションプロバイダーが無効化されたとき
onProviderEnabled(String provider)
ロケーションプロバイダーが有効化されたとき
onStatusChanged(String provider, int status, Bundle extras)
ロケーションプロバイダーが変更されたとき
緯度経度は、onLocationChanged()のパラメーターである
locationへ格納され
緯度は、location.getLatitude()
経度は、location.getLongitude()
で取得できる