Нужно ли инициализировать FusedLocationProviderClient? местоположение часто отсутствует - PullRequest
0 голосов
/ 03 августа 2020

Я использую FusedLocationProviderClient для определения местоположения по GPS, но я заметил, что это часто null, особенно при первых двух запросах местоположения. Требуется ли инициализация, чтобы он смог определить местоположение с первой попытки? Вот код, который я использую, который иногда работает, но никогда не кажется в первый раз.

val locationManager: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
if((ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) && (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))) == PackageManager.PERMISSION_GRANTED) {
    var fusedLocationProviderClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
    fusedLocationProviderClient.lastLocation.addOnCompleteListener(this) { task ->
        val location: Location? = task.result
            if(location != null) {
                latitude = location.latitude.toString()
                longitude = location.longitude.toString()
            } else {
                val locationRequest = LocationRequest()
                locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
                locationRequest.interval = 0
                locationRequest.fastestInterval = 0
                locationRequest.numUpdates = 1
                fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
                fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallBack, Looper.myLooper())
            }
        }
    }
}

private val locationCallBack = object : LocationCallback() {
    override fun onLocationResult(p0: LocationResult) {
        val location: Location? = p0?.lastLocation

        if(location != null) {
            latitude = location.latitude.toString()
            longitude = location.longitude.toString()
        }    
    }
}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

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

build.gradle
...
dependencies {
    implementation 'com.google.android.gms:play-services-location:17.0.0'
}
...
Androidmanifest.xml
...
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- I think this is required for Android 10 (API 29) + -->
...
class ClassName : AppCompatActivity() {
    private lateinit var fusedLocationClient: FusedLocationProviderClient
    private val locationCallBack: LocationCallback = object : LocationCallback() {
        override fun onLocationResult(p0: LocationResult?) {
            val location: Location? = p0?.lastLocation
            if(location != null) {
                latitude = location.latitude.toString()
                longitude = location.longitude.toString()
            }
        }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        getLocation()
        ...
    }
    private fun getLocation() {
        if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            val locationManager: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
            if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                fusedLocationClient.lastLocation.addOnCompleteListener(this) { task ->
                    val location: Location? = task.result
                    if(location == null)
                        requestLocation()
                    else {
                        latitude = location.latitude.toString()
                        longitude = location.longitude.toString()
                    }
                }
            }
        }
    }
    private fun requestLocation() {
        val locationRequest = LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 0
        locationRequest.fastestInterval = 0
        locationRequest.numUpdates = 1
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallBack, Looper.myLooper())
    }
}
0 голосов
/ 03 августа 2020

Последнее известное местоположение - это кэшированное значение, которое время от времени стирается (например, после перезагрузки телефона). Если вам нужен более надежный способ определения местоположения по GPS, запросите обновления местоположения и откажитесь от подписки, как только получите первый результат.

...