Не получает намерения в Geofence IntentService через PendingIntent от другого Сервиса - PullRequest
0 голосов
/ 29 апреля 2019

Итак, я создаю приложение, в котором мне нужно асинхронно добавлять геозоны при получении сообщения от Firebase.Это сообщение получено на FirebaseMessagingService, что расширяет EnhancedIntentService.С тех пор я создаю геозоны, как описано в этом руководстве.Тем не менее, хотя я уверен, что геозоны добавляются правильно, я не получаю никаких намерений на моем IntentService.Я чувствую, что причина в том, что мой PendingIntent из FirebaseMessagingService не работает должным образом из-за невозможности пройти в соответствующем контексте, но я не уверен, каким может быть решение.Вместо этого я попытался использовать BroadcastReceiver, так как это может быть вызвано только действием, но это также не дало никаких результатов.

My FirebaseMessagingService, которое создает геозоны:

class EventStatusMessagingService : FirebaseMessagingService() {
    private lateinit var geoFencingClient: GeofencingClient

    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        remoteMessage?.data?.isNotEmpty()?.let {
            val data = remoteMessage.data
            // Create GeoFence w/ data
            geoFencingClient = LocationServices.getGeofencingClient(this)
            val geoFence = createGeofence(data, remoteMessage.from!!.replace("/topic",""))
            val geoFenceRequest = getGeoFencingRequest(geoFence)
            if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
                geoFencingClient.addGeofences(geoFenceRequest, geoFencingPendingIntent)?.run {
                    addOnSuccessListener {
                        Log.i("test", "Successfully added GeoFences")
                    }
                    addOnFailureListener {
                        Log.w("test", "Could not add GeoFences")
                    }
                }
            }
        }
    }

    private fun createGeofence(data: Map<String, String>, key: String): Geofence {
        return Geofence.Builder().apply {
            setRequestId(key)
            setCircularRegion(
                data.getValue("latitude").toDouble(),
                data.getValue("longitude").toDouble(),
                data.getValue("radius").toFloat()
            )
            setExpirationDuration(data.getValue("duration").toLong() * 3600000) // to Milliseconds
            setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT
                    or Geofence.GEOFENCE_TRANSITION_DWELL)
            setLoiteringDelay(120000)
        }.build()
    }

    private fun getGeoFencingRequest(geoFence: Geofence) : GeofencingRequest {
        return GeofencingRequest.Builder().apply {
            setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
            addGeofence(geoFence)
        }.build()
    }

    private val geoFencingPendingIntent: PendingIntent by lazy {
        val intent = Intent(applicationContext, GeoFenceIntentService::class.java)
        PendingIntent.getService(applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

Мой базовый IntentService только для тестирования

class GeoFenceIntentService : IntentService("GeoFenceService") {
    override fun onHandleIntent(intent: Intent?) {
        Log.d("test", "got geofence callback")
        val geoFencingEvent = GeofencingEvent.fromIntent(intent)

        when(geoFencingEvent.geofenceTransition) {
            Geofence.GEOFENCE_TRANSITION_ENTER -> {
            }
            Geofence.GEOFENCE_TRANSITION_EXIT -> {
            }
            Geofence.GEOFENCE_TRANSITION_DWELL -> {
            }
        }
    }
}

Да, я добавил свою службу в AndroidManifest.xml

        <service
                android:name=".gps.services.GeoFenceIntentService"/>
        <service
                android:name=".events.services.EventStatusMessagingService"
                android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

Мои Log.i сообщения от службы обмена сообщениями действительно появляются вконсоль, но независимо от того, что и как я ее тестирую, никогда не появляется сообщение журнала от IntentService.

Из того, что я понял, проблема в том, что я пытаюсь запустить IntentService из другой службы, но я не уверенкак я должен заняться этим.Я также пытался переключиться с applicationContext на baseContext на this все безрезультатно.

Это действительно невозможно?Если да, то с какой стратегией мне следует придерживаться, если я хочу инициализировать геозоны вот так?

...