0

在我的 android 应用程序中,我创建了一个使用 MediaPlayer 播放远程流的服务。

每次播放流时,应用程序都会显示一条通知。此通知显示一个简单的播放/暂停按钮和其他信息来启动和停止流。

该服务创建通知如下:

private fun buildNotification() {
        val notification = NotificationCompat.Builder(this, this.notificationChannelId)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setSmallIcon(R.drawable.ic_pnr_round)
                .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
                .setContentText(this.currentArtist)
                .setContentTitle(this.currentTitle)
                .setSubText(this.defaultAlbum)
                .setStyle(MediaStyle()
                 .setMediaSession(this.mediaSession.value.sessionToken)
                )
                .setContentIntent(PendingIntent.getActivity(applicationContext, 0, Intent(applicationContext, MainActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT))


        if (this.mediaSession.value.controller.playbackState.state == PlaybackStateCompat.STATE_PLAYING) {
            notification.addAction(NotificationCompat.Action(
                    R.drawable.ic_pause, getString(R.string.notification_pause),
                    MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_STOP))
            )
        } else {
            notification.addAction(NotificationCompat.Action(
                    R.drawable.ic_play, getString(R.string.notification_play),
                    MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_PLAY))
            )
        }


        val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            val nc = NotificationChannel(this.notificationChannelId, this.notificationChannel, NotificationManager.IMPORTANCE_LOW)
            nc.enableLights(false)
            nc.enableVibration(false)
            notificationManager.createNotificationChannel(nc)
        }

        notificationManager.notify(0, notification.build())
    }

为了捕捉通知动作,我使用 MediaSession 回调

private val callbacks = object : MediaSessionCompat.Callback() {
    override fun onPlay() {
        play()
    }

    override fun onPause() {
        pause()
    }

    override fun onStop() {
        stop()
    }
}

服务和接收者注册在 AndroidManifest.xml

<service
    android:name=".services.MediaPlayerService"
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

问题是:每次我使用通知中的按钮时,应用程序都会停止,显示

"APP isn't responding"

日志显示此错误:

E/MediaPlayerNative: error (100, 1)
                     error (100, 2)
E/MediaPlayer: Error (100,1)
E/MediaPlayer: Error (100,2)
E/MediaPlayerNative: error (1, -38)
E/MediaPlayerNative: error (1, -32)
E/MediaPlayerNative: error (1, -38)
E/MediaPlayer: Error (1,-38)
E/MediaPlayer: Error (1,-32)
E/MediaPlayer: Error (1,-38)

在应用程序的其他部分使用此服务可以按预期工作。

我怀疑 MediaButtonReceiver.buildMediaButtonPendingIntent 引起了麻烦。

问题似乎仅限于 android 8 和 8.1,我测试的其他版本(5、6、7.1、9)似乎没有这种奇怪的行为。

在此先感谢您的帮助!

4

1 回答 1

0

好的,我设法解决了这个谜团

改变

notificationManager.notify(0, notification.build())

startForeground(0, notification.build())

解决了这个问题。

我正在等待 Issuetracker 中的 ASOP 团队澄清为什么这只发生在 Oreo 上。

于 2018-10-01T10:38:36.483 回答