やりながらメモしていく
目標は「準天頂衛星アプリコンテスト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班