emg_119/app/src/main/java/com/example/smart119/LocationService.kt
2025-03-25 15:48:12 +09:00

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
}