FusedLocationClient.getLastLocation(),永远不会到达 onSuccess

Posted

技术标签:

【中文标题】FusedLocationClient.getLastLocation(),永远不会到达 onSuccess【英文标题】:FusedLocationClient.getLastLocation(), never reaches onSuccess 【发布时间】:2020-04-12 14:11:26 【问题描述】:

我之前已成功使用 FusedLocation 获取设备的最后已知位置,但我不确定为什么它在这种情况下不起作用。

我已经在物理设备和模拟设备上对其进行了测试。

我实现了播放服务,并在清单中说明了所需的权限。 我还检查了我的应用的设备权限,启用了位置,并使用 Google 地图确保有最后一个已知位置。

我在我的 MainActivity 类中声明private FusedLocationProviderClient fusedLocationClient;

在主Activity onCreate():FusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

现在我正在尝试检索用户从选项菜单中选择项目时的最后一个已知位置。

if(id == R.id.action_GPS)

        fusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() 
            @Override
            public void onSuccess(Location location) 
                if(location != null) 
                    Geocoder gcd = new Geocoder(context, Locale.getDefault());
                    try 
                        List<Address> adrs = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);

                     catch (IOException e) 

                    
                

在对“fusedLocationClient.getLastLocation()...”进行调试后,它会跳到最后,永远不会到达 onSuccess 方法。为什么会失败?

【问题讨论】:

我会接受 Cường Nguyễn 的建议并添加一些日志记录,即使位置为空。然后,您也许可以进一步调试问题。实际上,当我自己从未请求过位置更新时,我也遇到了类似的问题。 这能回答你的问题吗? fusedLocationProviderClient.lastLocation.addOnSuccessListener always null 我最终只是提出了位置请求。考虑到 FusedLocation 的不一致,并没有真正看到它的意义 【参考方案1】:

location对象在以下情况下可能为null:

位置在设备设置中被关闭。结果可能是 null 即使之前检索到最后一个位置,因为禁用位置也会清除缓存。 设备从未记录其位置,可能是新设备或已恢复出厂设置的设备。 设备上的 Google Play 服务已重新启动,并且在服务重新启动后没有活动的 Fused Location Provider 客户端请求位置。为避免这种情况,您可以创建 新客户并请求自己更新位置。

你应该在 lastLocation == null 时请求LocationUpdates

【讨论】:

【参考方案2】:

您可以使用检查 GPS 是否处于活动状态

val client = LocationServices.getSettingsClient(this)
        val task = client.checkLocationSettings(builder.build())
        task.addOnSuccessListener 
            //GPS is ON
        
        task.addOnFailureListener 
            if (it is ResolvableApiException) 
                try 
                       //GPS is OFF
                    Toast.makeText(this, "Mohon aktifkan GPS anda",
                            Toast.LENGTH_LONG).show()
                 catch (sendEx: IntentSender.SendIntentException) 
                    // Ignore the error.
                
            
        

别忘了检查用户的权限

【讨论】:

以上是关于FusedLocationClient.getLastLocation(),永远不会到达 onSuccess的主要内容,如果未能解决你的问题,请参考以下文章