Слушатель NMEA называется до тех пор, пока не будет установлено местоположение Android - PullRequest
1 голос
/ 04 июля 2019

В настоящее время я разрабатываю приложение GPS, в котором мне нужна степень направления.Когда я добавляю nmea слушатель, он вызывается только один раз.Я использую это и это ссылки.Но проблема в том, что, кажется, nmea слушатель работает только один раз.

class MainActivity : AppCompatActivity() {

private lateinit var locationManager: LocationManager

private var mOnNmeaMessageListener: OnNmeaMessageListener? = null

private var mLegacyNmeaListener: NmeaListener? = null

companion object {
    private const val PERMISSION_REQUEST_CODE = 1
    var counter  = 0
}


private fun nmeaProgress(rawNmea: String) {

    println("it is $rawNmea")
    //Here is the sample protocol example of   //$GPRMC,061244.00,A,4120.913656,N,06914.245043,E,1.0,118.8,040719,4.6,E,A*3F


    val rawNmeaSplit = rawNmea.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

    if (rawNmeaSplit[0].equals("\$GPRMC", ignoreCase = true)) {
        counter++
        val myString = rawNmeaSplit[0] + " , " + rawNmeaSplit[1] + " , " + rawNmeaSplit[2] + " , " +
                        rawNmeaSplit[3] + " , " + rawNmeaSplit[4] + " , " + rawNmeaSplit[5] + " , " +
                        rawNmeaSplit[6] + " , " + rawNmeaSplit[7] + " , " + rawNmeaSplit[8] + " , " +
                        rawNmeaSplit[9] + " , " + rawNmeaSplit[10] + " , " + rawNmeaSplit[11] + " , " + rawNmeaSplit[12] + ", $counter"
        message.text = myString

        val latitude = "Latitude: ${rawNmeaSplit[3]}"
        val longitude = "Longitude: ${rawNmeaSplit[5]}"
        val velocity = "Speed : ${rawNmeaSplit[7]}"
        val deg = "Degree : ${rawNmeaSplit[8]}"


        lat.text = longitude
        lng.text = latitude
        speed.text = velocity
        degree.text = deg

    }

}



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    init()
}

private fun init() {
    val msg = "Data not received yet"
    lat.text = msg
    locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
}


@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (grantResults.size != permissions.size) {
        Toast.makeText(this, "Please grant all permission", Toast.LENGTH_SHORT).show()
        finish()
    } else {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0.0f, locationListener)
        addNmeaListener()
    }

}

private val locationListener: LocationListener = object : LocationListener {
    override fun onLocationChanged(location: Location?) {


        //Will be implemented later

    }

    override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
        //
    }

    override fun onProviderEnabled(provider: String?) {
        //
    }

    override fun onProviderDisabled(provider: String?) {
        //
    }

}



override fun onResume() {
    super.onResume()
    requestUpdate()
}

private fun requestUpdate() {
    val list = arrayListOf<String>()

    if (ContextCompat.checkSelfPermission(
            applicationContext,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        list.add(Manifest.permission.ACCESS_FINE_LOCATION)
    } else if (ContextCompat.checkSelfPermission(
            applicationContext,
            Manifest.permission.ACCESS_COARSE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        list.add(Manifest.permission.ACCESS_COARSE_LOCATION)
    }

    val array = arrayOfNulls<String>(list.size)
    list.toArray(array)
    if (list.isEmpty()) {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0.0f, locationListener)
        //setNmeaListener()
        addNmeaListener()

    } else {
        ActivityCompat.requestPermissions(
            this,
            array,
            PERMISSION_REQUEST_CODE
        )
    }
}
private fun addNmeaListener() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        addNmeaListenerAndroidN()
    } else {
        addLegacyNmeaListener()
    }
}


@SuppressLint("MissingPermission")
@RequiresApi(api = Build.VERSION_CODES.N)
private fun addNmeaListenerAndroidN() {
    if (mOnNmeaMessageListener == null) {
        mOnNmeaMessageListener = OnNmeaMessageListener { message, timestamp ->
            nmeaProgress(message)
        }
    }
    locationManager.addNmeaListener(mOnNmeaMessageListener)
}


@SuppressLint("MissingPermission")
private fun addLegacyNmeaListener() {
    if (mLegacyNmeaListener == null) {
        mLegacyNmeaListener = NmeaListener { timestamp, nmea ->
            nmeaProgress(nmea)
        }
    }
    locationManager.addNmeaListener(mLegacyNmeaListener)
}

override fun onPause() {
    super.onPause()

    locationManager.removeUpdates(locationListener)

    removeNmeaListener()
}

private fun removeNmeaListener() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        if (mOnNmeaMessageListener != null) {
            locationManager.removeNmeaListener(mOnNmeaMessageListener)
        }
    } else {
        if (mLegacyNmeaListener != null) {
            locationManager.removeNmeaListener(mLegacyNmeaListener)
        }
    }
}

}

Пожалуйста, обратите внимание, что подшипник не является решением

ОБНОВЛЕНИЕ

Я проверил сейчас Проблема более понятна.Он работает и получает данные отлично.Проблема возникнет при обновлении пользовательского интерфейса (настройка этих данных на соответствующий TextView).Поступающие данные анализируются и помещаются в TextView, если местоположение не установлено GPS без каких-либо проблем.Но когда LOCATION SET BY GPS , пользовательский интерфейс не обновляется.если снова GPS ищет местоположение, тогда обновление пользовательского интерфейса работает должным образом.Я проверяю это, добавляя статический счетчик и логи

Он отлично работает

Любая помощь или предложение приветствуются.Заранее спасибо

1 Ответ

0 голосов
/ 06 июля 2019

Теперь я узнал решение.Проблема с протоколом Nmea.GPRMC используется, когда местоположение еще не зафиксировано.После исправления местоположения GPRMC больше не используется, вместо этого можно обратиться к протоколу GNRMC.Но нужно позаботиться о том, какая служба определения местоположения устанавливает свое местоположение (GPS, GLONASS, GALILEO?).В этом случае я могу свободно взять GNRMC, так как он широко доступен.

...