GPS数据遵循NMEA-0183协议,该数据标准是由NMEA(National Marine Electronics Association,美国国家海事电子协会)于1983年制定的。统一标准格式NMEA-0183输出采用ASCII 码,其串行通信的参数为:波特率=4800bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。
数据传输以“语句”的方式进行,每个语句均以“$”开头,然后是两个字母的“识别符”和三个字母的“语句名”,接着就是以逗号分割的数据体,语句末尾为校验和,整条语句以回车换行符结束。
NMEA-0183的数据信息有十几种,这些信息的作用分别是:$GPGGA:输出GPS的定位信息;$GPGLL:输出大地坐标信息;$GPZDA:输出UTC时间信息;$GPGSV:输出可见的卫星信息;$GPGST:输出定位标准差信息;$GPGSA:输出卫星DOP值信息;$GPALM:输出卫星星历信息;$GPRMC:输出GPS推荐的最短数据信息等。
这段话在我的这个博客上也有说明:GPS NMEA-0183标准详解(常用的精度以及经纬度坐标)
现在就是对原始的数据进行解析。
关于android loction的调用可参考以下:
android location 数据标准输出,原始mnea输出和GpsStatus卫星状态的变化
android 模拟位置信息Location使用示例
android 自带gps定位Location相关知识
1,看实现的效果
2,代码主要解析
根据namea标准解析如下
package com.example.gpsstatus; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.common.primitives.Bytes; import android.annotation.SuppressLint; import android.util.Log; /** * 标准nmea数据解析 * @author mmsx * */ public class GpsAnalysis { List<Byte> gps_data = new ArrayList<Byte>(); private List<GpsSatelliteInfo> satelliteList = new ArrayList<GpsSatelliteInfo>(); private List<GpsSatelliteInfo> GPSList = new ArrayList<GpsSatelliteInfo>(); private List<GpsSatelliteInfo> BDList = new ArrayList<GpsSatelliteInfo>(); private List<GpsSatelliteInfo> GLONASSList = new ArrayList<GpsSatelliteInfo>(); private boolean bUsedGPS; private boolean bUsedGlonass; private boolean bUsedBDS; private boolean bUsedGalileo; public boolean m_bUpdating; int GSVIndex = 0; private double hrms, vrms, rms; private double SigmaEast, SigmaNorth; private long Time;// 当前时间 与(2009,1,1,0,0,0,0)的时间差 private double deltTime;// 当前时间 与上一历元的时间差 private Date utcDate; private Date gpsDate; private String strGsa = "";// 用于保存GSA里面的卫星数据 private int year, month, day; private double pdop; private double hdop; private double vdop; private int age;// 差分龄 private int m_tSatNum, m_SatNum;// m_tSatNum:可见卫星数; private double dUndulation;// 大地水准面与WGS84之间的高程异常 private int gpsStatue;// GPS状态,0:无效定位(正在搜索卫星...);1:单点定位;2:差分定位;3:浮动;4:固定;5:超宽巷模糊度的固定; public static long m_TimeStamp = 0; private double fSpeed_M_S;// 速度 ,m/s private double heading;// 方位,角度格式:弧度 private volatile static GpsAnalysis gpsAnalysis = null; //经纬度 private double latitude = 0; private double longitude = 0; private double altitude = 0; public static GpsAnalysis getInstance() { synchronized (GpsAnalysis.class) { if(gpsAnalysis == null) gpsAnalysis =new GpsAnalysis(); } return gpsAnalysis; } public void processBinaryData(byte[] temp, int len) { // Log.e("二进制数据", "开始"); if (gps_data.size() > 4096 - len) { gps_data.clear(); } for (int i = 0; i < len; i++) { gps_data.add(temp[i]); } for (int i = 0; i < gps_data.size() - 1; i++) { if (gps_data.get(i) == 0x0D && gps_data.get(i + 1) == 0x0A) { String strs = ""; byte[] byteArray = Bytes.toArray(gps_data); try { strs = new String(byteArray, 0, i + 2, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (strs.contains("$")) { processNmeaData(strs); } for (int ii = i + 1; ii >= 0; ii--) { gps_data.remove(ii); } i = 0; continue; } } return; } private boolean checkNMEAData(String strData) { int nCheckSum, index = -1; String str, str0; if (strData.indexOf("*") == -1) { return false; } if (strData.indexOf("$") == -1) return false; if (strData.indexOf("$") > strData.indexOf("*")) return false; String stem = (strData.substring(0, strData.indexOf("*"))); byte[] cData = stem.getBytes(); nCheckSum = cData[1]; for (int n = 2; n < cData.length; n++)// 值校验 { nCheckSum ^= cData[n]; } str = String.format(("%02x"), nCheckSum); index = strData.indexOf("*"); if (index == -1) return false; if (strData.length() < index + 3) return false; str0 = strData.substring(index + 1, index + 3); if (str.equalsIgnoreCase(str0)) { return true; } else { Log.e("CheckNmea", strData); Log.e("计算校验值", str); return false; } } public static int stringNumbers(String str, String specter) { int count = 0; char c = specter.charAt(0); for (int i = 0; i < str.length(); i++) { char tmp = str.charAt(i); if (Character.valueOf(c).equals(Character.valueOf(tmp))) { count += 1; } } return count; } @SuppressLint("DefaultLocale") public void processNmeaData(String nmea) { if (nmea.length() == 0) return; if (!checkNMEAData(nmea)) { // 可能是A318的命令返回值 return; } // Log.e("NMEA完整语句", nmea); if (!nmea.startsWith("$GPPWR,") && !nmea.startsWith("$GNGST,") && !nmea.startsWith("$GPGST,") && !nmea.startsWith("$GLGSV,") && !nmea.startsWith("$GNGSV,") && !nmea.startsWith("$BDGSV,") && !nmea.startsWith("$GPZDA,") && !nmea.startsWith("$GPGSA,") && !nmea.startsWith("$GNVTG,") && !nmea.startsWith("$GPVTG,") && !nmea.startsWith("$GNGSA,") && !nmea.startsWith("$GPNTR,") && !nmea.startsWith("$GNGGA,") && !nmea.startsWith("$GPGGA,") && !nmea.startsWith("$GPRMC,") && !nmea.startsWith("$GPGSV,") && !nmea.startsWith("$BDGSA,")) return; String[] sField = nmea.split(","); int iFieldNum = stringNumbers(nmea, ","); if (sField == null) return; if ((sField[0].equalsIgnoreCase("$GPGGA") || sField[0] .equalsIgnoreCase("$GNGGA")) && iFieldNum >= 14) { if (sField[6].trim().length() > 0) { switch (Integer.valueOf(sField[6])) { case 0:// 无效定位 gpsStatue = 0; break; case 1:// 单点 gpsStatue = 1; break; case 2:// 差分 gpsStatue = 2; break; case 3: case 4:// 固定 case 8: gpsStatue = 4; break; case 5:// 浮动 gpsStatue = 3; break; } if (sField[2].trim().length() > 3) { latitude = Double.valueOf(sField[2].substring(0, 2)) + Double.valueOf(sField[2].substring(2)) / 60; } if (sField[3] == "S") latitude *= -1.0; if (sField[4].trim().length() > 4) { longitude = Double.valueOf(sField[4].substring(0, 3)) + Double.valueOf(sField[4].substring(3)) / 60; } if (sField[5] == "W") { longitude *= -1.0; longitude += 360; } if (sField[7].trim().length() > 0) { m_SatNum = Integer.valueOf(sField[7]); } else { m_SatNum = 0; } if (sField[9].trim().length() > 0) { if (sField[11].trim().length() == 0) sField[11] = "0"; altitude = Double.valueOf(sField[9]) + Double.valueOf(sField[11]); dUndulation = Double.valueOf(sField[11]); } } if (sField[13].trim().length() > 0) { age = Integer.valueOf(sField[13]); } else { age = 99; } int m_Sec = 1, iSecOff = 0; int m_Hour = 1, m_Min = 1; if (sField[1].trim().length() >= 6) { m_Hour = Integer.valueOf(sField[1].substring(0, 2)); m_Min = Integer.valueOf(sField[1].substring(2, 4)); m_Sec = Integer.valueOf(sField[1].substring(4, 6)); } if (m_Sec > 59) { iSecOff = m_Sec - 59; m_Sec = 59; } if (m_Hour < 0 || m_Hour > 23 || m_Min < 0 || m_Min > 59 || iSecOff > 60) { return; } String sDate = String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, m_Hour, m_Min, m_Sec); gpsDate = DateUtil.GetLocalDate(DateUtil.parseDate(sDate)); Time = DateUtil.GetGPSTimeSpan(gpsDate) / 1000; deltTime = 1; m_TimeStamp = Time; } else if ((sField[0].equalsIgnoreCase("$GPGSA") || sField[0].equalsIgnoreCase("$GNGSA") || sField[0] .equalsIgnoreCase("$BDGSA")) && iFieldNum >= 17) { if (strGsa.trim() == "") { if (nmea.indexOf(",,") >= 11) strGsa = nmea.substring(11, nmea.indexOf(",,")); } else { if (nmea.indexOf(",,") >= 11) strGsa = String.format("%s,%s", strGsa, nmea.substring(11, nmea.indexOf(",,"))); } if (sField[15].trim().length() > 0) { pdop = Double.valueOf(sField[15]); } if (sField[16].trim().length() > 0) hdop = Double.valueOf(sField[16]); if (sField[17].trim().length() > 0 && sField[17].indexOf("*") != -1) { sField[17] = sField[17].substring(0, sField[17].indexOf("*")); if (sField[17].trim().length() > 0) vdop = Double.valueOf(sField[17]); } } else if (sField[0].equalsIgnoreCase("$GPRMC") || sField[0].equalsIgnoreCase("$GNRMC") || sField[0].equalsIgnoreCase("$GLRMC") || sField[0].equalsIgnoreCase("$BDRMC")) { if (sField[7].trim().length() > 0) { fSpeed_M_S = Double.valueOf(sField[7]) * 1.852 / 3600 * 1000; } if (sField[7].trim().length() > 0) { if (Double.valueOf(sField[7]) > 0.05) { if (sField[8].trim().length() > 0) heading = Double.valueOf(sField[8]); } } long m_Year = 1900, m_Month = 1, m_Day = 1; if (sField[9].trim().length() > 5) { m_Year = Integer.valueOf(sField[9].substring(4)); m_Month = Integer.valueOf(sField[9].substring(2, 4)); m_Day = Integer.valueOf(sField[9].substring(0, 2)); } if (m_Year >= 89) m_Year += 1900; else m_Year += 2000; if (m_Year < 1990 || m_Year > 2099 || m_Month < 1 || m_Month > 12 || m_Day < 1 || m_Day > 31) { m_Year = m_Month = m_Day = 0; return; } int m_Sec = 0, iSecOff = 0; int m_Hour = 1, m_Min = 1; if (sField[1].trim().length() >= 6) { m_Hour = Integer.valueOf(sField[1].substring(0, 2)); m_Min = Integer.valueOf(sField[1].substring(2, 4)); m_Sec = Integer.valueOf(sField[1].substring(4, 6)); } if (m_Sec > 59) { iSecOff = m_Sec - 59; m_Sec = 59; } if (m_Hour < 0 || m_Hour > 23 || m_Min < 0 || m_Min > 59 || iSecOff > 60) { return; } String sDate = String.format("%04d-%02d-%02d %02d:%02d:%02d", m_Year, m_Month, m_Day, m_Hour, m_Min, m_Sec); // Log.e("开始时间", sDate); year = (int) m_Year; month = (int) m_Month; day = (int) m_Day; gpsDate = DateUtil.GetLocalDate(DateUtil.parseDate(sDate)); m_TimeStamp = Time; } else if (sField[0].equalsIgnoreCase("$GPZDA") && iFieldNum >= 5) { long m_Year = 1900, m_Month = 1, m_Day = 1; if (sField[4].trim().length() > 0) { m_Year = Integer.valueOf(sField[4]); } if (sField[3].trim().length() > 0) { m_Month = Integer.valueOf(sField[3]); } if (sField[4].trim().length() > 0) { m_Day = Integer.valueOf(sField[2]); } if (m_Year < 1990 || m_Year > 2099 || m_Month < 1 || m_Month > 12 || m_Day < 1 || m_Day > 31) { return; } int m_Sec = 1, iSecOff = 0; int m_Hour = 1, m_Min = 1; if (sField[1].trim().length() >= 6) { m_Hour = Integer.valueOf(sField[1].substring(0, 2)); m_Min = Integer.valueOf(sField[1].substring(2, 4)); m_Sec = Integer.valueOf(sField[1].substring(4, 6)); } if (m_Sec > 59) { iSecOff = m_Sec - 59; m_Sec = 59; } if (m_Hour < 0 || m_Hour > 23 || m_Min < 0 || m_Min > 59 || iSecOff > 60) { return; } // Log.e("开始时间", sDate); year = (int) m_Year; month = (int) m_Month; day = (int) m_Day; String sDate = String.format("%04d-%02d-%02d %02d:%02d:%02d", m_Year, m_Month, m_Day, m_Hour, m_Min, m_Sec); gpsDate = DateUtil.GetLocalDate(DateUtil.parseDate(sDate)); utcDate = (DateUtil.parseDate(sDate)); Time = DateUtil.GetGPSTimeSpan(gpsDate) / 1000; m_TimeStamp = Time; } else if (sField[0].equalsIgnoreCase("$GPVTG") || sField[0].equalsIgnoreCase("$GNVTG") || sField[0].equalsIgnoreCase("$GLVTG") || sField[0].equalsIgnoreCase("$BDVTG")) { if (sField[8].trim() == ("K")) { fSpeed_M_S = Double.valueOf(sField[7]) * 1000 / 3600; } if (sField[7].trim().length() > 0) { if (Double.valueOf(sField[7]) > 0.05) { if (sField[1].trim().length() > 0) heading = Double.valueOf(sField[1]); } } } else if (sField[0].equalsIgnoreCase("$GPGSV") || sField[0].equalsIgnoreCase("$GNGSV")) { if (Integer.valueOf(sField[2]) == 1) { GSVIndex = 1; m_tSatNum = 0; GPSList.clear(); satelliteList.clear(); m_bUpdating = true; if (BDList.size() > 0) { bUsedBDS = true; for (int i = 0; i < BDList.size(); i++) { GpsSatelliteInfo sGPS = BDList.get(i); satelliteList.add(sGPS); m_tSatNum++; } } else { bUsedBDS = false; } if (GLONASSList.size() > 0) { bUsedGlonass = true; for (int i = 0; i < GLONASSList.size(); i++) { GpsSatelliteInfo sGPS = GLONASSList.get(i); satelliteList.add(sGPS); m_tSatNum++; } } else { bUsedGlonass = false; } } else GSVIndex++; if (Integer.valueOf(sField[2]) == GSVIndex) { int rec; for (int i = 0; i < 4; i++) { rec = i * 4 + 4; if (rec < iFieldNum) { if (sField[rec + 3].indexOf("*") != -1) { sField[rec + 3] = (sField[rec + 3].substring(0, sField[rec + 3].indexOf("*")));// } if (rec + 3 <= iFieldNum && (!sField[rec].equalsIgnoreCase("")) && (!sField[rec + 1].equalsIgnoreCase("")) && (!sField[rec + 3].equalsIgnoreCase(""))) { GpsSatelliteInfo sGPS = new GpsSatelliteInfo(); sGPS.setAzimuth(Short.valueOf(sField[rec + 2])); if (sField[rec + 1].indexOf(".") != -1) sField[rec + 1] = sField[rec + 1].substring(0, sField[rec + 1].indexOf(".")); sGPS.setElevation(Integer.valueOf(sField[rec + 1])); sGPS.setPrn(Integer.valueOf(sField[rec])); if (sField[rec + 3].indexOf(".") != -1) { sField[rec + 3] = sField[rec + 3].substring(0, sField[rec + 3].indexOf(".")); sGPS.setSnrL1(Integer.valueOf(sField[rec + 3])); } else { sGPS.setSnrL1(Integer.valueOf(sField[rec + 3]));// } sGPS.setbUsed(strGsa.contains(sField[rec])); GPSList.add(sGPS); satelliteList.add(sGPS); // m_SatNum++; m_tSatNum++; } // m_tSatNum++; } } } if (Integer.valueOf(sField[1]) == GSVIndex) { m_bUpdating = false; } } else if (sField[0].equalsIgnoreCase("$GLGSV")) { if (Integer.valueOf(sField[2]) == 1) { GLONASSList.clear(); GSVIndex = 1; m_bUpdating = true; } else GSVIndex++; if (Integer.valueOf(sField[2]) == GSVIndex) { int rec; for (int i = 0; i < 4; i++) { rec = i * 4 + 4; if (rec + 3 <= iFieldNum) { if (sField[rec + 3].indexOf("*") != -1) { sField[rec + 3] = (sField[rec + 3].substring(0, sField[rec + 3].indexOf("*")));// } if (sField[rec + 3].indexOf("*") != -1) { sField[rec + 3] = (sField[rec + 3].substring(0, sField[rec + 3].indexOf("*")));// } if ((!sField[rec].equalsIgnoreCase("")) && (!sField[rec + 1].equalsIgnoreCase("")) && (!sField[rec + 3].equalsIgnoreCase(""))) { GpsSatelliteInfo sGPS = new GpsSatelliteInfo(); sGPS.setAzimuth(Short.valueOf(sField[rec + 2])); if (sField[rec + 1].indexOf(".") != -1) sField[rec + 1] = sField[rec + 1].substring(0, sField[rec + 1].indexOf(".")); sGPS.setElevation(Integer.valueOf(sField[rec + 1])); sGPS.setPrn(Integer.valueOf(sField[rec])); if (sField[rec + 3].indexOf(".") != -1) { sField[rec + 3] = sField[rec + 3].substring(0, sField[rec + 3].indexOf(".")); sGPS.setSnrL1(Integer.valueOf(sField[rec + 3])); } else { sGPS.setSnrL1(Integer.valueOf(sField[rec + 3]));// } // sGPS.setSnrL1(Integer.valueOf(sField[rec + // 3]));// sGPS.setbUsed(strGsa.contains(sField[rec])); GLONASSList.add(sGPS); if (!bUsedGlonass) { satelliteList.add(sGPS); } } } } } if (Integer.valueOf(sField[1]) == GSVIndex) { m_bUpdating = false; } } else if (sField[0].equalsIgnoreCase("$BDGSV")) { if (Integer.valueOf(sField[2]) == 1) { BDList.clear(); GSVIndex = 1; m_bUpdating = true; } else GSVIndex++; if (Integer.valueOf(sField[2]) == GSVIndex) { int rec; for (int i = 0; i < 4; i++) { rec = i * 4 + 4; if (rec + 3 <= iFieldNum) { if (sField[rec + 3].indexOf("*") != -1) { sField[rec + 3] = (sField[rec + 3].substring(0, sField[rec + 3].indexOf("*")));// } if ((!sField[rec].equalsIgnoreCase("")) && (!sField[rec + 1].equalsIgnoreCase("")) && (!sField[rec + 3].equalsIgnoreCase(""))) { GpsSatelliteInfo sGPS = new GpsSatelliteInfo(); sGPS.setAzimuth(Short.valueOf(sField[rec + 2])); if (sField[rec + 1].indexOf(".") != -1) sField[rec + 1] = sField[rec + 1].substring(0, sField[rec + 1].indexOf(".")); sGPS.setElevation(Integer.valueOf(sField[rec + 1])); sGPS.setPrn((Integer.valueOf(sField[rec]))); if (sField[rec + 3].indexOf(".") != -1) { sField[rec + 3] = sField[rec + 3].substring(0, sField[rec + 3].indexOf(".")); sGPS.setSnrL1(Integer.valueOf(sField[rec + 3])); } else { sGPS.setSnrL1(Integer.valueOf(sField[rec + 3]));// } sGPS.setbUsed(strGsa.contains(sField[rec])); BDList.add(sGPS); // m_SatNum++; // m_tSatNum++; if (!bUsedBDS) { satelliteList.add(sGPS); } } // m_tSatNum++; } } } if (Integer.valueOf(sField[1]) == GSVIndex) { m_bUpdating = false; } } else if (((sField[0].equalsIgnoreCase("$GPGST")) || (sField[0] .equalsIgnoreCase("$GNGST"))) && iFieldNum >= 8) { if (sField[7].trim().length() > 0) { SigmaEast = Double.valueOf(sField[7]); } if (sField[6].trim().length() > 0) { SigmaNorth = Double.valueOf(sField[6]); } if (sField[8].indexOf("*") != -1) { sField[8] = (sField[8].substring(0, sField[8].indexOf("*")));// } if (sField[8].trim().length() > 0) { vrms = Double.valueOf(sField[8]); } hrms = Math.sqrt(SigmaEast * SigmaEast + SigmaNorth * SigmaNorth); rms = Math.sqrt(hrms * hrms + vrms * vrms); } } public double getVdop() { return vdop; } public double getHdop() { return hdop; } public double getPdop() { return pdop; } public double getHrms() { return hrms; } public double getVrms() { return vrms; } //纬度 public double getLatitude() { return latitude; } //经度 public double getLongitude() { return longitude; } //椭球高 public double getAltitude() { return altitude; } //解状态 public int getStatusType() { return gpsStatue; } //速度 public double getSpeed() { return fSpeed_M_S; } //方位角 航向角 public double getBearing() { return heading; } //可见卫星 public int getVisibleGnssCount() { return m_tSatNum; } //可视卫星 public int getLockGnssCount() { return m_SatNum; } //差分龄 public int getAge() { return age; } public Date getLocalTime() { return gpsDate; } public Date getUtcTime() { return utcDate; } public List<GpsSatelliteInfo> getSatelliteList(){ return satelliteList; } }
传递location的原始输出:
怎么调用呢,请看下文
package com.example.gpsstatus; import java.util.Iterator; import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.GpsStatus.Listener; import android.location.GpsStatus.NmeaListener; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; public class MainActivity extends Activity implements OnClickListener{ LocationManager mLocationManager; Location mlocation; TextView mTextView; TextView mTextView2; TextView mTextView3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView)findViewById(R.id.textView1); mTextView2 = (TextView)findViewById(R.id.textView2); mTextView3 = (TextView)findViewById(R.id.textView3); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); getLocation(); } public void getLocation(){ if(mLocationManager == null) mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, mLocationListener); mLocationManager.addNmeaListener(mNmeaListener); mLocationManager.addGpsStatusListener(mStatusChanged); } } // 卫星状态变化 Listener mStatusChanged = new Listener() { @Override public void onGpsStatusChanged(int arg0) { GpsStatus statues = mLocationManager.getGpsStatus(null); Iterator<GpsSatellite> iterator = statues.getSatellites().iterator(); GpsSatellite temSatellite = null; //这里列表长度就是有多少颗卫星 while (iterator.hasNext()) { temSatellite = iterator.next(); if (temSatellite.getSnr() <= 1E-2) { continue; } //Prn 就是卫星号 //Snr 信噪比 // Azimuth 方位角 //Elevation 高度角 String strResult = "getSnr:" + temSatellite.getSnr() + "\r\n" + "getElevation:" + temSatellite.getElevation() + "\r\n" + "getPrn:" + temSatellite.getPrn() + "\r\n" + "getAzimuth:" + temSatellite.getAzimuth() + "\r\n" + "usedInFix:" + temSatellite.usedInFix() + "\r\n"; Log.i("Show", strResult); if (mTextView3 != null) { mTextView3.setText(strResult); } } } }; //打开GPS设置 public void OpenGpsSettingEvent() { Intent callGPSSettingIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(callGPSSettingIntent); } LocationListener mLocationListener = new LocationListener() { @TargetApi(17) @Override public void onLocationChanged(Location mlocal) { if(mlocal == null) return; String strResult = "getAccuracy:" + mlocal.getAccuracy() + "\r\n" + "getAltitude:" + mlocal.getAltitude() + "\r\n" + "getBearing:" + mlocal.getBearing() + "\r\n" + "getElapsedRealtimeNanos:" + String.valueOf(mlocal.getElapsedRealtimeNanos()) + "\r\n" + "getLatitude:" + mlocal.getLatitude() + "\r\n" + "getLongitude:" + mlocal.getLongitude() + "\r\n" + "getProvider:" + mlocal.getProvider()+ "\r\n" + "getSpeed:" + mlocal.getSpeed() + "\r\n" + "getTime:" + mlocal.getTime() + "\r\n"; Log.i("Show", strResult); if (mTextView != null) { mTextView.setText(strResult); } } @Override public void onProviderDisabled(String arg0) { } @Override public void onProviderEnabled(String arg0) { } @Override public void onStatusChanged(String provider, int event, Bundle extras) { } }; //$GPGGA,072024.0,2307.582054,N,11321.928800,E,1,07,0.7,45.2,M,-4.0,M,,*76 //原始数据监听 NmeaListener mNmeaListener = new NmeaListener() { @Override public void onNmeaReceived(long arg0, String arg1) { GpsAnalysis.getInstance().processNmeaData(arg1); if(arg1.contains("GPGGA")){ Log.i("Show",arg1); String[] result = arg1.split(","); if(result != null && result.length >= 11){ mTextView2.setText(GetnSolutionState(Integer.parseInt(result[6]))); } } } }; private String GetnSolutionState(int nType) { String strSolutionState = ""; switch (nType) { case 0: strSolutionState = "无效解"; break; case 1: strSolutionState = "单点解"; break; case 2: strSolutionState = "差分解"; break; case 4: strSolutionState = "固定解"; break; case 5: strSolutionState = "浮点解"; break; default: strSolutionState = "" + nType; break; } return strSolutionState; } @Override protected void onDestroy() { super.onDestroy(); if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { mLocationManager.removeNmeaListener(mNmeaListener); mLocationManager.removeUpdates(mLocationListener); mLocationManager.removeGpsStatusListener(mStatusChanged); } } @Override protected void onResume() { getLocation(); super.onDestroy(); } @Override public void onClick(View arg0) { switch(arg0.getId()){ case R.id.button1: OpenGpsSettingEvent() ; break; case R.id.button2: startActivity(new Intent(this, SatellitesViewActivity.class)); break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.tip_text)); builder.setMessage(getString(R.string.exit_demo)); builder.setPositiveButton(getResources().getString(R.string.btn_sure), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { System.exit(0); } }); builder.setNegativeButton(getResources().getString(R.string.btn_cancer), null); builder.show(); } return super.onKeyDown(keyCode, event); } }
3,记得权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />