位置情報を取得するには / Getting Started


AndroidではGPSやネットワークを利用して端末の位置情報を取得することができます。
また、位置情報の精度や消費電力の程度を予め指定しておくことが可能なため、
その時々に最も適した方法で位置情報を取得することができます。

位置情報を取得する手順としては以下のようになります。

  • パーミッションを設定する
  • LocationManagerを取得する
  • ロケーションプロバイダの条件を指定する
  • 位置情報リスナーの実装をする
  • 位置情報リスナーの登録と更新間隔を設定する

詳細は続きからどうぞ。

パーミッションを設定する

はじめにアプリから位置情報を取得するためにパーミッションの設定を行います。
位置情報をどのデバイスから取得するかによって設定するパーミッションが異なります。
用途に応じてマニフェストファイルに適切なパーミッションを設定してください。

・GPSから位置情報を取得する場合

<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>

・ネットワークによる位置情報取得の許可

<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”/>

ロケーションプロバイダの条件を指定する

Androidでは位置情報をLocationManagerと呼ばれるサービスが管理しています。

アプリケーションはまずLocationManagerのインスタンスを取得する必要があります。

LocationManager mLocationManager =
     (LocationManager) getSystemService(Context.LOCATION_SERVICE);

ロケーションプロバイダの条件を指定する

次にCriteriaクラスを使って取得したいロケーションプロバイダの条件を指定します。
Androidでは位置情報を取得するための手段(デバイス)のことをロケーションプロバイダと呼びます。

先述のようにAndroidでは位置情報を取得するための手段にいくつか選択肢があります。
GPSを使うと高精度な位置情報を取得することができますが、屋内では使用できなかったり、
電力消費量が大きかったりするため、状況によってはネットワークの基地局から位置情報を
取得する方が良いという場合もあるでしょう。

Criteriaクラスではアプリケーションが使いたいロケーションプロバイダの条件を設定することができます。
ここで設定したCriteriaオブジェクトをLocationManagerに渡すことでその条件に適したロケーションプロバイダを
取得することができるようになります。

Criteriaクラスで指定できる条件とメソッドは以下のようになっています。

Criteriaに指定できる条件とメソッド

・位置情報の精度 (Accuracy)
・消費電力 (PowerRequirement)
・高度情報取得の有無 (AltitudeRequired)
・速度情報取得の有無 (SpeedRequired)
・方向情報取得の有無 (BearingRequired)
・費用を許可するか (CostAllowed)

[table “151” not found /]

たとえば以下のように使用します。

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE); // 低精度
criteria.setPowerRequirement(Criteria.POWER_LOW); // 低消費電力

上記の例では低精度かつ低消費電力の条件でロケーションプロバイダを取得します。

設定したCriteriaオブジェクトをgetBestProviderメソッドの引数に渡して呼び出すと
条件に適したロケーションプロバイダの文字列が返されます。

String provider = mLocationManager.getBestProvider(criteria, true);

上記のCriteriaオブジェクトでgetBestProviderメソッドを呼ぶと
通常はネットワークからの位置情報を意味するNETWORK_PROVIDERが返されるはずです。

位置情報リスナーの実装

続いて、実際に位置情報を取得するためにLocationListenerを実装します。

LocationListenerには以下の4つのメソッドがあります。

[table “152” not found /]

位置情報リスナーの登録

requestLocationUpdatesメソッドを使って実装したLocationListenerを登録します。

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

引数にはロケーションプロバイダと更新する時間間隔と位置変化の間隔、そしてリスナーを設定します。

サンプルコード

以上のことを踏まえてサンプルコードを紹介します。
低精度・低消費電力の条件で取得したロケーションプロバイダで座標を取得し、
画面上に表示するサンプルコードになります。

public class GpsActivity extends Activity implements LocationListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

		// LocationManagerを取得
		LocationManager mLocationManager =
		     (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		// Criteriaオブジェクトを生成
		Criteria criteria = new Criteria();

		// Accuracyを指定(低精度)
		criteria.setAccuracy(Criteria.ACCURACY_COARSE);

		// PowerRequirementを指定(低消費電力)
		criteria.setPowerRequirement(Criteria.POWER_LOW);

		// ロケーションプロバイダの取得
		String provider = mLocationManager.getBestProvider(criteria, true);

		// 取得したロケーションプロバイダを表示
		TextView tv_provider = (TextView) findViewById(R.id.Provider);
		tv_provider.setText("Provider: "+provider);

		// LocationListenerを登録
		mLocationManager.requestLocationUpdates(provider, 0, 0, this);

    }

	@Override
	public void onLocationChanged(Location location) {
		// 緯度の表示
		TextView tv_lat = (TextView) findViewById(R.id.Latitude);
		tv_lat.setText("Latitude:"+location.getLatitude());

		// 経度の表示
		TextView tv_lng = (TextView) findViewById(R.id.Longitude);
		tv_lng.setText("Latitude:"+location.getLongitude());

	}

	@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

	}
}
One Comment