AndroidでGPSを扱う


やりながらメモしていく
目標は「準天頂衛星アプリコンテスト2014」の参加。
一次審査も通過しました。
作ったアプリは「宇宙との交信曲」です。

必要なパーミッション

android.permission.ACCESS_FINE_LOCATION

リスナー

LocationListener 現在位置の情報を取得するためのリスナー
NmeaListener Nmea形式でGPS衛星の情報を取得できる。
今回必要なのはNmeaListenerかな?

省略してメモ。参考程度。

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.location.GpsStatus.NmeaListener;

public class MainActivity extends Activity implements LocationListener, NmeaListener{
	private LocationManager locManager = null;
	protected void onCreate(Bundle savedInstanceState) {
		// ・・・いろいろ省略・・・
		locManager = (LocationManager)getSystemService(LOCATION_SERVICE);
		locManager.addNmeaListener(this);
		// ・・・いろいろ省略・・・
	}

	protected void onResume() {
		if(locManager != null){
			// ロケーションマネージャを更新
			locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
		}
		super.onResume();
	}

	protected void onPause() {
		if(locManager != null){
			locManager.removeUpdates(this);
		}
		super.onPause();
	}

	public void onLocationChanged(Location location) {
		// ・・・いろいろ省略・・・
		mapGPSInfo.put("Latitude", String.valueOf(location.getLatitude()));
		mapGPSInfo.put("Longitude", String.valueOf(location.getLongitude()));
		mapGPSInfo.put("Accuracy", String.valueOf(location.getAccuracy()));
		mapGPSInfo.put("Altitude", String.valueOf(location.getAltitude()));
		mapGPSInfo.put("Time", String.valueOf(location.getTime()));
		mapGPSInfo.put("Speed", String.valueOf(location.getSpeed()));
		mapGPSInfo.put("Bearing", String.valueOf(location.getBearing()));
		// ・・・いろいろ省略・・・
	}
	public void onProviderDisabled(String provider) {
	}
	public void onProviderEnabled(String provider) {
	}
	public void onStatusChanged(String provider, int status, Bundle extras) {
	        switch (status) {
	        case LocationProvider.AVAILABLE:
	    		mapGPSInfo.put("Status", "AVAILABLE");
	            break;
	        case LocationProvider.OUT_OF_SERVICE:
	    		mapGPSInfo.put("Status", "OUT_OF_SERVICE");
	            break;
	        case LocationProvider.TEMPORARILY_UNAVAILABLE:
	    		mapGPSInfo.put("Status", "TEMPORARILY_UNAVAILABLE");
	            break;
	        }
	}

	public void onNmeaReceived(long arg0, String Nmea) {
		mapGPSInfo.put("Nmea", "Nmea      : " + Nmea);
		Log.d("GPSTest", Nmea);
		
		String[] nmeaArray = Nmea.split(",");
		if(nmeaArray[0].equals("$GPGSA ")){
			// 衛星番号
		}
		if(nmeaArray[0].equals("$GPGGA ")){
			// 測位された現在地
		}
		if(nmeaArray[0].equals("$GPRMC ")){
			// 測位された現在地(推奨)
		}
		if(nmeaArray[0].equals("$GPGSV ")){
			// 1行で4つの衛星の位置
		}
	}
}

みちびきというか、各衛星の情報は、NmeaListenerのonNmeaReceivedメソッドで取得することが可能。
requestLocationUpdatesしないと、情報は取れないようだ。

MNEA

GPGSVとかQZGSVとかありますが、先頭の2文字がGPS衛星や準天頂衛星などの種類を表して、下3ケタの文字がデータの種類を表すみたいですね。
ただしPGLORは製造情報らしいです。

先頭2文字
GN・・・Glonass
GP・・・GPS衛星
QZ・・・準天頂衛星

GP QZ GN データ 説明
GGA 現在地
GSA 衛星番号
GSV 衛星の位置
GSV 測位された現在地(推奨)
ZDA 時間

なので、下3桁で処理を分けるといいかもしれません。

参考サイト

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)