99 lines
3.5 KiB
Kotlin
99 lines
3.5 KiB
Kotlin
package com.example.smart119
|
|
|
|
import android.app.NotificationChannel
|
|
import android.app.NotificationManager
|
|
import android.app.Service
|
|
import android.content.Intent
|
|
import android.content.pm.PackageManager
|
|
import android.location.Location
|
|
import android.os.IBinder
|
|
import android.os.Looper
|
|
import android.util.Log
|
|
import androidx.core.app.ActivityCompat
|
|
import androidx.core.app.NotificationCompat
|
|
import com.google.android.gms.location.FusedLocationProviderClient
|
|
import com.google.android.gms.location.LocationCallback
|
|
import com.google.android.gms.location.LocationRequest
|
|
import com.google.android.gms.location.LocationResult
|
|
import com.google.android.gms.location.LocationServices
|
|
import com.google.android.gms.location.Priority
|
|
|
|
class LocationService : Service() {
|
|
private lateinit var fusedLocationClient: FusedLocationProviderClient
|
|
private lateinit var locationCallback: LocationCallback
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
|
|
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
|
|
|
|
locationCallback = object : LocationCallback() {
|
|
override fun onLocationResult(result: LocationResult) {
|
|
for (location: Location in result.locations) {
|
|
// Log.d("LocationService", "위치: ${location.latitude}, ${location.longitude}")
|
|
// TODO: 서버 전송 또는 처리 로직 추가
|
|
val lat = location.latitude
|
|
val lon = location.longitude
|
|
|
|
// ✅ LocationHelper에 위치 저장
|
|
LocationHelper.setCurrentLocation(lat, lon)
|
|
println("[GPS_UPDATE] lon:${lon}, lat:${lat}")
|
|
|
|
// ✅ Broadcast도 필요 시 같이 전송
|
|
// broadcastLocation(lat, lon)
|
|
}
|
|
}
|
|
}
|
|
|
|
startLocationUpdates()
|
|
}
|
|
|
|
private fun startLocationUpdates() {
|
|
val request = LocationRequest.create().apply {
|
|
interval = 5_000
|
|
fastestInterval = 3_000
|
|
priority = Priority.PRIORITY_HIGH_ACCURACY
|
|
}
|
|
|
|
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
|
|
!= PackageManager.PERMISSION_GRANTED
|
|
) return
|
|
|
|
fusedLocationClient.requestLocationUpdates(request, locationCallback, Looper.getMainLooper())
|
|
}
|
|
|
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
startForegroundServiceWithNotification()
|
|
return START_STICKY
|
|
}
|
|
|
|
private fun startForegroundServiceWithNotification() {
|
|
val channelId = "location_service_channel"
|
|
val channel = NotificationChannel(
|
|
channelId,
|
|
"Location Service",
|
|
NotificationManager.IMPORTANCE_LOW
|
|
)
|
|
val manager = getSystemService(NotificationManager::class.java)
|
|
manager.createNotificationChannel(channel)
|
|
|
|
val notification = NotificationCompat.Builder(this, channelId)
|
|
.setContentTitle("위치 추적 중")
|
|
.setContentText("백그라운드에서 위치를 추적하고 있습니다.")
|
|
.setSmallIcon(R.drawable.ic_location_on)
|
|
.build()
|
|
|
|
try {
|
|
startForeground(1, notification)
|
|
} catch (e: Exception) {
|
|
println(e.message)
|
|
}
|
|
}
|
|
|
|
override fun onDestroy() {
|
|
super.onDestroy()
|
|
fusedLocationClient.removeLocationUpdates(locationCallback)
|
|
}
|
|
|
|
override fun onBind(intent: Intent?): IBinder? = null
|
|
} |