Музыкальный проигрыватель останавливается

Я использую собственное приложение музыкального проигрывателя, которое использует службу переднего плана с 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();
}

person 0ne_Up    schedule 17.02.2021    source источник
comment
возможно, включите весь ваш текущий код, достаточный для того, чтобы другие могли скопировать вставку в качестве полного примера, может дать вам лучшие ответы   -  person a_local_nobody    schedule 17.02.2021
comment
Я прочитал несколько других сообщений, таких как stackoverflow.com/questions/37834195/, stackoverflow.com/questions/64684419/ и stackoverflow.com/questions/49098126/ , но, похоже, ничего не работает. Такие приложения, как Spotify, работают нормально. Может кто-нибудь помочь мне?   -  person 0ne_Up    schedule 19.02.2021
comment
Попробуйте пройти по этой ссылке, может поможет. В противном случае, пожалуйста, поделитесь кодом, чтобы я мог вам помочь. stackoverflow.com/a/60235317/14884388   -  person Hascher    schedule 19.02.2021
comment
Я не пытаюсь ничего записывать, и IllegalStateException не возникает. Я не знаю, какой еще код вам нужен, я поделился кодом, который показывает, как запускается мой MediaPlayer.   -  person 0ne_Up    schedule 20.02.2021
comment
Что говорит ваш логарифм? попробуйте запустить песни на подключенном устройстве и увидите ошибку в logcat при сбое приложения   -  person Usama Altaf    schedule 24.02.2021


Ответы (1)


Я думаю, что это проблема с разрешением на хранение

в Android Q. Если вы даете разрешение и оно предоставлено или не работает, перейдите в «Манифест» и добавьте android:requestLegacyExternalStorage="true"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:requestLegacyExternalStorage="true" //Add this Line
    android:label="@string/app_name">

---------<Activity, Sevices or Recivers>----------

</application>
person Usama Altaf    schedule 24.02.2021
comment
У меня уже есть эта строка в моем манифесте, или она вообще не работала. Но мое устройство недавно обновилось до Android11, и это, похоже, решило проблему. - person 0ne_Up; 24.02.2021
comment
После того как вы обновите свое приложение до Android 11, система игнорирует флаг requestLegacyExternalStorage. - person Usama Altaf; 24.02.2021