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