В настоящее время я разрабатываю приложение 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 ищет местоположение, тогда обновление пользовательского интерфейса работает должным образом.Я проверяю это, добавляя статический счетчик и логи
Он отлично работает
Любая помощь или предложение приветствуются.Заранее спасибо