条件にあう位置情報プロバイダから、位置情報を利用する簡単な例

位置情報を利用するために、 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_LOCATIONACCESS_COARSE_LOCATION の両方を指定しています。

ちなみに、 ACCESS_FINE_LOCATIONACCESS_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);
    
    ...

まず、ロケーションマネージャを使うために getSystemServiceLOCATION_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 が呼ばれたときに表示を更新しています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門