Потоковое аудио: предотвращение «приложения завершено» в фоновом режиме - PullRequest
0 голосов
/ 08 апреля 2019

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

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

V/MediaPlayer-JNI: release
V/MediaPlayer-JNI: setListener
     disconnected
V/MediaPlayer-JNI: destructor
     disconnected
W/MediaPlayer: mediaplayer went away with unhandled events
D/ContentValues: onDestroy
Application terminated.

Похоже, приложение просто убито ОС.

«Медиаплеер ушел с необработанными событиями» - распространенная проблема, когда аудиофайл не был запущен должным образом, но в этом случае ошибка возникает при потоковой передаче через 30 секунд.

Это код, который я использую:

public class SoundService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnErrorListener {

public void onCreate() {

    Log.i("Script", "onCreate");

    if(player == null){
        try {
            Log.i("Script", "onCreate: Try");
            player = new MediaPlayer();
            player.setDataSource("enter url");
            player.prepareAsync();

            player.setOnBufferingUpdateListener(this);
            player.setOnCompletionListener(this);
            player.setOnErrorListener(this);
            player.setOnPreparedListener(this);
            player.setOnSeekCompleteListener(this);

        }

        catch (IllegalArgumentException e) { e.printStackTrace(); }
        catch (SecurityException e) { e.printStackTrace(); }
        catch (IllegalStateException e) { e.printStackTrace(); }
        catch (IOException e) { e.printStackTrace(); }

    }
    else{
        Log.i("Script", "onCreate: start");
        player.start();
    }
}

Вот слушатели:

@Override
public void onPrepared(MediaPlayer mp) {
    Log.i("Script", "onPrepared()");
    player.start();

}

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("Script", "onStartCommand");
    return Service.START_NOT_STICKY;
}

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2019

Убедитесь, что вы запускаете медиаплеер в Сервисе с уведомлением startForeground. Это должно удерживать Сервис, не позволяя ОС уничтожить его.

...