复制粘贴直接可以用
class LocationUtils {
private var mLocationClient: LocationClient? = null
private val myListener =
MyLocationListener()
fun createLocation(): LocationUtils {
initData()
return this
}
private fun initData() {
mLocationClient = LocationClient(RMApplication.application)
mLocationClient!!.registerLocationListener(myListener)
val option = LocationClientOption()
option.locationMode = LocationClientOption.LocationMode.Hight_Accuracy
option.setIsNeedAddress(true)
option.isOpenGps = true
option.setIgnoreKillProcess(true)
option.SetIgnoreCacheException(false)
option.setWifiCacheTimeOut(5 * 60 * 1000)
mLocationClient!!.locOption = option
}
fun start() {
if (mLocationClient != null) {
mLocationClient!!.start()
}
}
interface ICallbackLocationListener {
fun onReceiveLocation(locatinBean: LocationBean?)
}
private var callbackLocationListener: ICallbackLocationListener? = null
fun setListener(callbackListener: ICallbackLocationListener?): LocationUtils {
callbackLocationListener = callbackListener
return this
}
inner class MyLocationListener : BDAbstractLocationListener() {
override fun onReceiveLocation(location: BDLocation) {
setData(location)
}
override fun onLocDiagnosticMessage(i: Int, i1: Int, s: String) {
super.onLocDiagnosticMessage(i, i1, s)
initLocation()
}
private fun setData(location: BDLocation) {
val locationWhere = location.locationWhere
val latitude = location.latitude
val longitude = location.longitude
val radius = location.radius
val coorType = location.coorType
val errorCode = location.locType
val addr = location.addrStr
val country = location.country
val province = location.province
val city = location.city
val district = location.district
val street = location.street
val locType = location.locType
if (locType == 61 || locType == 161) {
val locationBean = LocationBean()
locationBean.crawllatitude = latitude
locationBean.crawllongitude = longitude
locationBean.coorType = coorType
locationBean.errorCode = errorCode
locationBean.positioningAccuracy = radius
locationBean.crawlsite = addr
locationBean.country = country
locationBean.crawlprovinces = province
locationBean.town = city
locationBean.district = district
locationBean.neighborhood = street
locationBean.locationWhere = locationWhere
locationBean.locType = locType
if (callbackLocationListener != null) {
callbackLocationListener!!.onReceiveLocation(locationBean)
}
} else {
initLocation()
}
if (mLocationClient != null) {
mLocationClient!!.stop()
}
}
}
fun initLocation() {
GPLocationHelper.getInstance(RMApplication.application)
?.initLocation(object : LocationLinstener {
override fun UpdateLocation(onwegin: Location?) {
GPLocationHelper.getInstance(RMApplication.application)
?.removeLocationUpdatesListener()
}
override fun UpdateStatus(
oewiobwe: String?,
newineiwof: Int,
ionwrinvjiw: Bundle?
) {
}
override fun UpdateLastLocation(jkrbewofnw: Location?) {
locationGeocoder(jkrbewofnw!!.latitude, jkrbewofnw.longitude)
}
})
}
fun locationGeocoder(latitude: Double, longitude: Double) {
val locationBean = LocationBean()
locationBean.crawllatitude = latitude
locationBean.crawllongitude = longitude
val geocoder =
Geocoder(RMApplication.application)
val flag = Geocoder.isPresent()
if (flag) {
try {
val addresses =
geocoder.getFromLocation(latitude, longitude, 1)
if (addresses.size > 0) {
val address = addresses[0]
if (address != null) {
val countryName = address.countryName
val countryCode = address.countryCode
val adminArea = address.adminArea
val locality = address.locality
val subAdminArea = address.subAdminArea
val featureName = address.featureName
locationBean.country = countryName
locationBean.crawlprovinces = adminArea
locationBean.town = locality
locationBean.district = subAdminArea
locationBean.neighborhood = featureName
} else {
}
}
} catch (e: IOException) {
} catch (e: Exception) {
}
}
if (callbackLocationListener != null) {
callbackLocationListener!!.onReceiveLocation(locationBean)
}
}
companion object {
private var locationUtils: LocationUtils? = null
const val IDENTITY_CODE = 1
const val ESSENTIAL_CODE = 2
const val SUBMIT_CODE = 3
@get:Synchronized
val instance: LocationUtils?
get() {
if (locationUtils == null) {
locationUtils = LocationUtils()
}
return locationUtils
}
}
}
interface LocationLinstener {
fun UpdateLocation(location: Location?)
fun UpdateStatus(
str: String?,
int: Int,
bundle: Bundle?
)
fun UpdateLastLocation(location: Location?)
}
class GPLocationHelper(private val mContext: Context) {
private var mLocationCallback: LocationLinstener? = null
private var myLocationListener: MyLocationListener? =
null
private val mLocationManager: LocationManager?
fun initLocation(locationCallback: LocationLinstener) {
var location: Location? = null
mLocationCallback = locationCallback
if (myLocationListener == null) {
myLocationListener = MyLocationListener()
}
if (Build.VERSION.SDK_INT >= 23 && ActivityCompat.checkSelfPermission(
mContext,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
mContext,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
return
}
if (mLocationManager != null) {
if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
location =
mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
if (location != null) {
locationCallback.UpdateLastLocation(location)
}
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
0, 0f, myLocationListener
)
} else {
location =
mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
if (location != null) {
locationCallback.UpdateLastLocation(location)
}
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
1000, 50f, myLocationListener
)
}
}
}
private inner class MyLocationListener : LocationListener {
override fun onStatusChanged(
trbrvsf: String, gfsafda: Int,
tnrbrfdsf: Bundle
) {
if (mLocationCallback != null) {
mLocationCallback!!.UpdateStatus(trbrvsf, gfsafda, tnrbrfdsf)
}
}
override fun onProviderEnabled(nrtbrdv: String) {
}
override fun onProviderDisabled(rntbvds: String) {
}
override fun onLocationChanged(nrbfdv: Location) {
if (mLocationCallback != null) {
mLocationCallback!!.UpdateLocation(nrbfdv)
}
}
}
fun removeLocationUpdatesListener() {
if (Build.VERSION.SDK_INT >= 23 && ActivityCompat.checkSelfPermission(
mContext,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
mContext,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
return
}
mLocationManager?.removeUpdates(myLocationListener)
}
companion object {
@Volatile
private var uniqueInstance: GPLocationHelper? = null
fun getInstance(context: Context): GPLocationHelper? {
if (uniqueInstance == null) {
synchronized(LocationUtils::class.java) {
if (uniqueInstance == null) {
uniqueInstance = GPLocationHelper(context)
}
}
}
return uniqueInstance
}
}
init {
mLocationManager = mContext
.getSystemService(Context.LOCATION_SERVICE) as LocationManager
}
}
class LocationBean {
var crawllatitude = 0.0
var crawllongitude = 0.0
var positioningAccuracy = 0f
var coorType: String? = null
var errorCode = 0
var locationWhere = 0
var crawlsite: String? = null
var country: String? = null
var crawlprovinces: String? = null
var town: String? = null
var district: String? = null
var neighborhood: String? = null
var locType = 0
}