У меня есть простое Android приложение, содержащее одно Activity
и Service
, полученное из MediaBrowserServiceCompat
. Я успешно настроил его на воспроизведение аудио из моей основной деятельности, используя MediaBrowserCompat
и MediaControllerCompat
. Он может даже воспроизводить и приостанавливать звук из моих наушников Bluetooth. Все хорошо.
Моя проблема связана с уведомлением NotificationCompat.MediaStyle
, которое появляется на экране блокировки и в области уведомлений. Уведомление отображается правильно. Однако, когда я добавляю кнопки, используя addAction()
и MediaButtonReceiver.buildMediaButtonPendingIntent
, они ничего не делают. Если я вместо этого добавлю фиктивный PendingIntent, который просто запускает мою основную деятельность, он работает нормально.
Вот мой код для генерации уведомления (извинения, это C# работает в Xamarin, поэтому регистр и имена будут немного отличается от того, что вы могли бы ожидать). Это внутри моего класса обслуживания.
var builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.SetVisibility(NotificationCompat.VisibilityPublic)
.SetSmallIcon(Resource.Drawable.ic_launcher)
.SetContentTitle("Title")
.SetContentText("Content")
.SetSubText("Subtext")
.SetLargeIcon(icon)
.SetColor(Android.Graphics.Color.DarkOrange)
.SetContentIntent(intent)
.SetDeleteIntent(MediaButtonReceiver.BuildMediaButtonPendingIntent(this, PlaybackStateCompat.ActionStop))
.AddAction(new NotificationCompat.Action(
Resource.Drawable.ic_pause, "Pause",
MediaButtonReceiver.BuildMediaButtonPendingIntent(this, PlaybackStateCompat.ActionPause)))
.SetStyle(new Android.Support.V4.Media.App.NotificationCompat.MediaStyle()
.SetShowActionsInCompactView(0)
.SetMediaSession(this.mediaSession.SessionToken)
.SetShowCancelButton(true)
.SetCancelButtonIntent(MediaButtonReceiver.BuildMediaButtonPendingIntent(this, PlaybackStateCompat.ActionStop))
);
this.StartForeground(NOTIFICATION_ID, builder.Build());
Вот что я уже рассмотрел, чтобы попытаться решить эту проблему:
- Когда я начинаю воспроизведение, я использую
MediaSession.setActive(true)
- Каждый раз, когда я запускаю и останавливаю воспроизведение, я устанавливаю соответствующие действия в
PlaybackStateCompat
- У меня правильно установлен токен сеанса.
- У меня нет в моем манифесте есть что-то, настроенное как
MediaButtonReceiver
, и я не настроил ничего для обработки android.intent.action.MEDIA_BUTTON
, потому что я нацеливаюсь на Android 5.0 и выше и использую классы *Compat
, и я понимаю, что это больше не требуется.
Я знаю, что события мультимедийных кнопок правильно перенаправляются в мое приложение, поскольку мои кнопки наушников Bluetooth работают. Я попробовал это в своей машине, и там тоже работает. Это просто кнопки в уведомлении, которые не будут работать. Я ожидаю, что они будут генерировать вызовы для соответствующих методов MediaSessionCompat.Callback
. Это неверно? Что я здесь не так делаю?
Буду признателен за любые указатели.
ОБНОВЛЕНИЕ: Я все заработал. Мне нужно было добавить следующее внутри <application>
узла манифеста:
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
... и следующее внутри узла Сервиса, который реализует MediaBrowserServiceCompat
:
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
Я все еще немного растерялся из-за , почему это было необходимо, поскольку нажатия кнопок от моих наушников Bluetooth и автомобильной информационно-развлекательной системы были перенаправлены в приложение просто отлично. Что еще более важно, Google говорит :
Если у вас уже есть MediaBrowserServiceCompat
в вашем приложении, MediaButtonReceiver
будет доставлять полученные ключевые события в MediaBrowserServiceCompat
по умолчанию. Вы можете обрабатывать их в своих MediaSessionCompat.Callback
.
Они дали это как альтернативу опции "Обработка сервисов ACTION_MEDIA_BUTTON", поэтому я понял, что это не так нужно сделать что-нибудь еще с моим манифестом. Если бы кто-нибудь мог просветить меня здесь, я был бы признателен за это.
Но, несмотря на это, это сработало для меня.