Androidmanifest:

<!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

添加动态申请依赖:

    //权限请求 支持Androidx
    implementation 'com.guolindev.permissionx:permissionx:1.6.4'

创建一个获取位置的工具类

class LocationUtils
    private constructor(private val mContext: Context) {
    // 定位回调
    private var mLocationCallBack: LocationCallBack? = null
    // 定位管理实例
    var mLocationManager: LocationManager? = null
     * 获取定位
     * @param mLocationCallBack 定位回调
     * @return
    fun getLocation(mLocationCallBack: LocationCallBack?) {
        this.mLocationCallBack = mLocationCallBack
        if (mLocationCallBack == null) return
        // 定位管理初始化
        mLocationManager = mContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        // 通过GPS定位
        val gpsProvider = mLocationManager!!.getProvider(LocationManager.GPS_PROVIDER)
        // 通过网络定位
        val netProvider = mLocationManager!!.getProvider(LocationManager.NETWORK_PROVIDER)
        // 优先考虑GPS定位,其次网络定位。
        if (gpsProvider != null) {
            gpsLocation()
        } else if (netProvider != null) {
            netWorkLocation()
        } else {
            mLocationCallBack.setLocation(null)
     * GPS定位
     * @return
    @SuppressLint("MissingPermission")
    private fun gpsLocation() {
        if (mLocationManager == null) mLocationManager =
            mContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        mLocationManager!!.requestLocationUpdates(
            GPS_LOCATION, MIN_TIME, MIN_DISTANCE, mLocationListener
     * 网络定位
    @SuppressLint("MissingPermission")
    private fun netWorkLocation() {
        if (mLocationManager == null) mLocationManager =
            mContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        mLocationManager!!.requestLocationUpdates(
            NETWORK_LOCATION, MIN_TIME, MIN_DISTANCE, mLocationListener
    // 定位监听
    private val mLocationListener: LocationListener = object : LocationListener {
        override fun onLocationChanged(location: Location) {
            if (mLocationCallBack != null) {
                mLocationCallBack!!.setLocation(location)
        override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
        override fun onProviderEnabled(provider: String) {}
        override fun onProviderDisabled(provider: String) {
            // 如果gps定位不可用,改用网络定位
            if (provider == LocationManager.GPS_PROVIDER) {
                netWorkLocation()
     * 根据经纬度获取地址
     * @param latitude 纬度
     * @param longitude 经度
    fun getAddress(latitude: Double, longitude: Double) {
        // Address列表
        var locationList: List<Address?>? = null
        // 经纬度解码实例
        val gc = Geocoder(mContext, Locale.getDefault())
        try {
            // 获取Address列表
            locationList = gc.getFromLocation(latitude, longitude, MAX_RESULTS)
            // 获取Address实例
            val address = locationList[0]
            if (mLocationCallBack != null) mLocationCallBack!!.setAddress(address)
        } catch (e: IOException) {
            e.printStackTrace()
     * 获取地址周边信息
     * @param
     * @return
    fun getAddressLine(address: Address): String {
        var result = ""
        var i = 0
        while (address.getAddressLine(i) != null) {
            val addressLine = address.getAddressLine(i)
            result = result + addressLine
        return result
     * @className: LocationCallBack
     * @classDescription: 定位回调
    interface LocationCallBack {
        fun setLocation(location: Location?)
        fun setAddress(address: Address?)
    companion object {
        // GPS定位
        private const val GPS_LOCATION = LocationManager.GPS_PROVIDER
        // 网络定位
        private const val NETWORK_LOCATION = LocationManager.NETWORK_PROVIDER
        // 解码经纬度最大结果数目
        private const val MAX_RESULTS = 1
        // 时间更新间隔,单位:ms
        private const val MIN_TIME: Long = 1000
        // 位置刷新距离,单位:m
        private const val MIN_DISTANCE = 0.01.toFloat()
        // singleton
        private var instance: LocationUtils? = null
         * singleton
         * @param mContext 上下文
         * @return
        fun getInstance(mContext: Context): LocationUtils? {
            if (instance == null) {
                instance = LocationUtils(mContext)
            return instance

在Activity中动态申请并使用工具类:

PermissionX.init(this).permissions(Manifest.permission.ACCESS_FINE_LOCATION)
        .request{ allGranted, deniedList, _ ->
            if(allGranted){
                LocationUtils.getInstance(this)!!.getLocation(object : LocationUtils.LocationCallBack {
                    override fun setLocation(location: Location?) {
                        if (location != null) {
                            longitude.text = "经度:" + location.longitude.toString()  // longitude为控件id
                            latitude.text = "纬度:" + location.latitude.toString() // latitude为控件id
                            LocationUtils.getInstance(this@MainActivity)!!.getAddress(
                                location.latitude,
                                location.longitude
                    override fun setAddress(address: Address?) {
                        if (address != null) {
                            tv_address.text = """
                        国家:${address.countryName}
                        城市名:${address.locality}
                        周边信息:${
                                LocationUtils.getInstance(this@MainActivity)!!.getAddressLine(address)
                        """.trimIndent()
            else{
                Toast.makeText(this," You denied ${deniedList}",Toast.LENGTH_SHORT).show()
 

这里后面在使用在平板电脑安装应用发现无法获取位置,发现通过GPS定位获取位置需要有电话卡的手机才能运行

PermissionX是Android库的扩展,它使Android运行时权限请求变得非常容易。 您可以将其用于基本权限请求场合,也可以处理更复杂的条件,例如显示“基本原理”对话框或手动转到应用程序设置以获取津贴。 编辑您的build.gradle文件并添加以下依赖项。 dependencies { implementation ' com.permissionx.guolindev:permissionx:1.4.0 ' 就这样。 现在您可以开始了。 使用PermissionX来请求Android运行时权限非常简单。 例如。 如果要请求READ_CONTACTS,CAMERA和CALL_PHONE权限,请首先在AndroidManifest.xml中声明它们。 < manifest xmlns : android = " http://sch <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permissi... 基于android定位无非就两种:network、gps。两者各有优劣。 GPS定位的好处:精确度高;坏处:仅能在户外使用,获取定位信息速度慢,耗费电池。 网络定位的好处:户内户外都...
下面是一些关于学习 Android 开发 (使用 Kotlin 语言) 的资源: - Kotlin 官网 (https://kotlinlang.org/) 提供了学习 Kotlin 的基础知识和示例代码。 - Android 官网 (https://developer.android.com/) 提供了关于 Android 开发的详细指南和文档,并提供了 Kotlin 示例代码。 - Udacity 开发者课程 (https://www.udacity.com/courses/android) 提供了关于 Android 开发的课程,其中包括使用 Kotlin 的课程。 - 在线教育平台 Coursera (https://www.coursera.org/) 和 edX (https://www.edx.org/) 上有很多关于 Android 开发Kotlin 的课程。 - 开源项目 GitHub (https://github.com/) 上有很多关于 AndroidKotlin 的开源项目,可以帮助你更好地理解代码实现。 希望这些资源能帮助你学习 AndroidKotlin