我确实想要达到相同的目标,现在你可以通过 LocationCallback
中可用的许多其他信息来实现这一点。我已经启用了一个用于获取位置的 Service
,因此 LocationCallback
放置在我的服务类 LocationService
中。
为此,您必须按照以下所述调用 LocationCallback
对象:
private lateinit var locationCallback: LocationCallback
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
if (locationResult.lastLocation != null) {
val location = locationResult.lastLocation
val intent = Intent(ACTION_LOCATION_UPDATE)
intent.putExtra(EXTRA_LOCATION, location)
val latitude = locationResult.lastLocation!!.latitude
val longitude = locationResult.lastLocation!!.longitude
Log.d("LAT_LOND","Current Position : $latitude | $longitude")
sendBroadcast(intent)
}
}
}
现在你需要使用FusedLocationProviderClient
来调用回调函数。
private lateinit var fusedLocationClient: FusedLocationProviderClient
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
fusedLocationClient.requestLocationUpdates(
LocationUtils.getLocationRequest(),
locationCallback,
null
)
在这里,你可以看到我已经将整个location对象传递给了一个BroadcastReceiver
,因为我想要在一个活动中显示这些信息。附上活动代码供参考。
private val receiver = object : BroadcastReceiver() {
@RequiresApi(Build.VERSION_CODES.O)
@SuppressLint("SetTextI18n")
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == LocationService.ACTION_LOCATION_UPDATE) {
val location = intent.getParcelableExtra<Location>(LocationService.EXTRA_LOCATION)
binding.tvLat.text = location?.latitude.toString().trim()
binding.tvLong.text = location?.longitude.toString().trim()
binding.tvAcc.text = "${location?.accuracy.toString().trim()} meters in horizontal"
binding.tvAccVer.text =
"${location?.verticalAccuracyMeters.toString().trim()} meters in vertical"
binding.tvTime.text = convertLongToTime(location?.time!!)
}
}
}
您可以看到locationCallback
对象包含所有数据,从中您可以检索所需的信息。
此外,请注意,您应启用获取位置和接收位置数据的所有必需权限。
为了更好地理解,我分享了一个链接,您可以从用户那里启用运行时权限并与应用程序交互,以便应用程序不会表现不当。
链接 - Android运行时位置权限
欢迎随时发表您的想法,并在需要时提出任何更改建议。