Android MediaPlayer OnCompletionListener не вызывается в JUnit Testcase (AndroidTestCase)! - PullRequest
2 голосов
/ 23 января 2012

Я использую класс Android MediaPlayer и пытаюсь написать контрольный пример, который проверяет, что вызывается метод onCompletion. Я использую его для воспроизведения следующего трека после того, как предыдущий закончен.

Когда я запускаю приложение с помощью эмулятора (2.1 или 4.0), вызывается метод onCompletion, и начинается воспроизведение следующей дорожки, но в тестовом примере это не так. Вот упрощенный код:

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener {

    public void testContinuePlayNextTrack() {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(this);
        try {
            mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3");
            mediaPlayer.prepare();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        System.out.println("ON COMPLETION!!!!!");
    }
}

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

Это стоило мне много часов. Надеюсь, у кого-то есть решение!

Большое спасибо !!!

Ответы [ 3 ]

4 голосов
/ 19 сентября 2013

Я столкнулся с этой проблемой, и у меня ничего не получалось.На официальном сайте (нажмите меня) для MediaPlayer можно найти следующее предложение:

Чтобы получить соответствующий обратный вызов, связанный с этими слушателями, необходимо создать приложенияОбъекты MediaPlayer в потоке с собственным запущенным Looper (основной поток пользовательского интерфейса по умолчанию имеет запущенный Looper).

Я немного растерялся, так как не было намека на эту необходимость в API дляonCompletionListener себя.

2 голосов
/ 27 марта 2012

Я думаю, что проблема в том, что ваш тестовый пример больше не выполняется, когда MediaPlayer заканчивает воспроизведение mp3. Таким образом, ваше решение состоит в том, чтобы поддерживать тестовый пример до тех пор, пока не будет запущен onCompletion ().

У меня была похожая проблема при воспроизведении файла из IntentService. Служба была уничтожена до начала обратного вызова.

0 голосов
/ 13 июля 2017

На самом деле причина в том, что MediaPlayer является локальной переменной.После завершения testContinuePlayNextTrack () MediaPlayer собирается GC.Так что исправить легко, сделайте ваш MediaPlayer членом класса.

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener {
    MediaPlayer mediaPlayer = new MediaPlayer();

    public void testContinuePlayNextTrack() {
        mediaPlayer.setOnCompletionListener(this);
        try {
            mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3");
            mediaPlayer.prepare();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        System.out.println("ON COMPLETION!!!!!");
    }

}

...