如何在Android(Kotlin)的onSuccessListener之外分配位置坐标?

时间:2019-04-19 18:26:05

标签: android kotlin location android-location fusedlocationproviderclient

我正在尝试获取Android设备的位置。我一直在关注these instructions for using fusedLocationClient

我无法在.addSuccessListener之外分配变量。

我将在事件侦听器内部的日志之前调用侦听器外部的日志,因此我必须在调用侦听器之前尝试分配变量。这是有道理的,因为侦听器是异步的。

override fun onMapReady() {
        var loc: Location = Location("")
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        fusedLocationClient.lastLocation
            .addOnSuccessListener { location : Location ->
                loc = location
                Log.i("Lat, Long",loc.latitude.toString() + ", " +  loc.longitude.toString()) // this correctly logs the latitude and longitude

            }

        Log.i("Lat, Long",loc.latitude.toString() + " " + loc.longitude.toString()) // this logs latitude and longitude as (0.0,0.0)
}

我尝试将融合位置客户端初始化放在onCreate()中,并将融合位置客户端作为私有属性:


    private fusedLocationClient: FusedLocationProviderClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_display_map)

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        fusedLocationClient.lastLocation
            .addOnSuccessListener { location : Location ->
                loc = location
                Log.e(loc.latitude.toString(), loc.longitude.toString())
            }
    }

我也在onResume中尝试过,但还是没有运气。

1 个答案:

答案 0 :(得分:0)

loc属性作为委派属性:

var loc: Location? by Delegates.observable(null as? Location){
        _, _, newLoc ->
       // log
}

此代表可以帮助您观察对该属性的任何更改