GLDriver/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt
2024-04-24 15:33:37 +08:00

174 lines
6.8 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.dahe.gldriver.utils
import android.annotation.SuppressLint
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.graphics.Color
import android.os.Build
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationClientOption
import com.amap.api.location.AMapLocationListener
import com.amap.api.maps.CoordinateConverter
import com.amap.api.maps.model.LatLng
import com.dahe.gldriver.service.MyNotification
import java.lang.Exception
import kotlin.math.atan2
import kotlin.math.cos
import kotlin.math.sin
import kotlin.math.sqrt
class GDLocationUtils private constructor() {
//声明AMapLocationClient类对象
var mLocationClient: AMapLocationClient? = null;
//声明AMapLocationClientOption对象
var mLocationOption: AMapLocationClientOption? = null
companion object {
val instance = Holder.holder
}
object Holder {
val holder = GDLocationUtils()
}
fun getLocation(ctx: Context, mLocationListener: AMapLocationListener) {
//初始化定位
mLocationClient = AMapLocationClient(ctx)
//设置定位回调监听
mLocationClient?.setLocationListener(mLocationListener)
//初始化AMapLocationClientOption对象
mLocationOption = AMapLocationClientOption()
/**
* 设置定位场景,目前支持三种场景(签到、出行、运动,默认无场景)
*/
mLocationOption?.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn)
//设置定位模式为AMapLocationMode.Hight_Accuracy高精度模式。
mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy)
// mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving)
//获取一次定位结果:
//该方法默认为false。
mLocationOption?.setOnceLocation(true)
//获取最近3s内精度最高的一次定位结果
//设置setOnceLocationLatest(boolean b)接口为true启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为truesetOnceLocation(boolean b)接口也会被设置为true反之不会默认为false。
mLocationOption?.setOnceLocationLatest(true)
//设置是否允许模拟位置,默认为true允许模拟位置
mLocationOption?.setMockEnable(true)
//启动后台定位第一个参数为通知栏ID建议整个APP使用一个
// mLocationClient?.enableBackgroundLocation(1,buildNotification(ctx))
//给定位客户端对象设置定位参数
mLocationClient?.setLocationOption(mLocationOption);
if (null != mLocationClient) {
mLocationClient?.setLocationOption(mLocationOption);
//设置场景模式后最好调用一次stop再调用start以保证场景模式生效
mLocationClient?.stopLocation()
mLocationClient?.startLocation()
}
}
/**
* 上传轨迹专用
* @param ctx Context
* @param mLocationListener AMapLocationListener
*/
fun getLocation2(ctx: Context, mLocationListener: AMapLocationListener) {
//初始化定位
mLocationClient = AMapLocationClient(ctx)
//设置定位回调监听
mLocationClient?.setLocationListener(mLocationListener)
//初始化AMapLocationClientOption对象
mLocationOption = AMapLocationClientOption()
/**
* 设置定位场景,目前支持三种场景(签到、出行、运动,默认无场景)
*/
mLocationOption?.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn)
//设置定位模式为AMapLocationMode.Hight_Accuracy高精度模式。
mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving)
// mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving)
//获取一次定位结果:
//该方法默认为false。
mLocationOption?.setOnceLocation(true)
//获取最近3s内精度最高的一次定位结果
//设置setOnceLocationLatest(boolean b)接口为true启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为truesetOnceLocation(boolean b)接口也会被设置为true反之不会默认为false。
mLocationOption?.setOnceLocationLatest(true)
//设置是否允许模拟位置,默认为true允许模拟位置
mLocationOption?.setMockEnable(true)
//启动后台定位第一个参数为通知栏ID建议整个APP使用一个
mLocationClient?.enableBackgroundLocation(
1,
MyNotification.getInstance().getNotification(ctx)
)
//给定位客户端对象设置定位参数
mLocationClient?.setLocationOption(mLocationOption);
if (null != mLocationClient) {
mLocationClient?.setLocationOption(mLocationOption);
//设置场景模式后最好调用一次stop再调用start以保证场景模式生效
mLocationClient?.stopLocation()
mLocationClient?.startLocation()
}
}
fun convertGPSToBaidu(context: Context, srLatLng: LatLng): LatLng {
val converter = CoordinateConverter(context)
converter.from(CoordinateConverter.CoordType.GPS)
converter.coord(LatLng(srLatLng.latitude, srLatLng.longitude))
val convert = converter.convert()
return LatLng(convert.latitude, convert.longitude)
}
/**
* 高德转百度火星坐标gcj02ll>百度坐标bd09ll
* @param srLatLng LatLng
* @return LatLng
*/
fun gaoDeToBaidu(srLatLng: LatLng): LatLng {
var PI = 3.14159265358979324 * 3000.0 / 180.0;
var x = srLatLng.latitude
var y = srLatLng.longitude
var z = sqrt(x * x + y * y) + 0.00002 * sin(y * PI);
var theta = atan2(y, x) + 0.000003 * cos(x * PI);
return LatLng(z * cos(theta) + 0.0065, z * sin(theta) + 0.006);
}
/**
* 百度转高德百度坐标bd09ll>火星坐标gcj02ll
* @param srLatLng LatLng
* @return LatLng
*/
fun bdToGaoDe(srLatLng: LatLng): LatLng {
var PI = 3.14159265358979324 * 3000.0 / 180.0;
var x = srLatLng.longitude - 0.0065
var y = srLatLng.latitude - 0.006
var z = sqrt(x * x + y * y) - 0.00002 * sin(y * PI);
var theta = atan2(y, x) - 0.000003 * cos(x * PI);
return LatLng(z * cos(theta) + 0.0065, z * sin(theta) + 0.006);
}
fun stopLocation() {
if (null != mLocationClient) {
mLocationClient?.disableBackgroundLocation(true)
mLocationClient?.stopLocation()
}
}
}