Невозможно запустить приемник свойства свойства lateinit не был инициализирован - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь сделать сигнал, который отправляет уведомление, когда приложение закрыто. Я создал Alarm Manager в MainActivity и создал внутренний класс для BroadcastReceiver, как только срабатывает onReceive(), мне нужно отправить уведомление. Будильник работает, но каждый раз, когда он пытается отправить уведомление, я получаю сообщение об ошибке

2020-03-25 13: 19: 33.166 15045-15045 / com. kotlin .ambulantlcs E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com. kotlin .ambulantlcs, PID: 15045 java .lang.RuntimeException: Невозможно запустить получатель com. kotlin .ambulantlcs.ui.MainActivity $ Получатель: kotlin .UninitializedPropertyAccessException : свойство lateinit messagesManager не было инициализировано в android .app.ActivityThread.handleReceiver (ActivityThread. java: 3997) в android .app.ActivityThread.access $ 1500 (ActivityThread. java: 267) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1992) в android .os.Handler.dispatchMessage (Обработчик. java: 107) в android .os.Looper.l oop (Looper. java: 237) на android .app.ActivityThread.main (ActivityThread. java: 7777) на java .lang.reflect.Method.invoke (собственный метод) на com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) в com. android .internal.os .ZygoteInit.main (ZygoteInit. java: 1047) Вызывается: kotlin .UninitializedPropertyAccessException: свойство свойства lateinit не было инициализировано в com. kotlin .ambulantlcs.ui.MainActivity $ Receiver.onReceive (MainActivity.kt: 100) по android .app.ActivityThread.handleReceiver (ActivityThread. java: 3988) по android .app.ActivityThread.access $ 1500 (ActivityThread. java: 267) по android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1992) в android .os.Handler.dispatchMessage (Handler. java: 107) в android .os.Looper.l oop (Looper. java : 237) в android .app.ActivityThread.main (ActivityThread. java: 7777) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 1047)

Пожалуйста, смотрите весь мой код ниже.

import android.app.*
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.RemoteViews
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavOptions
import androidx.navigation.Navigation
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import com.kotlin.ambulantlcs.R
import com.kotlin.ambulantlcs.storage.SharedDataManager
import com.kotlin.ambulantlcs.ui.fragments.LoginFragmentDirections
import java.util.*


open class MainActivity : AppCompatActivity() {

    lateinit var context: Context
    lateinit var alarmManager: AlarmManager
    val obj: MainActivity = this

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val appBarConfiguration = AppBarConfiguration
            .Builder(R.id.homeFragment, R.id.loginFragment)
            .build()

        setAlarm()

        if(SharedDataManager.getInstance(this).isLoggedIn) {
            var navOptions = NavOptions.Builder()
                .setPopUpTo(R.id.action_login_Home, true)
                .build()

            val navController = Navigation.findNavController(this, R.id.fragment)
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
            navController.navigate(
                LoginFragmentDirections.actionLoginHome()
            )
        } else {
            val navController = Navigation.findNavController(this, R.id.fragment )
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)

        }
    }


    override fun onBackPressed() {
        Toast.makeText(applicationContext, "Function is not allowed", Toast.LENGTH_SHORT).show()
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.fragment), null)
    }

    fun setAlarm() {
        Log.d("MainActivity", "Create: ${Date().toString()}")
        context = this
        alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val seconds = 10 * 1000
        val intent = Intent(context, Receiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        Log.d("MainActivity", "SECONDS: ${seconds.toLong()}")
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,  seconds.toLong(), seconds.toLong(), pendingIntent)
    }

    class Receiver : BroadcastReceiver() {
        lateinit var notificationManager : NotificationManager
        lateinit var notificationChannel : NotificationChannel
        lateinit var builder : Notification.Builder
        private val channelId = "i.apps.notifications"
        private val description = "Test notification"

        override fun onReceive(context: Context?, intent: Intent?) {
           Log.d("MainActivity", " Receiver: ${Date().toString()}")
            val intent = Intent(context, MainActivity::class.java)

            val pIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            val contentView = RemoteViews("com.kotlin.ambulantlcs",
                R.layout.activity_main)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                notificationChannel = NotificationChannel(
                    channelId,description,NotificationManager.IMPORTANCE_HIGH)
                notificationChannel.enableLights(true)
                notificationChannel.lightColor = Color.GREEN
                notificationChannel.enableVibration(false)
                notificationManager.createNotificationChannel(notificationChannel)

                builder = Notification.Builder(context, channelId)
                    .setContent(contentView)
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setContentIntent(pIntent)
            }else{

                builder = Notification.Builder(context)
                    .setContent(contentView)
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setContentIntent(pIntent)
            }
            notificationManager.notify(1234,builder.build())
        }
    }
}

Можете ли вы помочь мне исправить это? Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Причина сбоя приложения в том, что вы не инициализируете notificationManager. Вместо того, чтобы объявлять его как lateinit var, вы можете просто инициализировать его в вашем Receiver классе:

val notificationManager : NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
0 голосов
/ 25 марта 2020

Ваш уведомитель не имеет значения (вы не инициализируете его). Попробуйте это:

if (notificationManager == null) {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }
...