美文网首页
Android 使用原生定位获取区域信息

Android 使用原生定位获取区域信息

作者: _发强 | 来源:发表于2021-08-10 00:37 被阅读0次

需求是只需要定位到当前地区就可以了,所以也没必要导入三方地图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)
        }
    }

相关文章

网友评论

      本文标题:Android 使用原生定位获取区域信息

      本文链接:https://www.haomeiwen.com/subject/djztbltx.html