|
|
|
@ -2,8 +2,12 @@ package com.idormy.sms.forwarder.service
|
|
|
|
|
|
|
|
|
|
import android.annotation.SuppressLint
|
|
|
|
|
import android.app.Service
|
|
|
|
|
import android.content.BroadcastReceiver
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.content.Intent
|
|
|
|
|
import android.content.IntentFilter
|
|
|
|
|
import android.location.Location
|
|
|
|
|
import android.location.LocationManager
|
|
|
|
|
import android.os.IBinder
|
|
|
|
|
import androidx.work.OneTimeWorkRequestBuilder
|
|
|
|
|
import androidx.work.WorkManager
|
|
|
|
@ -23,14 +27,20 @@ import com.king.location.LocationErrorCode
|
|
|
|
|
import com.king.location.OnExceptionListener
|
|
|
|
|
import com.king.location.OnLocationListener
|
|
|
|
|
import com.xuexiang.xaop.util.PermissionUtils
|
|
|
|
|
import com.yanzhenjie.andserver.Server
|
|
|
|
|
import java.util.Date
|
|
|
|
|
|
|
|
|
|
@SuppressLint("SimpleDateFormat")
|
|
|
|
|
@Suppress("PrivatePropertyName", "DEPRECATION")
|
|
|
|
|
class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
class LocationService : Service() {
|
|
|
|
|
|
|
|
|
|
private val TAG: String = LocationService::class.java.simpleName
|
|
|
|
|
private val gpsStatusReceiver = object : BroadcastReceiver() {
|
|
|
|
|
override fun onReceive(context: Context?, intent: Intent?) {
|
|
|
|
|
if (intent?.action == LocationManager.PROVIDERS_CHANGED_ACTION) {
|
|
|
|
|
handleGpsStatusChanged()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
var isRunning = false
|
|
|
|
@ -45,13 +55,16 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
super.onCreate()
|
|
|
|
|
|
|
|
|
|
if (!SettingUtils.enableLocation) return
|
|
|
|
|
|
|
|
|
|
//注册广播接收器
|
|
|
|
|
registerReceiver(gpsStatusReceiver, IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION))
|
|
|
|
|
startService()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
|
|
|
super.onStartCommand(intent, flags, startId)
|
|
|
|
|
|
|
|
|
|
if (!SettingUtils.enableLocation || intent == null) return START_NOT_STICKY
|
|
|
|
|
if (intent == null) return START_NOT_STICKY
|
|
|
|
|
|
|
|
|
|
Log.i(TAG, "onStartCommand: ${intent.action}")
|
|
|
|
|
|
|
|
|
@ -60,11 +73,10 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
} else if (intent.action == "STOP" && isRunning) {
|
|
|
|
|
stopService()
|
|
|
|
|
} else if (intent.action == "RESTART") {
|
|
|
|
|
stopService()
|
|
|
|
|
startService()
|
|
|
|
|
restartLocation()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return START_NOT_STICKY
|
|
|
|
|
return START_STICKY
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onDestroy() {
|
|
|
|
@ -73,18 +85,8 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
|
|
|
|
|
if (!SettingUtils.enableLocation) return
|
|
|
|
|
stopService()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onException(e: Exception?) {
|
|
|
|
|
Log.i(TAG, "onException: ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onStarted() {
|
|
|
|
|
Log.i(TAG, "onStarted: ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onStopped() {
|
|
|
|
|
Log.i(TAG, "onStopped: ")
|
|
|
|
|
//在 Service 销毁时记得注销广播接收器
|
|
|
|
|
unregisterReceiver(gpsStatusReceiver)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun startService() {
|
|
|
|
@ -94,16 +96,6 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
TaskUtils.locationInfoOld = LocationInfo()
|
|
|
|
|
|
|
|
|
|
if (SettingUtils.enableLocation && PermissionUtils.isGranted(android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
|
|
|
|
|
//可根据具体需求设置定位配置参数(这里只列出一些主要的参数)
|
|
|
|
|
val locationOption = App.LocationClient.getLocationOption().setAccuracy(SettingUtils.locationAccuracy)//设置位置精度:高精度
|
|
|
|
|
.setPowerRequirement(SettingUtils.locationPowerRequirement) //设置电量消耗:低电耗
|
|
|
|
|
.setMinTime(SettingUtils.locationMinInterval)//设置位置更新最小时间间隔(单位:毫秒); 默认间隔:10000毫秒,最小间隔:1000毫秒
|
|
|
|
|
.setMinDistance(SettingUtils.locationMinDistance)//设置位置更新最小距离(单位:米);默认距离:0米
|
|
|
|
|
.setOnceLocation(false)//设置是否只定位一次,默认为 false,当设置为 true 时,则只定位一次后,会自动停止定位
|
|
|
|
|
.setLastKnownLocation(false)//设置是否获取最后一次缓存的已知位置,默认为 true
|
|
|
|
|
//设置定位配置参数
|
|
|
|
|
App.LocationClient.setLocationOption(locationOption)
|
|
|
|
|
App.LocationClient.startLocation()
|
|
|
|
|
|
|
|
|
|
//设置定位监听
|
|
|
|
|
App.LocationClient.setOnLocationListener(object : OnLocationListener() {
|
|
|
|
@ -125,7 +117,7 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
HttpServerUtils.apiLocationCache = locationInfoNew
|
|
|
|
|
TaskUtils.locationInfoNew = locationInfoNew
|
|
|
|
|
|
|
|
|
|
//TODO: 触发自动任务
|
|
|
|
|
//触发自动任务
|
|
|
|
|
val locationInfoOld = TaskUtils.locationInfoOld
|
|
|
|
|
if (locationInfoOld.longitude != locationInfoNew.longitude || locationInfoOld.latitude != locationInfoNew.latitude || locationInfoOld.address != locationInfoNew.address) {
|
|
|
|
|
Log.d(TAG, "locationInfoOld = $locationInfoOld")
|
|
|
|
@ -139,34 +131,18 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
TaskUtils.locationInfoOld = locationInfoNew
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onProviderEnabled(provider: String) {
|
|
|
|
|
super.onProviderEnabled(provider)
|
|
|
|
|
Log.d(TAG, "onProviderEnabled(provider = ${provider})")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onProviderDisabled(provider: String) {
|
|
|
|
|
super.onProviderDisabled(provider)
|
|
|
|
|
Log.d(TAG, "onProviderDisabled(provider = ${provider})")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//设置异常监听
|
|
|
|
|
App.LocationClient.setOnExceptionListener(object : OnExceptionListener {
|
|
|
|
|
override fun onException(@LocationErrorCode errorCode: Int, e: Exception) {
|
|
|
|
|
//定位出现异常
|
|
|
|
|
//定位出现异常 && 尝试重启定位
|
|
|
|
|
Log.w(TAG, "onException(errorCode = ${errorCode}, e = ${e})")
|
|
|
|
|
|
|
|
|
|
//TODO: 重启定位
|
|
|
|
|
App.LocationClient.startLocation()
|
|
|
|
|
restartLocation()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (App.LocationClient.isStarted()) {//如果已经开始定位,则先停止定位
|
|
|
|
|
App.LocationClient.stopLocation()
|
|
|
|
|
}
|
|
|
|
|
App.LocationClient.startLocation()
|
|
|
|
|
restartLocation()
|
|
|
|
|
isRunning = true
|
|
|
|
|
} else if (!SettingUtils.enableLocation && App.LocationClient.isStarted()) {
|
|
|
|
|
Log.d(TAG, "stopLocation")
|
|
|
|
@ -200,20 +176,59 @@ class LocationService : Service(), Server.ServerListener {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun restartLocation() {
|
|
|
|
|
//如果已经开始定位,则先停止定位
|
|
|
|
|
if (App.LocationClient.isStarted()) {
|
|
|
|
|
App.LocationClient.stopLocation()
|
|
|
|
|
}
|
|
|
|
|
if (isGpsEnabled()) {
|
|
|
|
|
//可根据具体需求设置定位配置参数(这里只列出一些主要的参数)
|
|
|
|
|
val locationOption = App.LocationClient.getLocationOption().setAccuracy(SettingUtils.locationAccuracy)//设置位置精度:高精度
|
|
|
|
|
.setPowerRequirement(SettingUtils.locationPowerRequirement) //设置电量消耗:低电耗
|
|
|
|
|
.setMinTime(SettingUtils.locationMinInterval)//设置位置更新最小时间间隔(单位:毫秒); 默认间隔:10000毫秒,最小间隔:1000毫秒
|
|
|
|
|
.setMinDistance(SettingUtils.locationMinDistance)//设置位置更新最小距离(单位:米);默认距离:0米
|
|
|
|
|
.setOnceLocation(false)//设置是否只定位一次,默认为 false,当设置为 true 时,则只定位一次后,会自动停止定位
|
|
|
|
|
.setLastKnownLocation(false)//设置是否获取最后一次缓存的已知位置,默认为 true
|
|
|
|
|
//设置定位配置参数
|
|
|
|
|
App.LocationClient.setLocationOption(locationOption)
|
|
|
|
|
App.LocationClient.startLocation()
|
|
|
|
|
} else {
|
|
|
|
|
Log.w(TAG, "onException: GPS未开启")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun enqueueLocationWorkerRequest(
|
|
|
|
|
conditionType: Int,
|
|
|
|
|
locationJsonOld: String,
|
|
|
|
|
locationJsonNew: String
|
|
|
|
|
conditionType: Int, locationJsonOld: String, locationJsonNew: String
|
|
|
|
|
) {
|
|
|
|
|
val locationWorkerRequest = OneTimeWorkRequestBuilder<LocationWorker>().setInputData(
|
|
|
|
|
workDataOf(
|
|
|
|
|
TaskWorker.conditionType to conditionType,
|
|
|
|
|
"locationJsonOld" to locationJsonOld,
|
|
|
|
|
"locationJsonNew" to locationJsonNew
|
|
|
|
|
TaskWorker.conditionType to conditionType, "locationJsonOld" to locationJsonOld, "locationJsonNew" to locationJsonNew
|
|
|
|
|
)
|
|
|
|
|
).build()
|
|
|
|
|
|
|
|
|
|
WorkManager.getInstance(applicationContext).enqueue(locationWorkerRequest)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handleGpsStatusChanged() {
|
|
|
|
|
val isGpsEnabled = isGpsEnabled()
|
|
|
|
|
//处理 GPS 状态变化
|
|
|
|
|
if (isGpsEnabled) {
|
|
|
|
|
//GPS 已启用
|
|
|
|
|
Log.d(TAG, "handleGpsStatusChanged: GPS 已启用")
|
|
|
|
|
if (SettingUtils.enableLocation && !App.LocationClient.isStarted()) {
|
|
|
|
|
App.LocationClient.startLocation()
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
//GPS 已停用
|
|
|
|
|
Log.d(TAG, "handleGpsStatusChanged: GPS 已停用")
|
|
|
|
|
if (SettingUtils.enableLocation && App.LocationClient.isStarted()) {
|
|
|
|
|
App.LocationClient.stopLocation()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun isGpsEnabled(): Boolean {
|
|
|
|
|
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager?
|
|
|
|
|
return locationManager?.isProviderEnabled(LocationManager.GPS_PROVIDER) == true
|
|
|
|
|
}
|
|
|
|
|
}
|