Используя комбинацию ответа Пуйи и некоторых независимых исследований, у меня есть фрагмент кода, который ведет себя довольно близко к приложениям, таким как Spotify, с использованием OOTB MediaPlayer.Возможно, есть более элегантное решение, но это быстрая и грязная версия - у меня слишком много разбросанного кода для публикации, поэтому вместо этого есть обзор:
Когда медиаплеер приостановлен, я запускаю две частикод.Сначала, после обновления панели уведомлений, я превращаю ее из службы переднего плана в фоновую с помощью:
public void demoteNotifyBar() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
stopForeground(STOP_FOREGROUND_DETACH);
else
stopForeground(false);
}
, а затем запускаю новый таймер, который обновляет панель уведомлений раз в секунду:
// Put this in the onCreate method
pauseRefresh = new Runnable() {
@Override
public void run() {
// Check if media is playing to prevent race conditions
if (!isPlaying()) {
startForeground(FOREGROUND_SERVICE, notification);
demoteNotifyBar();
handler.postDelayed(pauseRefresh, 1000);
}
}
};
// Call this wherever you're handling the pause button
pauseRefresh.run();
Чтобы отменить автообновление, вам нужно вызвать этот бит кода перед тем, как переделать панель уведомлений и переключить медиа с паузы на воспроизведение (да, вы можете проигнорировать это для переключения аудио, но читайте нижепочему это необходимо):
handler.removeCallbacks(pauseRefresh);
Вам также нужно будет прослушивать отклонение свайпа с намерением удаления, чтобы предотвратить повторное извещение уведомления, когда пользователь отклоняет его;просто используйте тот же код, чтобы отменить таймер, который используется, когда пользователь нажимает кнопку воспроизведения.