Android 11:如何获取当前位置

Posted

技术标签:

【中文标题】Android 11:如何获取当前位置【英文标题】:Android 11: how to get current location 【发布时间】:2021-02-05 13:28:01 【问题描述】:

我想在用户点击某物时获取设备的当前位置。我不需要持续更新。

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, 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 
        

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

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

编辑:

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

【问题讨论】:

在我的情况下,直到我将“numUpdates = 1”更改为“numUpdates = 2”后它才起作用,但这对我来说是个谜 【参考方案1】:

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

【讨论】:

速度在我看来是一样的。关于你为什么回答这个问题的任何细节?

以上是关于Android 11:如何获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章

如何获取当前位置android?

Android:如何获取经度和纬度的当前位置?

如何在android的地图中获取当前位置?

如何在android中获取当前坐标/位置

Android:如何使用 GPS 提供程序获取离线当前位置?

如何获取android移动设备的当前位置经纬度?