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内精度最高的一次定位结果。如果设置其为true,setOnceLocation(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内精度最高的一次定位结果。如果设置其为true,setOnceLocation(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() } } }