Как добавить представление внутри службы сообщений Firebase? - PullRequest
0 голосов
/ 14 января 2019

Я использую fcm для push-уведомлений. Когда приходит push-уведомление, мне нужно показать пользователю вид из службы (даже если приложение убито или находится в фоновом режиме), я пытался сделать это в стиле мессенджера Facebook, рисуя оверлеи, у меня уже есть разрешение на создание оверлеев (android.permission.SYSTEM_ALERT_WINDOW), это мой класс обслуживания

package com.radisolutions.radipeople.radihome.services

    import android.app.Service
    import android.content.Context
    import android.content.Intent
    import android.os.IBinder
    import android.util.Log
    import android.view.LayoutInflater
    import android.view.WindowManager
    import com.google.firebase.messaging.FirebaseMessagingService
    import com.google.firebase.messaging.RemoteMessage
    import com.radisolutions.radipeople.radihome.R

    class FCMMessageReceiverService : FirebaseMessagingService() {

        override fun onMessageReceived(remoteMessage: RemoteMessage?) {

           Log.i("naveen", remoteMessage?.notification?.body.toString())
            val view = LayoutInflater.from(applicationContext).inflate(R.layout.overlay_visitor_alert, null)
            val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
            val layoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT)
            windowManager.addView(view, layoutParams)
        }

        override fun onCreate() {
            super.onCreate()

        }



    }

но в строке windowmanager.addview это вызывает ошибку ниже

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Как это исправить? Обычно это работает, когда я создаю представление внутри какого-либо класса broadcastreceiver, но не работает с классом обслуживания firebase.

1 Ответ

0 голосов
/ 18 января 2019

Наконец-то я получил решение сам, FirebaseMessagingService () не имеет контекста для раздувания представления, поэтому мне нужно запустить службу внутри метода onMessageReceived и раздувать представление оттуда как

val fcmDrawOverlayService = Intent(this@FCMMessageReceiverService, FcmDrawOverlayService::class.java)
startService(fcmDrawOverlayService)

и надуйте его методом fcmDrawOverlayService onCreate ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...