kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息

使用 kotlin 通过GPS定位/网络定位获取当前经纬度及位置信息


添加权限

android6.0后需要动态获取权限

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" />

添加动态申请依赖:

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

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

class LocationUtilsprivate constructor(private val mContext: Context) {// 定位回调private var mLocationCallBack: LocationCallBack? = null// 定位管理实例var mLocationManager: LocationManager? = null/*** 获取定位* @param mLocationCallBack 定位回调* @return*/fun getLocation(mLocationCallBack: LocationCallBack?) {this.mLocationCallBack = mLocationCallBackif (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 LocationManagermLocationManager!!.requestLocationUpdates(GPS_LOCATION, MIN_TIME, MIN_DISTANCE, mLocationListener)}/*** 网络定位*/@SuppressLint("MissingPermission")private fun netWorkLocation() {if (mLocationManager == null) mLocationManager =mContext.getSystemService(Context.LOCATION_SERVICE) as LocationManagermLocationManager!!.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 = 0while (address.getAddressLine(i) != null) {val addressLine = address.getAddressLine(i)result = result + addressLinei++}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// 时间更新间隔,单位:msprivate const val MIN_TIME: Long = 1000// 位置刷新距离,单位:mprivate const val MIN_DISTANCE = 0.01.toFloat()// singletonprivate 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为控件idlatitude.text = "纬度:" + location.latitude.toString() // latitude为控件idLocationUtils.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定位获取位置需要有电话卡的手机才能运行

kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息相关推荐

  1. android gps定位工具类,Android原生GPS和网络定位工具类

    在应用开发中我们常常需要网络获取位置的方法,这里做一个工具类的封装,使用的是Android原生定位,包含两种方式,一种是原生GPS一种是网络定位的封装实现: 工具类代码如下所示: package co ...

  2. 百度定位SDK实现获取当前经纬度及位置

    使用Android自带的LocationManager和Location获取位置的时候,经常会有获取的location为null的情况,并且操作起来也不是很方便,在这个Demo里我使用了百度地图API ...

  3. 定位服务器的功能是提供用户位置信息和什么,LBS是什么意思 LBS的现有模式和功能介绍...

    LBS是什么意思?LBS有什么模式和功能?所谓的LBS的意思其实就是基于位置服务,所谓手机里的LBS软件就是很多lbs功能,比如我们常用的微博,大家都应该知道那个像小火柴一样的符号,点击后就会出现现在 ...

  4. 【Android App】获取照片里的位置信息及使用全球卫星导航系统(GNSS)获取位置实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.获取照片里的位置信息 手机拍摄的相片还保存着时间.地点.镜头参数等信息,这些信息由相片接口工具ExifInterface管理,它的常用方法说明如下 ...

  5. Android获取当前位置(GPS和网络定位)

    1.添加定位权限 <!--定位权限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOC ...

  6. 自定义工具类-----GPS、网络定位

    代码依旧是kotlin编写,java类似 1.在清单文件里添加权限 <!--请求网络权限--> <uses-permission android:name="android ...

  7. android.database.cursorindexoutofboundsexception错误解决 及获取某行某列信息

    1 /** 2 * 获取某行某列信息 3 * @param info 4 * @param column 5 * @return 6 */ 7 public static int getIntValu ...

  8. Android 9.0 10蓝牙音乐获取歌手、歌曲等信息

    Android 9.0中蓝牙音乐其实实现很简单,蓝牙远程服务处理在Bluetooth中. 修改代码路径: android/packages/apps/Bluetooth./jni/com_androi ...

  9. 点击百度地图获取位置详细信息(点击获取当前点击位置信息)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. android gps服务,Android检测GPS服务和定位权限是否开启

    判断是否开定位权限,没开并跳转权限界面 private LocationManager lm;//[位置管理] lm = (LocationManager) getActivity().getSyst ...

最新文章

  1. vue.js 组件之间传递数据 1
  2. python时间格式_python 格式化日期
  3. spring boot示例_Spring Boot完成示例
  4. Java EE与NoSQL的未来
  5. 【CodeForces - 266C】Below the Diagonal (递归,子问题,贪心模拟)
  6. python中的threading_python中的threading模块使用说明
  7. myan回复几个问题
  8. SAP License:ERP概述
  9. oracle归档日志满了的处理方法
  10. 【Servlet】web.xml中url-pattern的用法
  11. c语言word类型的题库,可下载c语言上机题库word版
  12. 好的编码习惯是一场代码驱邪仪式
  13. codeforces 894A QAQ
  14. 给交换机console接口设置密码
  15. SaaSpace:11 款最佳免费备份软件工具
  16. 测试VPS线路与网络的小帮手
  17. WIN10安装VC6.0无法使用的解决办法
  18. 华为云开发者官网首页焕新升级,赋能开发者云上成长
  19. HDD硬盘初始化后,选择MBR还是GPT?
  20. 韩顺平Linux视频教程—笔记(全)

热门文章

  1. php赞空间,最新QQ空间免费代码大全(赞)
  2. ZCMU-1428: Bit++ (水)
  3. (三)lvs负载均衡详解--lvs-DR+keepalived配置
  4. 【加密算法】3DES加密算法
  5. linux下编译和安装log4cxx,ubuntu下log4cxx安装使用
  6. PASCAL 高级编程
  7. 卡耐基:一个人的成功,只有15%是靠专业技术
  8. mediapipe示例运行
  9. windows无法格式化u盘_Windows系统提示U盘无法完成格式化的解决方法
  10. 抛出异常关键字throw与定义异常关键字throws