【问题标题】:FusedLocationProviderClient crash with java.lang.NullPointerException: parameter location specified as non-null is nullFusedLocationProviderClient 崩溃并出现 java.lang.NullPointerException:指定为非 null 的参数位置为 null
【发布时间】:2022-01-10 20:37:27
【问题描述】:

我在我的应用程序中使用 FusedLocationProviderClient,它可以很好地获取用户当前位置,但突然我遇到了这个崩溃

java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter location

这是我在我的活动中定义它的方式

private lateinit var fusedLocationClient: FusedLocationProviderClient

//

fusedLocationClient =
                    LocationServices.getFusedLocationProviderClient(this)

// 崩溃发生在 (addOnSuccessListener) 上的下一个代码上

fusedLocationClient.lastLocation
            .addOnSuccessListener { location ->
                    lat = location.latitude
                    lng = location.longitude
                    goToLocationOnMap(LatLng(lat, lng))
            }

【问题讨论】:

    标签: java android kotlin android-gps fusedlocationproviderclient


    【解决方案1】:

    Task.OnSuccessListener 是一个 Java class,没有参数可空性注释(@NotNull@Null)。因此,Kotlin 无法确定该类型是可空的还是不可空的,并且编译器不会抱怨 location 的不安全使用(例如,location.latitude 而不是 location?.latitude)。

    根据docs,位置可以是null的可能有3种情况:

    • 设备设置中的位置已关闭。即使先前检索到最后一个位置,结果也可能为空,因为禁用位置也会清除缓存。
    • 设备从未记录其位置,可能是新设备或已恢复出厂设置的设备。
    • 设备上的 Google Play 服务已重新启动,并且在服务重新启动后没有活动的 Fused Location Provider 客户端请求位置。

    总结:明确声明可空性并处理空场景.addOnSuccessListener { location: Location? -> /* null-safe code here */ }

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多