как запустить сервис отслеживания местоположения после выключения экрана? - PullRequest
0 голосов
/ 08 июля 2019

местоположение не может обновляться при выключенном экране.

Как запустить службу отслеживания местоположения после выключения экрана?

Я запускаю службу, используя

val serviceClass = ControlLocationService::class.java
val intent = Intent(activity, serviceClass)
activity?.startService(intent)

InМетод onLocationChanged Я пытаюсь использовать Log.e (), но не показываю широту и долготу в logcat, когда экран выключен

class ControlLocationService : Service() {

    lateinit var locationRequest: LocationRequest
    lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    private lateinit var locationCallback:LocationCallback

    override fun onBind(intent: Intent): IBinder? {
        throw UnsupportedOperationException("Not yet implemented")
    }

    @SuppressLint("InvalidWakeLockTag")
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        //service is started
        updateLocation()
        return START_STICKY
    }

    @SuppressLint("MissingPermission")
    private fun updateLocation() {
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                onLocationChanged(locationResult!!.lastLocation)
            }
        }
        buildLocationRequest()
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
    }

    private fun onLocationChanged(location: Location) {
        Log.e("...", location.latitude.toString()+location.longitude.toString())
    }

    private fun buildLocationRequest() {
        locationRequest = LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 3000
        locationRequest.fastestInterval = 1000
        //locationRequest.smallestDisplacement = 1f
    }


}

Помогите мне рассказать об управлении службами, когда экран выключен.спасибо.

1 Ответ

0 голосов
/ 08 июля 2019

Вам понадобится будильник, и я также сделаю ваш сервис приоритетным. Это снизит вероятность того, что Android убьет ваше приложение или службу. На самом деле в соответствии с Background Location Limits не сказано, что вам нужен wakelock - только приоритетный сервис. Заставляя ваше приложение непрерывно работать в фоновом режиме, вы заставите его быстро разряжать пользовательскую батарею - что плохо. Подумайте об использовании пассивных обновлений местоположения, это может произойти несколько раз в час, а это может быть не то, что вам нужно.

Возможно, вы также захотите прочитать о режиме ожидания , который заставляет все приложения, не занесенные в белый список, игнорировать блокировки пробуждения в режиме отключения экрана.

Чтобы добавить блокировку от пробуждения:

val mgr = service.getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myAppName:MyWakeLock")
wakeLock.acquire()

in onDestroy:

wakeLock.release()

Используйте приведенный ниже код, чтобы добавить уведомление в панель уведомлений и сделать сервис приоритетным. Вы должны добавить addServiceNotification(this) в свой onStartCommand.

fun addServiceNotification(service: Service) {
    val mgr = NotificationManagerCompat.from(service)
    val title = "Caption"
    val text = "Location"

    if (Build.VERSION.SDK_INT >= 26) {
        val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        if (notificationManager != null) {
            var mChannel: NotificationChannel? = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
            if (mChannel == null) {
                mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "myAppName", NotificationManager.IMPORTANCE_LOW)
                notificationManager.createNotificationChannel(mChannel)
            }
        }

        val notification = NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID)
                .setSmallIcon(R.drawable.app_icon)
                .setTicker(title)
                .setWhen(System.currentTimeMillis())
                .setContentTitle(title)
                .setContentText(text)
                .setOnlyAlertOnce(true)
                .setOngoing(true)
                .build()

        service.startForeground(LOCATION_NOTIFICATION_ID, notification)
        mgr.cancel(LOCATION_NOTIFICATION_ID)
        mgr.notify(LOCATION_NOTIFICATION_ID, notification)
    }
}

// remove notification for location service
fun removeServiceNotification(service: Service) {
  val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  notificationManager?.cancel(LOCATION_NOTIFICATION_ID)
}

companion object {
    val LOCATION_NOTIFICATION_ID = 1001
    val NOTIFICATION_CHANNEL_ID = "myAppName"
}
...