Медиабраузерсервис переднего плана отключен при выходе из приложения

#android #mediabrowserservicecompat

#Android #mediabrowserservicecompat

Вопрос:

Я следую руководству Android по использованию MediaBrowserServiceCompat в приложении media Player, но служба отключена при выходе из приложения.

     <service android:name=".media.PlaybackService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService" />
        </intent-filter>
    </service>
  

При запуске приложения служба создана правильно. mediaController.transportControls.play() Вызывается нажатие кнопки On, и после этого onPlay() вызывается метод из моего класса обратного вызова сеанса. Запускается внутренняя onPlay() служба: context.startService(Intent(context, MediaBrowserServiceCompat::class.java)) (также пробовалась startForegroundService для Oreo и выше) и устанавливается на передний план: this@PlaybackService.startForeground(SERVICE_ID, notificationBuilder?.build()) . Создан канал уведомлений для API Oreo nad higher.

На данный момент запущено уведомление, и я вижу, что служба находится на переднем плане, выполнив команду:

 $adb shell dumpsys activity services PlaybackService
(...)
isForeground=true foregroundId=1 foregroundNoti=Notification(channel=MyChannelId pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x62 color=0xff000000 category=transport actions=1 vis=PUBLIC)
(...)
  

Пока все работает нормально, но когда я нажимаю кнопку «Домой», я ожидаю, что сервис останется запущенным, но вместо этого вызывается onDestroy() метод моего MediaBrowserServiceCompat класса. После возврата в приложение и повторного запуска сервиса он не настроен на передний план (также нет уведомления).

Я использую только один startService вызов в своем приложении и удалил все вызовы stopSelf и stopForeground для тестирования.

В API 28, 26, 22 и 18 я получаю тот же результат.

Я также пытался вернуться START_STICKY из onStartCommand() .

Комментарии:

1. Вы выяснили, в чем была проблема? Я сталкиваюсь с точно такой же проблемой, и было бы здорово узнать, что вы сделали. Документация Google просто ужасна в отношении MediaBrowserService и всех его тонкостей

2. К сожалению, у меня не было времени доработать этот хобби-проект, поэтому я смирился с ухудшением пользовательского интерфейса.

3. @RikvanVelzen Ты разобрался с этим? Я застрял с той же проблемой и не смог найти какую-либо соответствующую документацию

Ответ №1:

Конечно, может быть, что ваше MediaBrowser соединение было единственным, что поддерживало MediaBrowserService работу, и закрытие этого соединения приводит к MediaBrowserService уничтожению.

В моем случае я решил создать службу до создания MediaBrowser :

 // Create the media browser service
Intent intent = new Intent(application, MusicService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} 
else {
    context.startService(mixerIntent);
}

// Create connection with the service
mediaBrowser = MediaBrowserCompat(
        context,
        ComponentName(requireContext(), MusicService::class.java),
        connectionCallbacks,
        null
)
  

Не забывайте: после создания службы служба должна вызвать свой startForeground метод в течение пяти секунд.