FusedLocationProviderClient 需要初始化吗?位置通常为空
Posted
技术标签:
【中文标题】FusedLocationProviderClient 需要初始化吗?位置通常为空【英文标题】:Does FusedLocationProviderClient need to initialize? location often null 【发布时间】:2020-11-23 03:56:39 【问题描述】:我正在使用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()
【问题讨论】:
【参考方案1】:最后一个已知位置是一个不时擦除的缓存值(例如,在手机重启后)。如果您想以更持久的方式获取 GPS 位置,请request location updates 并在获得第一个结果后立即取消订阅。
【讨论】:
【参考方案2】:我找不到我现在使用的教程,但能够使用以下代码使其工作。下面的代码是为未来孤独的 *** 旅行者准备的。
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())
【讨论】:
以上是关于FusedLocationProviderClient 需要初始化吗?位置通常为空的主要内容,如果未能解决你的问题,请参考以下文章