需求是只需要定位到当前地区就可以了,所以也没必要导入三方地图sdk,
添加权限
···
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
···
添加工具类
import android.annotation.SuppressLint
import android.content.Context
import android.location.*
import android.os.Bundle
import cn.basic.core.util.LogUtil
import java.util.*
/**
* LocationUtil8/10/21 12:14 AM
* @desc :
*
*/
class LocationUtil(val context: Context) {
private var locationManager: LocationManager? = null
private var locationListener: LocationListener? = null
var locationCallBack: (Location) -> Unit = {}
// 初始化调用
fun initLocationManager(isToSetting: Boolean = false) {
locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager?
// if (isToSetting && locationManager?.isProviderEnabled(LocationManager.GPS_PROVIDER) == false) {
// // 转到手机设置界面,用户设置GPS
// val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// context.startActivity(intent)
// }
locationListener = object : LocationListener {
override fun onLocationChanged(location: Location) {
if (location == null) {
return
}
locationCallBack(location)
release()
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
}
override fun onProviderEnabled(provider: String) {
}
override fun onProviderDisabled(provider: String) {
// if (isForeground) onLocationGranted(false)
}
}
getProvider()
}
@SuppressLint("MissingPermission")
private fun getProvider() {
val list = locationManager?.getProviders(true)
val provider = when {
list?.contains(LocationManager.GPS_PROVIDER) == true -> LocationManager.NETWORK_PROVIDER
list?.contains(LocationManager.NETWORK_PROVIDER) == true -> LocationManager.NETWORK_PROVIDER
else -> null
}
if (provider != null) {
val location = locationManager?.getLastKnownLocation(provider)
if (location != null) {
LogUtil.i("------------------")
// currentLocation = LatLng(location.latitude, location.longitude)
}
locationManagerRequestLocationUpdates()
}
}
@SuppressLint("MissingPermission")
private fun locationManagerRequestLocationUpdates() {
release()
for (provider in listOf(LocationManager.NETWORK_PROVIDER, LocationManager.GPS_PROVIDER)) {
if (locationManager?.isProviderEnabled(provider) == true) {
locationListener?.let {
locationManager?.requestLocationUpdates(provider, 2000, 50f, it) // 这里的数字可以看源码注释,没需求的话,可以不用改。
}
}
}
}
// 转换结果编码。获取省市区街道等信息。
fun getAddress(context: Context, location: Location): Address? {
val gc = Geocoder(context, Locale.getDefault())
val result = try {
gc.getFromLocation(location.latitude, location.longitude, 1)
} catch (e: Exception) {
listOf<Address>()
}
if (result.isNotEmpty()) {
return result[0]
}
// 省 address?.adminArea 市 address?.locality 区: address?.subLocality
return null
}
fun release() {
locationListener?.let {
locationManager?.removeUpdates(it)
}
}
}
调用方式
这里是用 EasyPermissions 来获取权限申请,使用其他方式,需自行调整
private val locationUtil by lazy {
LocationUtil(this)
}
override fun init(savedInstanceState: Bundle?) {
....
requiresPermission()
// 获取定位信息后的回调,
locationUtil.locationCallBack = {
val address = locationUtil.getAddress(this, it)
val result = "${address?.adminArea ?: ""}${address?.locality ?: ""}"
}
}
// EasyPermissions 需要重写该方法
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
// 申请权限,权限通过后会再次执行该方法。进行有权限后的操作。
@AfterPermissionGranted(100)
private fun requiresPermission() {
val perms =
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
if (EasyPermissions.hasPermissions(this, *perms)) {
// Already have permission, do the thing
locationUtil.initLocationManager()
} else {
// Do not have permissions, request them now
EasyPermissions.requestPermissions(this, "获取位置信息仅用于定位当前区域", 100, *perms)
}
}
网友评论