欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Android 定位 获取当前位置 (Kotlin)

Android 定位 获取当前位置 (Kotlin)

2025/11/10 22:10:07 来源:https://blog.csdn.net/liRuixuesongXueqian/article/details/145342345  浏览:    关键词:Android 定位 获取当前位置 (Kotlin)

导入:

implementation 'com.google.android.gms:play-services-location:21.3.0'

头文件:

import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority
import com.google.android.gms.tasks.CancellationTokenSource
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability
import android.os.Looper
import androidx.core.app.ActivityCompat

代码实现:

private val PLAY_SERVICES_RESOLUTION_REQUEST = 9000
private var fusedLocationClient: FusedLocationProviderClient? = null

1.requestLocationUpdates:持续获取定位,根据更新间隔和最快频率

fusedLocationClient = LocationServices.getFusedLocationProviderClient(thisContext!!)
if (ActivityCompat.checkSelfPermission(thisContext!!,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(thisContext!!,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
) {val locationRequest: LocationRequest = LocationRequest.create()locationRequest.interval = 2000 // 更新间隔,例如10秒locationRequest.fastestInterval = 5000 // 最快频率,例如5秒locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACYfusedLocationClient!!.requestLocationUpdates(locationRequest,object : LocationCallback() {override fun onLocationResult(locationResult: LocationResult) {if (locationResult == null) {LogUtils.d("requestLocationUpdates locationResult == null")return}for (location in locationResult.locations) {var latitude = location.latitude.toString()var longitude = location.longitude.toString()if (latitude.contains(".")) {latitude = subString(latitude)}if (longitude.contains(".")) {longitude = subString(longitude)}LogUtils.d("requestLocationUpdates onLocationResult latitude = $latitude  longitude = $longitude")}}},Looper.myLooper())
}

2.getCurrentLocation:获取一次定位

private fun startLocation() {fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {LogUtils.d("fusedLocationClient Ok")val priority = Priority.PRIORITY_BALANCED_POWER_ACCURACYval cancellationTokenSource = CancellationTokenSource()val cancellationToken = cancellationTokenSource.tokenfusedLocationClient.getCurrentLocation(priority,cancellationToken).addOnSuccessListener(this) { location ->if (location != null) {val latitude = location.latitudeval longitude = location.longitudeLogUtils.d("fusedLocationClient latitude = $latitude  longitude = $longitude")} else {LogUtils.d("fusedLocationClient location = null")}}.addOnFailureListener { exception ->LogUtils.d("fusedLocationClient exception = $exception")}}
}
//上面方法中 addOnFailureListener 报错如下:
//com.google.android.gms.common.api.ApiException: 17: API: LocationServices.API is not available on this device. Connection failed with: ConnectionResult{statusCode=SERVICE_INVALID, resolution=null, message=null}
//如发生这个错误,可能是当前手机设备没有安装Google Play 服务,可以用如下两个方法检查当前设备是否安装Google Play 服务,再调用获取上面定位方法
private fun checkPlayServices(): Boolean {val apiAvailability = GoogleApiAvailability.getInstance()val resultCode = apiAvailability.isGooglePlayServicesAvailable(this)if (resultCode != ConnectionResult.SUCCESS) {if (apiAvailability.isUserResolvableError(resultCode)) {LogUtils.d("GoogleApiAvailability NO")apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)?.show()} else {LogUtils.d("GoogleApiAvailability Google Play")finish()}return false}return true
}override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == PLAY_SERVICES_RESOLUTION_REQUEST) {if (resultCode == Activity.RESULT_OK) {if (checkPlayServices()) {startLocation()}} else {LogUtils.d("无法使用 Google Play 服务")finish()}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词