Показания NMEA пустые на Android LG - PullRequest
0 голосов
/ 10 июля 2020

хорошо, у меня проблема в том, что я пытаюсь получить показания NMEA с устройства Android LG-K530. Для этого я пробовал этот код:

    LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 2, new LocationListener() {
            @Override
            public void onProviderDisabled(String provider) {
                showDialog(R.string.playservices_disabled_ttl, R.drawable.ic_action_locate, R.string.playservices_disabled_msg, Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            }

            @Override
            public void onProviderEnabled(String provider) {
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onLocationChanged(Location location) {

            }
        });
    LM.addNmeaListener(new GpsStatus.NmeaListener() {
             public void onNmeaReceived(long timestamp, String nmea) {
                  // Process NMEA reading
             }
        });

И что-то вроде этого:

    private GpsStatus.NmeaListener nmeaListener = null;
    private GpsStatus.Listener gpsStatusListener = null;
    private TextView txtGPS_Quality = null;
    private TextView txtGPS_Location = null;
    private TextView txtGPS_Satellites = null;

    private Handler mHandler = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvUbicacion = (TextView) findViewById(R.id.tvUbication);
        btnGPS = (Button) findViewById(R.id.button);

        btnGPS.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LocationManager locationManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);

                LocationListener locationListener = new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        System.out.println("test:::" + location);
                        String temp = convertNmeaRMC(location);
                        System.out.println("nmea::::" + temp);
                        tvUbicacion.setText("" + location.getLatitude() + " " + location.getLongitude());
                    }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {

                    }

                    @Override
                    public void onProviderEnabled(String provider) {

                    }

                    @Override
                    public void onProviderDisabled(String provider) {

                    }
                };
                int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.ACCESS_FINE_LOCATION);
                System.out.println("Provider::::" + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
                if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                }else{
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,0,locationListener);
                }
            }
        });

        int permissionCheck = ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION);

        if (permissionCheck == PackageManager.PERMISSION_DENIED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.ACCESS_FINE_LOCATION)) {

            } else {

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        1);
            }
        }
        registerListener();
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

        try {
            //noinspection JavaReflectionMemberAccess|
            Method addNmeaListener =
                    LocationManager.class.getMethod("addNmeaListener", GpsStatus.NmeaListener.class);
            ((Method) addNmeaListener).invoke(locationManager, nmeaListener);
        } catch (Exception exception) {
            // TODO
        }

    }

    private void registerListener() {
            locationListener=new LocationListener(){

                @Override
                public void onLocationChanged(Location loc) {
                    // TODO Auto-generated method stub
                    Log.d("GPS-NMEA1", loc.getLatitude() + "," +  loc.getLongitude());
                }

                @Override
                public void onProviderDisabled(String provider) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onProviderEnabled(String provider) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                    // TODO Auto-generated method stub
                    Log.d("GPS-NMEA2", provider + "");
                    switch (status) {
                        case LocationProvider.OUT_OF_SERVICE:
                            Log.d("GPS-NMEA3","OUT_OF_SERVICE");
                            break;
                        case LocationProvider.TEMPORARILY_UNAVAILABLE:
                            Log.d("GPS-NMEA4"," TEMPORARILY_UNAVAILABLE");
                            break;
                        case LocationProvider.AVAILABLE:
                            Log.d("GPS-NMEA5","" + provider + "");

                            break;
                    }

                }

            };
//
        nmeaListener = new GpsStatus.NmeaListener() {
            public void onNmeaReceived(long timestamp, String nmea) {
                //check nmea's checksum
                if (isValidForNmea(nmea)){
                    nmeaProgress(nmea);
                    Log.d("GPS-NMEA6", nmea);
                }

            }
        };
    }

И ответ, который я получаю от LG, выглядит примерно так:

D/GPS-NMEA6: $GLGSV,3,1,10,74,54,306,,70,28,037,,82,,,,73,76,175,*54
D/GPS-NMEA6: $GLGSV,3,2,10,80,14,142,,65,00,215,,88,,,,81,,,*63
D/GPS-NMEA6: $GLGSV,3,3,10,71,80,071,,72,41,210,*6F
D/GPS-NMEA6: $GPGSV,3,1,11,02,01,300,,04,,,,05,48,251,,06,,,*76
D/GPS-NMEA6: $GPGSV,3,2,11,07,50,133,,08,10,111,,09,32,073,,11,,,*4F
D/GPS-NMEA6: $GPGSV,3,3,11,13,22,237,,15,,,,16,,,*4E
D/GPS-NMEA6: $GPVTG,,T,,M,,N,,K,N*2C
D/GPS-NMEA6: $GPRMC,,V,,,,,,,,,,N*53
D/GPS-NMEA6: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
D/GPS-NMEA6: $GNGSA,A,1,,,,,,,,,,,,,,,*00
D/GPS-NMEA6: $GLGSV,3,1,10,74,54,306,,70,28,037,,82,,,,73,76,175,*54
D/GPS-NMEA6: $GLGSV,3,2,10,80,14,142,,65,00,215,,88,,,,81,,,*63
D/GPS-NMEA6: $GLGSV,3,3,10,71,80,071,,72,41,210,*6F
D/GPS-NMEA6: $GPGSV,3,1,11,02,01,300,,04,,,,05,48,251,,06,,,*76
    $GPGSV,3,2,11,07,50,133,,08,10,111,,09,32,073,,11,,,*4F
D/GPS-NMEA6: $GPGSV,3,3,11,13,22,237,,15,,,,16,,,*4E
    $GPVTG,,T,,M,,N,,K,N*2C
    $GPRMC,,V,,,,,,,,,,N*53
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
D/GPS-NMEA6: $GNGSA,A,1,,,,,,,,,,,,,,,*00

Из того, что я читал, часть $GPRMC - это то, что мне нужно, но оно пустое.

У меня это $GPRMC,,V,,,,,,,,,,N*53

Вместо этого $GPRMC,14122328.92,A,6602.012343,S,01232.945616,W,000.7,112.7,090720,,,A*50

Я тестировал несколько устройств, LG-K530, Samsung A8 и Moto G8 Plus, и на всех из них я получил одинаковый результат с NMEA. Но в Samsung S7 edge у меня есть правильный кадр NMEA, использующий GPS_PROVIDER и похожий на второй пример $GPRMC.

Я тестировал изменение провайдера LocationManager на NETWORK_PROVIDER и получаю местоположение и используя функцию, я могу создать что-то вроде кадра NMEA, но мне нужен NMEA от GPS любых устройств.

Что-то мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...