Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 10.04.2014 | Доступ: свободный | Студентов: 6841 / 1238 | Длительность: 14:18:00
Специальности: Программист
Самостоятельная работа 7:

Многооконное приложение

12.4 Настройка интерфейса и реализация логики активности для воспроизведения аудио и видео

Настроим интерфейс активности для воспроизведения аудио и видео. Нам понадобится окно предварительного просмотра, добавим в окно активности элемент SurfaceView. Для работы приложения необходимо поле для задания расположения медиа контента для проигрывания, добавим элемент EditText, а также потребуются несколько кнопок, добавим в окно активности следующие кнопки:

b_Start - для запуска воспроизведения контента с начала, зададим свойству On Click этой кнопки значение onClickStart;
b_Pause - для приостановки воспроизведения, зададим свойству On Click этой кнопки значение onClick;
b_Resume - для продолжения воспроизведения с места приостановки, зададим свойству On Click этой кнопки значение onClick;
b_Stop - для полной остановки воспроизведения, зададим свойству On Click этой кнопки значение onClick.

Для возможности выбора зацикленного воспроизведения медиа контента добавим в окно активности элемент CheckBox.

Далее предлагаем настроить интерфейс самостоятельно. В нашем случае активность выглядит так, как показано на рис. 12.2.

Интерфейс активности для воспроизведения аудио и видео

увеличить изображение
Рис. 12.2. Интерфейс активности для воспроизведения аудио и видео

Реализуем логику активности, в данном случае необходимо выполнять следующие действия:

  • при нажатии на кнопку Try to play, запускается воспроизведение с начала контента, расположенного по адресу, указанному в поле ввода, расположенном слева от кнопки;
  • при нажатии на кнопку Pause, воспроизведение контента приостанавливается;
  • при нажатии на кнопку Resume, воспроизведение контента продолжается с места приостановки;
  • при нажатии на кнопку Stop, воспроизведение контента останавливается и может быть возобновлено только с начала, т. е. необходимо снова нажать Try to play.

Элемент Loop управляет возможностью повтора воспроизведения.

Работать будем с файлом MediaActivity.java, описывающим соответствующий класс активности.

Объявим следующие поля класса активности:

MediaPlayer mediaPlayer; //управляет воспроизведением
CheckBox chbLoop;  //управляет режимом повтора
    

В методе onCreate() активности настроим чек-бокс так, чтобы он включал/выключал режим повтора для плеера.

chbLoop = (CheckBox) findViewById(R.id.chb_Loop);
chbLoop.setOnCheckedChangeListener(new 
                          OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
        if (mediaPlayer != null)
        mediaPlayer.setLooping(isChecked);
    }
});
    

Метод onClickStart() используется для обработки нажатий на кнопку Try to play. В этом метода сначала освобождаем ресурсы текущего проигрывателя, используя вызов метода:

releaseMP();
    

Этот метод рекомендуется вызывать по окончанию использования плеера, а также при onPause/onStop, если нет острой необходимости держать объект.

Реализация метода releaseMP():

private void releaseMP() {
    if (mediaPlayer != null) {
        try {
            mediaPlayer.release();
            mediaPlayer = null;
        } catch (Exception e) {
          e.printStackTrace();
        }
    }
}
    

Продолжим рассмотрение метода onClickStart(). В нем после освобождения ресурсов, занимаемся подготовкой плеера к воспроизведению.

mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(DATA);
mediaPlayer.setDisplay(((SurfaceView)
                findViewById(R.id.surfaceView1)).getHolder());
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync();
    

Создаем новый объект класса MediaPlayer.

Используем метод setDataSource() для задания источника данных, в качестве параметра передаем строку из поля ввода, сохраненную в переменной DATA.

Используя метод setDisplay(), задаем экран для воспроизведения, в нашем случае элемент SurfaceView, добавленный в окно активности на этапе формирования интерфейса.

Метод prepareAsync() выполняет асинхронную подготовку плеера к воспроизведению и когда подготовка будет завершена сообщает об этом слушателю, указанному в методе setPreparedListener(). В нашем случае слушателем является сам класс активности, для этого он объявлен, как класс реализующий интерфейс OnPreparedListener. В случае готовности плеера вызывается метод onPrepared(MediaPlayer mp), объявленный в указанном интерфейсе и реализованный в классе активности, в этом методе выполняется запуск воспроизведения:

mp.start();
    

Существует еще метод prepare(), он также выполняет подготовку плеера, но в синхронном режиме. Для прослушивания файлов из интернета, необходимо использовать асинхронный режим, что мы и сделали.

Последние две строки метода onClickStart():

mediaPlayer.setLooping(chbLoop.isChecked());
mediaPlayer.setOnCompletionListener(this);
    

В первой из них определяется возможность циклического воспроизведения в зависимости от значения чек-бокса.

Во второй - задается слушатель для получения сообщения о достижении конца воспроизводимого контента. В нашем случае этим слушателем будет сам класс активности для этого он объявлен, как класс реализующий интерфейс OnCompletionListener. Полную версию метода onClickStart() можно найти в листинге 12.2.

Метод onClick() вызывается при нажатии на любую кнопку: Pause, Resume, Stop. В этом методе выполняется проверка какая кнопка была нажата и после этого выполняются соответствующие действия.

Если нажата кнопка Pause, выполняется следующая конструкция:

if (mediaPlayer.isPlaying())   mediaPlayer.pause();
    

Если нажата кнопка Release, выполняется следующая конструкция:

if (!mediaPlayer.isPlaying())  mediaPlayer.start();
    

Если нажата кнопка Stop, выполняется следующая конструкция:

mediaPlayer.stop();
    

Имеет смысл обратить внимание на метод активности:

protected void onDestroy() {
  super.onDestroy();
  releaseMP();
}
    

В этом методе обязательно необходимо освободить ресурсы, что и выполняется вызовом метода releaseMP().

Полный код класса MediaActivity представлен в листинге 12.2.

Марат Нуриджанян
Марат Нуриджанян

Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html).

Там скачать можно только Android Studio

Владимир Каункин
Владимир Каункин

В самостоятельной работе 2 в примере решения задания некорректно загадывается число (в двух местах), выбирая случайное целое число из диапазона [0, 99] вместо [1, 100], как того требует условие. Кроме того, загадывание числа всё таки лучше вынести в отдельный метод, как мне кажется.