Android app开发:获取卫星定位核心代码-Beidou Gps Glonass Galileo都支持
发布时间
阅读量:
阅读量
该应用通过NMEA协议监听位置数据,支持多种卫星系统(如北斗、GPS、格洛纳斯)进行定位,能够解析GNGGA和GNRMC等数据格式,并将解析结果更新至BaseApplication。该功能确保在任意卫星数据可用时即可获取定位信息。
private void initLocation() {
mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Log.d(TAG, "wjz debug initLocation: providers = " + providers);
String locationProvider;
if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
Log.d(TAG, "wjz debug initLocation: 网络定位");
locationProvider = LocationManager.NETWORK_PROVIDER;
} else if (providers.contains(LocationManager.GPS_PROVIDER)) {
Log.d(TAG, "wjz debug initLocation: GPS定位");
locationProvider = LocationManager.GPS_PROVIDER;
} else {
Log.e(TAG, "wjz debug initLocation: 没有可用的位置提供器");
return;
}
//需要检查权限, 否则编译报错
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//获取上次的位置,一般第一次运行此值为null
Location location = mLocationManager.getLastKnownLocation(locationProvider);
if (location != null) {
setLocation(location);
}
}
public void update() {
try {
//需要检查权限, 否则编译报错
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//监视地理位置变化,第二个和第三个参数分别为更新的最短时间和最短距离
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0.001f, mLocationListener);
mLocationManager.addNmeaListener(mNmeaListener);
} catch (Exception e) {
e.printStackTrace();
}
}
private final GpsStatus.NmeaListener mNmeaListener = new GpsStatus.NmeaListener() {
@Override
public void onNmeaReceived(long arg0, String arg1) {
try {
//nmea数据: $GNGGA,062740.981,2223.2426,N,11332.8452,E,0,0,,7.7,M,-4.1,M,,*48
//nmea数据: $GNRMC,070518.000,A,2223.2434,N,11332.8306,E,2.295,195.60,290623,,,A*4F
Log.d(TAG, "wjz debug onNmeaReceived: nmea数据: " + arg1);
//经度格式:ddmm.mmmm(度分)格式
//纬度格式:dddmm.mmmm(度分)格式
//解析定位数据
//$GNGGA: 卫星定位信息
DecimalFormat decimalFormat = new DecimalFormat("0.000000");
if (arg1.startsWith("$GNGGA")) {
Log.d(TAG, "wjz debug onNmeaReceived: 解析卫星定位信息==============================$GNGGA==============================");
String[] datas = arg1.split(",", -1);
double wd = 0, jd = 0;
if (datas[2].trim().length() > 3) {
wd = field2Double(datas[2].substring(0, 2)) + field2Double(datas[2].substring(2)) / 60;
}
if (datas[4].trim().length() > 4) {
jd = field2Double(datas[4].substring(0, 3)) + field2Double(datas[4].substring(3)) / 60;
}
String jwd = "经度: " + decimalFormat.format(jd) + "° 纬度: " + decimalFormat.format(wd) + "°";
Log.d(TAG, "wjz debug onNmeaReceived: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>位置更新, " + jwd);
BaseApplication.set("XML_JWD", jwd);
}
//$GNRMC:推荐定位信息
if (arg1.startsWith("$GNRMC")) {
Log.d(TAG, "wjz debug onNmeaReceived: 解析推荐定位信息==============================$GNRMC==============================");
String[] datas = arg1.split(",", -1);
if ("A".equals(datas[2])) {
double wd = 0, jd = 0;
if (datas[3].trim().length() > 3) {
wd = field2Double(datas[3].substring(0, 2)) + field2Double(datas[3].substring(2)) / 60;
}
if (datas[5].trim().length() > 4) {
jd = field2Double(datas[5].substring(0, 3)) + field2Double(datas[5].substring(3)) / 60;
}
String jwd = "经度: " + decimalFormat.format(jd) + "° 纬度: " + decimalFormat.format(wd) + "°";
Log.d(TAG, "wjz debug onNmeaReceived: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>位置更新, " + jwd);
BaseApplication.set("XML_JWD", jwd);
}
}
} catch (Exception e) {
Log.e(TAG, "wjz debug onNmeaReceived: error is " + e.getMessage());
e.printStackTrace();
}
}
};
private double field2Double(String field) {
double value = 0.0;
if (!TextUtils.isEmpty(field)) {
value = Double.parseDouble(field);
}
return value;
}
核心要素:监听nmea数据,根据卫星数据协议解析数据
该方式可具备在任意卫星数据可用时即可实现定位获取,该系统支持Beidou、GPS、GLONASS及Galileo等卫星导航系统。
nmea 0813协议:
https://www.cnblogs.com/hhm-master/p/14702814.html
全部评论 (0)
还没有任何评论哟~
