最近又遇到定位场景,需要上传经纬度,正好同事写了,我就记录一下方便你我他 ~ ~
今年开始用的kt比较多,所以篇内用的kt,见谅见谅
前情悉知
- 获取当前位置时,需要判断用户是否授权,这里用到的是 XXPermissions
- 未授权会提示用户进行授权,已授权会直接开始调用方法获取经纬度
如何验证获取的定位准确与否,经纬度对不对,可以通过这里直接进行确定
调用方式
//经度var lat = ""//纬度var lon = ""LocationUtils.locationInfo(activity, object : LBSLocationListener {override fun onLocationUpdate(p0: LBSLocation) { lat = p0.longitude.toString()lon = p0.latitude.toString()}override fun onLocationFailed(p0: Int) {lat = "0"lon = "0"}})
LocationUtils
因为是在项目中使用的方法,部分涉及到了前端交互中需要提供的参数,如果不需要的话,自行剔除就好
package youself.packname 自行替换import android.Manifest
import android.app.Activity
import android.content.Context
import com.alipay.mobile.common.lbs.LBSLocation
import com.alipay.mobile.common.lbs.LBSLocationListener
import com.alipay.mobile.common.lbs.LBSLocationManagerProxy
import com.blankj.utilcode.util.PermissionUtils
import com.blankj.utilcode.util.PermissionUtils.FullCallback
import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
import com.blankj.utilcode.util.ToastUtils
import com.blankj.utilcode.util.UtilsTransActivity
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions
import com.tencent.qcloud.tuicore.util.PermissionUtils.PermissionConstants
import java.util.concurrent.TimeUnit.SECONDS/*** @author 超人(现同事的自我别称)* @class desc 获取定位信息*/
object LocationUtils {private var permission =arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION)/*** 获取定位信息*/fun location(context: Context?, listener: LBSLocationListener) {if (PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION)) {getLocationInfo(context, listener)} else {PermissionUtils.permission(PermissionConstants.LOCATION).rationale { utilsTransActivity: UtilsTransActivity?, shouldRequest: ShouldRequest ->shouldRequest.again(true)}.callback(object : FullCallback {override fun onGranted(permissionsGranted: List<String>) {getLocationInfo(context, listener)}override fun onDenied(permissionsDeniedForever: List<String>,permissionsDenied: List<String>) {if (!permissionsDeniedForever.isEmpty()) {PermissionUtils.launchAppDetailsSettings()}}}).request()}}/*** 获取定位信息*/fun locationInfo(context: Activity?, listener: LBSLocationListener) {if (isOpenLocation(context)) {getLocationInfo(context, listener)} else {//todo 拿注册给的默认定位 前端要求进去先调用startLocation(context, object : isEnableLocationListener {override fun isEnableLocation(isLocation: Boolean) {if (isLocation) {getLocationInfo(context, listener)} else {var lbs = LBSLocation()lbs.longitude = 121.386344lbs.latitude = 31.30111lbs.city = "上海市"listener.onLocationUpdate(lbs)}}})}}/*** 开启定位*/fun startLocation(context: Activity?, listener: isEnableLocationListener) {XXPermissions.with(context)// // 申请单个权限// .permission(Permission.RECORD_AUDIO)// 申请多个权限.permission( permission)// 设置权限请求拦截器(局部设置)//.interceptor(new PermissionInterceptor())// 设置不触发错误检测机制(局部设置)//.unchecked().request(object : OnPermissionCallback {override fun onGranted(permissions: MutableList<String>, all: Boolean) {if (all) {// toast("获取录音和日历权限成功")if (GpsUtil.isOPen(context)) {listener.isEnableLocation(true)} else {GpsUtil.goLocationSetting(context, listener)}} else {listener.isEnableLocation(false)ToastUtils.showLong("获取部分权限成功,但部分权限未正常授予~")}}override fun onDenied(permissions: MutableList<String>, never: Boolean) {listener.isEnableLocation(false)if (never) {// toast("被永久拒绝授权,请手动授予录音和日历权限")// 如果是被永久拒绝就跳转到应用权限系统设置页面// TODO: 仅用户手动触发权限才可以去设置页面XXPermissions.startPermissionActivity(context, permissions)} else {ToastUtils.showLong("获取权限失败~")}}})}fun getLocationInfo(context: Context?, listener: LBSLocationListener) {// context上下文 // , // 是否需要gpsLBSLocationManagerProxy.getInstance().doRequestLocationUpdates(context,false, // 定位回调listener,SECONDS.toMillis(30L), // 定位时间间隔SECONDS.toMillis(31L), // 定位超时时间true, // 是否需要逆地理"test", // biz标识false, // 是否需要速度"F" // 是否是H5)}/** 是否开启定位*/fun isOpenLocation(context: Context?): Boolean {return XXPermissions.isGranted(context,permission) && GpsUtil.isOPen(context)}/*remove 定位注册的回调*/fun removeUpdates(context: Context?, listener: LBSLocationListener) {LBSLocationManagerProxy.getInstance().removeUpdates(context, listener)}/*获取最近一次定位成功的位置*/fun getLastKnownLocation(context: Context?): LBSLocation {return LBSLocationManagerProxy.getInstance().getLastKnownLocation(context)}interface isEnableLocationListener {fun isEnableLocation(isLocation: Boolean)}
}