Android11:如何获取当前位置
Android 11: how to get current location
我想在用户单击某些内容时获取设备的当前位置。我不需要持续更新。
FusedLocationProviderClient.getLastLocation()
对我来说不是一个选项,因为它只是 returns 最后一个位置,它可能与当前位置不同,或者为 null,这比 doucentation 更频繁地发生我相信。
下面的这段代码,在 Android 10 之前,我希望它能完美地完成工作。在 Android 11,它不再工作了。
@RequiresPermission(value = Manifest.permission.ACCESS_FINE_LOCATION)
private fun locationPermissionGranted() {
val fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext())
//create location request
val locationRequest = LocationRequest.create().apply {
interval = 1000L
fastestInterval = 100L
numUpdates = 1
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
//create callback
val mLocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
useLocation(locationResult?.lastLocation)
fusedLocationProviderClient.removeLocationUpdates(this)
}
override fun onLocationAvailability(locationAvailability: LocationAvailability?) {
if (locationAvailability?.isLocationAvailable == false) {
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
fusedLocationProviderClient.removeLocationUpdates(this)
} else {
super.onLocationAvailability(locationAvailability)
}
}
}
//request location update
fusedLocationProviderClient
.requestLocationUpdates(locationRequest, mLocationCallback, Looper.getMainLooper())
.let { task ->
task.addOnCanceledListener {
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
}
task.addOnFailureListener { exception ->
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
}
task.addOnSuccessListener {}
}
}
On Android 11 onLocationResult
永远不会被调用。即使我删除了 onLocationAvailability
中的所有内容,onLocationResult
仍然不会被调用。
那么,如何在 Android 11 上正确请求设备当前位置?
编辑:
FusedLocationProviderClient.getCurrentLocation()
也不行。 None 的任务回调正在被调用。
我错了。 FusedLocationProviderClient.getCurrentLocation()
和 FusedLocationProviderClient.requestLocationUpdates()
都在 Android 11 上工作。除非用户有“Wi-Fi 扫描”、“蓝牙扫描”和最重要的“Google 定位精度”已打开。用户激活“使用位置”是不够的。
我想在用户单击某些内容时获取设备的当前位置。我不需要持续更新。
FusedLocationProviderClient.getLastLocation()
对我来说不是一个选项,因为它只是 returns 最后一个位置,它可能与当前位置不同,或者为 null,这比 doucentation 更频繁地发生我相信。
下面的这段代码,在 Android 10 之前,我希望它能完美地完成工作。在 Android 11,它不再工作了。
@RequiresPermission(value = Manifest.permission.ACCESS_FINE_LOCATION)
private fun locationPermissionGranted() {
val fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext())
//create location request
val locationRequest = LocationRequest.create().apply {
interval = 1000L
fastestInterval = 100L
numUpdates = 1
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
//create callback
val mLocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
useLocation(locationResult?.lastLocation)
fusedLocationProviderClient.removeLocationUpdates(this)
}
override fun onLocationAvailability(locationAvailability: LocationAvailability?) {
if (locationAvailability?.isLocationAvailable == false) {
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
fusedLocationProviderClient.removeLocationUpdates(this)
} else {
super.onLocationAvailability(locationAvailability)
}
}
}
//request location update
fusedLocationProviderClient
.requestLocationUpdates(locationRequest, mLocationCallback, Looper.getMainLooper())
.let { task ->
task.addOnCanceledListener {
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
}
task.addOnFailureListener { exception ->
Toast.makeText(context, R.string.error_couldnt_get_location, Toast.LENGTH_SHORT).show()
}
task.addOnSuccessListener {}
}
}
On Android 11 onLocationResult
永远不会被调用。即使我删除了 onLocationAvailability
中的所有内容,onLocationResult
仍然不会被调用。
那么,如何在 Android 11 上正确请求设备当前位置?
编辑:
FusedLocationProviderClient.getCurrentLocation()
也不行。 None 的任务回调正在被调用。
我错了。 FusedLocationProviderClient.getCurrentLocation()
和 FusedLocationProviderClient.requestLocationUpdates()
都在 Android 11 上工作。除非用户有“Wi-Fi 扫描”、“蓝牙扫描”和最重要的“Google 定位精度”已打开。用户激活“使用位置”是不够的。