Advertisement

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)

还没有任何评论哟~