GPSを使用して現在地の緯度、経度、時刻を取得する (GPSによる測位情報の取得) - Android

Andorid端末のGPS機能を利用して現在位置の緯度・経度を取得します。

アプリケーション作成情報

  • ProjectName : GPSLocationListener
  • ApplicationName : GPSLocationListener
  • PackageName : iPentec.GPSLocationListener
  • Activity : GPSLocationListenerActivity
  • Androidのバージョンは2.3.3にしました

UI

以下のUIを作成しました。textViewを2つ配置します。


コード (GPSLocationListenerActivity.java)

package iPentec.GPSLocationListen;

import android.app.Activity;
import android.os.Bundle;
import android.location.*;
import android.content.*;
import android.util.Log;
import android.widget.TextView;

public class GPSLocationListenActivity extends Activity implements LocationListener {
    LocationManager locman;
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        locman = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    }
    
    @Override
    protected void onResume(){
    	if (locman != null){
    		locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0,this);    		
    	}
    	super.onResume();
    }
    
    @Override
    protected void onPause(){
    	if (locman != null){
    		locman.removeUpdates(this);
    	}
    	super.onPause();
    }
    
    @Override
    public void onLocationChanged(Location location){
    	TextView textView1 = (TextView)findViewById(R.id.textView1);
        textView1.setText("Latitude:Longitude - "
        +String.valueOf(location.getLatitude()) +":"+String.valueOf(location.getLongitude()));
        
        TextView textView2 = (TextView)findViewById(R.id.textView2);
        textView2.setText(String.valueOf(location.getTime()));
            	
    	
    	Log.v("----------", "----------");
        Log.v("Latitude", String.valueOf(location.getLatitude()));
        Log.v("Longitude", String.valueOf(location.getLongitude()));
        Log.v("Accuracy", String.valueOf(location.getAccuracy()));
        Log.v("Altitude", String.valueOf(location.getAltitude()));
        Log.v("Time", String.valueOf(location.getTime()));
        Log.v("Speed", String.valueOf(location.getSpeed())); 
        Log.v("Bearing", String.valueOf(location.getBearing()));
    }
    
    @Override
    public void onProviderDisabled(String provider){
    
    }
    
    @Override
    public void onProviderEnabled(String provider){
    }
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras){
    	switch(status){
    	case LocationProvider.AVAILABLE:
    		Log.v("Status","AVAILABLE");
    		break;
    	case LocationProvider.OUT_OF_SERVICE:
    		Log.v("Status","OUT_OF_SERVICE");
    		break;
    	case  LocationProvider.TEMPORARILY_UNAVAILABLE:
    		Log.v("Status","TEMPORARILY_UNAVAILABLE");
    		break;
    		
    	}
    }
}

解説

LocationManager locman;
クラスのメンバ変数としてLocationManager型の変数を定義しておきます。

onCreate() メソッド

locman = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
getSystemService()メソッドを呼び出してLocationManagerを取得します。

onResume() メソッド

if (locman != null){
  locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0,this);    		
}
super.onResume();
LocationManagerのrequestLocationUpdates()メソッドを呼び出しGPS情報の取得を開始します。第二引数にGPS取得間隔の最小時間を与えます。第三引数にGPSの最小距離を与えます。

第一引数にはプロバイダを指定します。プロバイダは以下の値が指定できます。
プロバイダ名意味
LocationManager.GPS_PROVIDER人工衛星(GPS)を使って位置を測位します。ACCESS_FINE_LOCATIONパーミッションが必要です。
LocationManager.NETWORK_PROVIDER携帯電話の基地局やWiFiのアクセスポイントを利用して位置を測位します。ACCESS_FINE_LOCATIONパーミッションが必要です。
LocationManager.PASSIVE_PROVIDER他のアプリケーションやサービスで測位された位置情報を利用します。ACCESS_FINE_LOCATIONパーミッションが必要です。getProvider()メソッドを呼び出すことで測位された元のプロバイダを取得できます。

onPause() メソッド

if (locman != null){
  locman.removeUpdates(this);
}
super.onPause();
LocationManagerのremoveUpdates()メソッドを呼び出しGPS情報の更新を停止します。

onLocationChanged() メソッド

TextView textView1 = (TextView)findViewById(R.id.textView1);
textView1.setText("Latitude:Longitude - "
  +String.valueOf(location.getLatitude()) +":"+String.valueOf(location.getLongitude()));
 
TextView textView2 = (TextView)findViewById(R.id.textView2);
textView2.setText(String.valueOf(location.getTime()));
textView1に緯度経度の数値を表示します。textView2にはGPSから情報を取得した時刻を表示します。

Log.v("----------", "----------");
Log.v("Latitude", String.valueOf(location.getLatitude()));
Log.v("Longitude", String.valueOf(location.getLongitude()));
Log.v("Accuracy", String.valueOf(location.getAccuracy()));
Log.v("Altitude", String.valueOf(location.getAltitude()));
Log.v("Time", String.valueOf(location.getTime()));
Log.v("Speed", String.valueOf(location.getSpeed())); 
Log.v("Bearing", String.valueOf(location.getBearing()));
GPSから得られるその他の情報をログに記録します。

onStatusChanged() メソッド

switch(status){
case LocationProvider.AVAILABLE:
  Log.v("Status","AVAILABLE");
  break;
case LocationProvider.OUT_OF_SERVICE:
  Log.v("Status","OUT_OF_SERVICE");
  break;
case  LocationProvider.TEMPORARILY_UNAVAILABLE:
  Log.v("Status","TEMPORARILY_UNAVAILABLE");
  break;
}
GPSの状態に変化があると呼び出されるメソッドです。状態変化の情報をログに記録します。

パーミッションの設定

AndroidManifest.xmlを開き、パーミッションを設定します。

EclipseでAndroidManigest.xmlファイルを開きます。編集画面の下部のタブから[Permissions]タブをクリックします。下図の画面が表示されますので[Add]ボタンをクリックします。


追加する要素を選択するダイアログボックスが表示されます。一覧から[Uses Permission]を選択し、[OK]ボタンをクリックします。


[Uses Permission]が一覧に追加されました。右側の[Name]コンボボックスをクリックします。


コンボボックスの選択リストが表示されますので、[android.permission.ACCESS_FINE_LOCATION]を選択します。


要素が選択できたら、AndroidManifest.xmlファイルを保存します。


以上でGPS機能の利用に必要なandroid.permission.ACCESS_FINE_LOCATIONの追加ができました。

アプリケーションの実行

実機で動作確認します。実機へのインストール方法はこちらの記事を参照してください。

GPSからの緯度経度が画面に表示されます。端末を移動させると値が変わることも確認できました。



応用例

もう少し複雑なプログラムを紹介します。

UI

下図のUIを準備します。

コード

以下のコードを記述します。

MainActivity.java

package com.ipentec.gpslocationlisten;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.location.*;
import android.util.Log;
import android.content.*;
import android.widget.TextView;

public class MainActivity extends Activity implements LocationListener {
  LocationManager locmanG;
  LocationManager locmanN;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locmanG = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locmanN = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  protected void onResume() {
    if (locmanG != null) {
      locmanG.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

      TextView textView1 = (TextView) findViewById(R.id.textView1);
      if (locmanG.isProviderEnabled(LocationManager.GPS_PROVIDER) == false) {
        textView1.setText("GPS Disabled");
      } else {
        textView1.setText("GPS Enabled");
      }
    }
    if (locmanN != null) {
      locmanN.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

      TextView textView2 = (TextView) findViewById(R.id.textView2);
      if (locmanN.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == false) {
        textView2.setText("Network Location Disabled");
      } else {
        textView2.setText("Network Location Enabled");
      }
    }
    super.onResume();
  }

  @Override
  protected void onPause() {
    if (locmanG != null) {
      locmanG.removeUpdates(this);
    }
    if (locmanN != null) {
      locmanN.removeUpdates(this);
    }
    super.onPause();
  }

  @Override
  public void onLocationChanged(Location location) {
    if (location.getProvider().equals(LocationManager.GPS_PROVIDER) == true) {
      TextView textView3 = (TextView) findViewById(R.id.textView3);
      textView3.setText("GPS Latitude:Longitude - "
            + String.valueOf(location.getLatitude()) + ":"
            + String.valueOf(location.getLongitude()));

      TextView textView4 = (TextView) findViewById(R.id.textView4);
      textView4.setText("GPS Time:" + String.valueOf(location.getTime()));
    }

    if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER) == true) {
      TextView textView5 = (TextView) findViewById(R.id.textView5);
      textView5.setText("NETWORK Latitude:Longitude - "
            + String.valueOf(location.getLatitude()) + ":"
            + String.valueOf(location.getLongitude()));

      TextView textView6 = (TextView) findViewById(R.id.textView6);
      textView6.setText("NETWORK Time:" + String.valueOf(location.getTime()));
    }

    Log.v("----------", "----------");
    Log.v("Latitude", String.valueOf(location.getLatitude()));
    Log.v("Longitude", String.valueOf(location.getLongitude()));
    Log.v("Accuracy", String.valueOf(location.getAccuracy()));
    Log.v("Altitude", String.valueOf(location.getAltitude()));
    Log.v("Time", String.valueOf(location.getTime()));
    Log.v("Speed", String.valueOf(location.getSpeed()));
    Log.v("Bearing", String.valueOf(location.getBearing()));
  }

  @Override
  public void onProviderDisabled(String provider) {
  }

  @Override
  public void onProviderEnabled(String provider) {
  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
    switch (status) {
    case LocationProvider.AVAILABLE:
      Log.v("Status", "AVAILABLE");
      break;
    case LocationProvider.OUT_OF_SERVICE:
      Log.v("Status", "OUT_OF_SERVICE");
      break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
      Log.v("Status", "TEMPORARILY_UNAVAILABLE");
      break;
    }
  }
}

解説

locmanG,locmanN の2つのロケーションマネージャーを用意し、ネットワークプロバイダーとGPSプロバイダーの両方を用いて測位します。測位完了時のonLocationChanged()メソッドはlocmanG,locmanNともに共通ですが、Location クラスのGetProvider()メソッドによりプロバイダーを取得できるため、GPSとネットワークの測位結果を分けて表示しています。
また、isProviderEnabled()メソッドを呼び出すことで引数に与えたプロバイダーが端末で有効かを調べられます。

実行結果

アプリケーションを実行します。下図の画面が表示されます。

屋内ではGPSの信号が受信できないため、GPSプロバイダーのonLocationChanged()メソッドが発生しないためTextView3,TextView4には表示はされません。


屋外ではGPSの信号が受信できるため、TextBox3,TextBox4にGPSの測位結果が表示されます。GPSが無効の場合は GPS Enabledの欄にGPS Disabledと表示されます。

著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-04
作成日: 2011-08-21
iPentec all rights reserverd.