174 lines
6.8 KiB
Kotlin
174 lines
6.8 KiB
Kotlin
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()
|
||
}
|
||
}
|
||
} |