やりながらメモしていく
目標は「準天頂衛星アプリコンテスト2014」の参加。
一次審査も通過しました。
作ったアプリは「宇宙との交信曲」です。
必要なパーミッション
android.permission.ACCESS_FINE_LOCATION
リスナー
LocationListener
NmeaListener
今回必要なのは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桁で処理を分けるといいかもしれません。
参考サイト
- 準天頂衛星アプリコンテスト2014
 - 逆引きAndroid入門 > 位置情報を取得するには/GPSを使用するには
 - 地図アプリの作成-Android版その2
 - Android で GPS 衛星からの情報を NMEA 形式で取得する方法
 - みちびき Nexus7 GpsStatus.NmeaListener
 - GPS衛星の位置 GpsStatus.NmeaListener
 - GPSのNMEAフォーマット
 - GPS NMEAデータ形式
 - GPS - NMEA sentence information
 - Location(位置情報)クラスの基本プロパティ
 - NMEA-0183フォーマット
 - GPS班
 

 (1.00 / 1)
 (0.00 / 1)