ExoPlayer перестает играть в фоновом режиме

У меня есть приложение, которое хранит глобальный экземпляр экземпляра ExoPlayer для облегчения потокового аудио в фоновом режиме. После открытия большого количества приложений звук перестает воспроизводиться.

Бывает так:

  • откройте Activity, который начинает воспроизведение аудио
  • нажмите кнопку "Назад", чтобы закрыть Activity
  • звук все еще воспроизводится и продолжает воспроизводиться, если вы оставите устройство в покое (как предполагалось)

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

Сохранение ссылки на ExoPlayer внутри android.app.Service не имеет значения.

Устройство, на котором я тестирую, - это Nexus 5 с Android 5.1.x, но проблема возникает и на других устройствах.

Мне не удалось найти решение ни на страницах документации ExoPlayer, ни на StackOverflow или Google. Кто-нибудь знает, как правильно запретить ExoPlayer останавливать воспроизведение?


person Byte Welder    schedule 21.12.2015    source источник
comment
Вы пробовали поставить его на передний план Service?   -  person Ricardo    schedule 21.12.2015
comment
Да, я попытался сохранить ссылку на него в android.app.Service.   -  person Byte Welder    schedule 21.12.2015
comment
Интересно, будет ли это иметь значение, если он будет создан из этой службы ...   -  person Byte Welder    schedule 21.12.2015
comment
Я имею в виду не просто любую службу, а одну, запущенную в переднем плане.   -  person Ricardo    schedule 21.12.2015
comment
Спасибо, попробую!   -  person Byte Welder    schedule 21.12.2015
comment
@Ricardo Это сработало. Если вы добавите свой ответ, я его приму. Я также нашел подтверждение этого решения в трекере ошибок ExoPlayer: github.com/google/ExoPlayer/ issues / 421   -  person Byte Welder    schedule 22.12.2015
comment
Круто, только что сделал. Рад, что это сработало.   -  person Ricardo    schedule 22.12.2015
comment
Я также работаю над тем же. В таком случае мне нужно создать экземпляр ExoPlayer в службе переднего плана?   -  person sam_k    schedule 24.06.2016
comment
Да: если вы хотите, чтобы звук воспроизводился в фоновом режиме, вам необходимо сохранить ссылку на экземпляр ExoPlayer в службе переднего плана.   -  person Byte Welder    schedule 24.06.2016
comment
что мне не хватает? я должен начать Service, внутри которого я запускаю действие, содержащее ExoPlayer? что, если я хочу начать действие с startActivityForResult?   -  person user1974368    schedule 04.09.2018


Ответы (1)


Чтобы Service оставался в живых как можно дольше и не был убит системой, вам необходимо запустить его как служба переднего плана.

Это означает, что будет уведомление, информирующее пользователя об активной службе, чтобы он мог знать об этом. По этой причине вы должны запустить службу с соответствующим уведомлением. Вот пример из документации:

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
            System.currentTimeMillis()); 
Intent notificationIntent = new Intent(this, ExampleActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
notification.setLatestEventInfo(this, getText(R.string.notification_title),
            getText(R.string.notification_message), pendingIntent); 
startForeground(ONGOING_NOTIFICATION_ID, notification);
person Ricardo    schedule 22.12.2015
comment
Большое спасибо за эти знания! +1 - person Ankit Aggarwal; 05.10.2016
comment
@AnkitAggarwal Этот блок кода работает на вашей стороне? - person Maveňツ; 31.07.2017
comment
для будущих посетителей: Android 8.0+ требует идентификатора канала для уведомлений. Больше информации здесь. developer.android.com/training/notify-user/channels - person G Singh; 16.06.2018