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

时间:2019-12-20 01:32:43

标签: android

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

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

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

我在MainActivity类中声明private FusedLocationProviderClient fusedLocationClient;

在主要活动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方法。为什么会失败?

2 个答案:

答案 0 :(得分:1)

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

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

lastLocation == null时,您应该请求LocationUpdates

答案 1 :(得分:0)

您可以使用以下方法检查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.
                }
            }
        }

也不要忘记检查用户的权限