kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息
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定位/网络定位获取当前经纬度及位置信息相关推荐
- android gps定位工具类,Android原生GPS和网络定位工具类
在应用开发中我们常常需要网络获取位置的方法,这里做一个工具类的封装,使用的是Android原生定位,包含两种方式,一种是原生GPS一种是网络定位的封装实现: 工具类代码如下所示: package co ...
- 百度定位SDK实现获取当前经纬度及位置
使用Android自带的LocationManager和Location获取位置的时候,经常会有获取的location为null的情况,并且操作起来也不是很方便,在这个Demo里我使用了百度地图API ...
- 定位服务器的功能是提供用户位置信息和什么,LBS是什么意思 LBS的现有模式和功能介绍...
LBS是什么意思?LBS有什么模式和功能?所谓的LBS的意思其实就是基于位置服务,所谓手机里的LBS软件就是很多lbs功能,比如我们常用的微博,大家都应该知道那个像小火柴一样的符号,点击后就会出现现在 ...
- 【Android App】获取照片里的位置信息及使用全球卫星导航系统(GNSS)获取位置实战(附源码和演示 超详细)
需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.获取照片里的位置信息 手机拍摄的相片还保存着时间.地点.镜头参数等信息,这些信息由相片接口工具ExifInterface管理,它的常用方法说明如下 ...
- Android获取当前位置(GPS和网络定位)
1.添加定位权限 <!--定位权限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOC ...
- 自定义工具类-----GPS、网络定位
代码依旧是kotlin编写,java类似 1.在清单文件里添加权限 <!--请求网络权限--> <uses-permission android:name="android ...
- android.database.cursorindexoutofboundsexception错误解决 及获取某行某列信息
1 /** 2 * 获取某行某列信息 3 * @param info 4 * @param column 5 * @return 6 */ 7 public static int getIntValu ...
- Android 9.0 10蓝牙音乐获取歌手、歌曲等信息
Android 9.0中蓝牙音乐其实实现很简单,蓝牙远程服务处理在Bluetooth中. 修改代码路径: android/packages/apps/Bluetooth./jni/com_androi ...
- 点击百度地图获取位置详细信息(点击获取当前点击位置信息)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- android gps服务,Android检测GPS服务和定位权限是否开启
判断是否开定位权限,没开并跳转权限界面 private LocationManager lm;//[位置管理] lm = (LocationManager) getActivity().getSyst ...
最新文章
- vue.js 组件之间传递数据 1
- python时间格式_python 格式化日期
- spring boot示例_Spring Boot完成示例
- Java EE与NoSQL的未来
- 【CodeForces - 266C】Below the Diagonal (递归,子问题,贪心模拟)
- python中的threading_python中的threading模块使用说明
- myan回复几个问题
- SAP License:ERP概述
- oracle归档日志满了的处理方法
- 【Servlet】web.xml中url-pattern的用法
- c语言word类型的题库,可下载c语言上机题库word版
- 好的编码习惯是一场代码驱邪仪式
- codeforces 894A QAQ
- 给交换机console接口设置密码
- SaaSpace:11 款最佳免费备份软件工具
- 测试VPS线路与网络的小帮手
- WIN10安装VC6.0无法使用的解决办法
- 华为云开发者官网首页焕新升级,赋能开发者云上成长
- HDD硬盘初始化后,选择MBR还是GPT?
- 韩顺平Linux视频教程—笔记(全)
热门文章
- php赞空间,最新QQ空间免费代码大全(赞)
- ZCMU-1428: Bit++ (水)
- (三)lvs负载均衡详解--lvs-DR+keepalived配置
- 【加密算法】3DES加密算法
- linux下编译和安装log4cxx,ubuntu下log4cxx安装使用
- PASCAL 高级编程
- 卡耐基:一个人的成功,只有15%是靠专业技术
- mediapipe示例运行
- windows无法格式化u盘_Windows系统提示U盘无法完成格式化的解决方法
- 抛出异常关键字throw与定义异常关键字throws