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