Итак, я создаю приложение, в котором мне нужно асинхронно добавлять геозоны при получении сообщения от 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
все безрезультатно.
Это действительно невозможно?Если да, то с какой стратегией мне следует придерживаться, если я хочу инициализировать геозоны вот так?