Android 11:如何获取当前位置

问题描述

当用户单击某些内容时,我想获取设备的当前位置。我不需要持续更新。

FusedLocationProviderClient.getLastLocation()对我来说不是一个选择,因为它仅返回最后一个位置,该位置可能与当前位置不同,或者返回null,这比双引号使我相信的发生频率更高。

下面的代码可以完成我想要的工作,直到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,Toast.LENGTH_SHORT).show()
            }
            task.addOnFailureListener { exception ->
                Toast.makeText(context,Toast.LENGTH_SHORT).show()
            }
            task.addOnSuccessListener {}
        }
}

在Android 11 onLocationResult上永远不会被调用。即使我删除了onLocationAvailability中的所有内容,onLocationResult仍然不会被调用。

那么,如何在Android 11上正确请求设备的当前位置?

编辑:

FusedLocationProviderClient.getCurrentLocation()也不起作用。没有调用该任务的回调。

解决方法

我错了。 FusedLocationProviderClient.getCurrentLocation()FusedLocationProviderClient.requestLocationUpdates()都可以在Android 11上运行。除非用户启用了“ Wi-Fi扫描”,“蓝牙扫描”以及最重要的是“ Google位置准确性”,否则它们的运行速度非常慢。用户仅激活“使用位置”是不够的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...