Android FusedLocationClient.getLastLocation(),在成功时从未到达

Android FusedLocationClient.getLastLocation(),在成功时从未到达,android,Android,我已经成功地使用FusedLocation获取设备之前最后一个已知的位置,但我不确定为什么它在这种情况下不起作用 我已经在物理设备和模拟设备上对其进行了测试 我实现了播放服务,并在清单中声明了所需的权限。 我还检查了我的应用程序的设备权限,启用了位置,并使用谷歌地图确保有最后一个已知位置 我声明私有FusedLocationProviderClient fusedLocationClient在我的MainActivity类中 在主活动onCreate()中:FusedLocationClient

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

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

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

我声明
私有FusedLocationProviderClient fusedLocationClient在我的MainActivity类中

在主活动onCreate()中:
FusedLocationClient=LocationServices.getFusedLocationProviderClient(此)

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

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) {

                    }
                }
if(id==R.id.action\u GPS){
fusedLocationClient.getLastLocation().addOnSuccessListener(这是新的OnSuccessListener()){
@凌驾
成功时的公共无效(位置){
如果(位置!=null){
Geocoder gcd=新的Geocoder(上下文,Locale.getDefault());
试一试{
列表adrs=gcd.getFromLocation(location.getLatitude(),location.getLatitude(),1);
}捕获(IOE异常){
}
}

通过“fusedLocationClient.getLastLocation()…”进行调试后,它会跳到末尾,永远不会到达onSuccess方法。为什么会失败?

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

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

当lastLocation==null时,您应该请求LocationUpdate。您可以使用

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.
                }
            }
        }

别忘了检查用户的权限

我会选择Cườ吴恩圭ễn的建议,并添加一些日志记录,即使位置为空。然后,您可能可以进一步调试该问题。事实上,当我自己从未请求位置更新时,我也遇到过类似的问题。这是否回答了您的问题?我最终只是发出位置请求。考虑到FusedLocation的不一致性,我真的不明白它的意义