Я использую собственное приложение музыкального проигрывателя, которое использует службу переднего плана с android.media.MediaPlayer
с режимом пробуждения PARTIAL_WAKE_LOCK
для воспроизведения музыки. Разрешения FOREGROUND_SERVICE
и WAKE_LOCK
объявлены в манифесте.
Все это отлично работало в течение многих лет на моем устройстве Huawei под управлением Android 9 (API 28), но на моем новом Samsung Galaxy A51 под управлением Android 10 (API 29) музыка через некоторое время перестает воспроизводиться. Первые несколько песен в порядке, но через некоторое время после достижения конца предыдущей песни воспроизведение следующей песни не начинается (следующая песня начинается в MediaPlayer.OnCompletionListener.onCompletion()
). Дело не в том, что приложение убивается, как только я включаю экран, начинает играть следующая песня.
Я попытался внести свое приложение в белый список в настройках Android «Приложения/Специальный доступ/Оптимизировать использование батареи» и использовать ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
. Я читал об использовании чего-то вроде MediaSession
для регистрации моего приложения в качестве музыкального проигрывателя и нескольких других сообщениях StackOverflow, описывающих аналогичные проблемы, и я пробовал несколько решений, но ничего не работает. Может быть, кто-то может направить меня в правильном направлении.
РЕДАКТИРОВАТЬ: Вот как MediaPlayer
запускается из службы (уменьшенная версия):
@Override
public void onCreate() {
player = new MediaPlayer();
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioAttributes(new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
play();
}
public void play() {
player.reset();
player.setDataSource(getApplicationContext(), getSong().getContentUri());
player.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer player) {
setVolume();
player.start();
}
@Override
public void onCompletion(MediaPlayer player) {
// Go to next song.
play();
}