Ошибка: невозможно создать экземпляр получателя ... не имеет конструктора с нулевым аргументом - PullRequest
0 голосов
/ 30 октября 2019

У меня проблема с моим классом BroadcastReceiver, который находится внутри моей MainActivity как внутреннего класса. Каждый раз, когда я нажимаю кнопку в уведомлении моего приложения, я получаю эту ошибку:

java.lang.RuntimeException: Unable to instantiate receiver com.oniktech.testmediaservice.MainActivity$MediaReceiver: java.lang.InstantiationException: java.lang.Class<com.oniktech.testmediaservice.MainActivity$MediaReceiver> has no zero argument constructor

вот мой код:

val playPauseAction = NotificationCompat.Action(
            icon, play_pause,
            MediaButtonReceiver.buildMediaButtonPendingIntent(
                this,
                PlaybackStateCompat.ACTION_PLAY_PAUSE
            )
        )

    builder.setContentTitle("my test")
                .addAction(playPauseAction)
                .setStyle(
                    androidx.media.app.NotificationCompat.MediaStyle()
                        .setMediaSession(mediaSession.getSessionToken())
                        .setShowActionsInCompactView(0)
                )

            notificatioManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            notificatioManager.notify(0, builder.build())

и вот мой внутренний класс:

inner class MediaReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            MediaButtonReceiver.handleIntent(mediaSession, intent)
        }
    }

Я знаю, что я не должен использовать внутренний класс в этом случае. Но я должен использовать свой объект 'mediaSession' в нем. Что я должен делать? спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 октября 2019

Проблема - 1: Ваш MediaReceiver должен быть Nested, только не inner. В Kotlin Nested класс является статическим по умолчанию. Так что удалите внутреннее ключевое слово.

class MediaReceiver : BroadcastReceiver() {
}

Проблема - 2: Вы хотите получить доступ к свойству внешнего класса из BroadcastReceiver, что не является хорошей практикой. Вам следует избегать этого. Но если вы все еще хотите это сделать, вы должны сделать это свойство статичным и использовать его внутри Receiver. Проверьте мой пример реализации ниже.

class MainActivity {
    companion object {
        var mediaSession: MediaSessionCompat? = null
    }

    class MediaReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            MediaButtonReceiver.handleIntent(mediaSession, intent)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...