在我的 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)似乎没有这种奇怪的行为。
在此先感谢您的帮助!