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

Использование возможностей смартфона в приложениях

9.4 Работа с мультимедиа

Мультимедиа библиотека Android включает поддержку воспроизведения множества наиболее распространенных форматов, что позволяет легко использовать в приложениях аудио, видео и изображения. Можно проигрывать аудио или видео из медиа файлов сохраненных как ресурсы приложения (raw ресурсы), из файлов, расположенных в файловой системе или из потока данных, получаемого через сетевое соединение, для всего этого используется MediaPlayer API.

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

Актуальная информация о поддерживаемых форматах аудио и видео приводится по ссылке: http://developer.android.com/guide/appendix/media-formats.html.

Для воспроизведения аудио и видео Android предоставляет класс MediaPlayer. Причем при работе с аудиоконтентом этот класс позволяет воспроизводить необработанные данные, т. е. возможно проигрывание динамически генерируемого аудио.

Диаграмма жизненного цикла экземпляра класса MediaPlayer представлена на рис. 9.1. Овалы представляют состояния объекта MediaPlayer, дуги показывают вызовы каких методов необходимо выполнить, чтобы сменить состояние объекта MediaPlayer. Дуги с одной стрелкой представляют вызовы синхронных методов, с двумя стрелками - вызовы асинхронных методов.

В ходе жизненного цикла объект MediaPlayer проходит через несколько состояний:

  • бездействие (Idle) - создан экземпляр класса MediaPlayer для создания может использоваться оператор new или вызов метода reset() (см. рис. 9.1);
    Жизненный цикл экземпляра класса MediaPlayer

    увеличить изображение
    Рис. 9.1. Жизненный цикл экземпляра класса MediaPlayer

    (http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram)

  • инициализирован (Initialized) - задан источник медиа-информации, для задания источника используется метод setDataSource();

  • ошибка (Error) - появилась какая-то ошибка, например, не поддерживаемый аудио/видео формат, слишком высокое разрешение, чтобы вывести объект из этого состояния, необходимо вызвать метод reset();

  • подготовка (Preparing) - MediaPlayer занимается подготовкой медиаисточника к воспроизведению, подготовка инициируется методом prepareAsync();

  • готов (Prepared) - состояние готовности к воспроизведению, может быть достигнуто двумя способами:
    • синхронный способ: вызов метода prepare(), который переводит объект в готовое состояние;
    • асинхронный способ: срабатывание метода onPrepared() интерефейса OnPreparedListener() в состоянии подготовки, как реакция на событие готовности;

  • запущен (Started) - выполняется воспроизведение медиа-контента, в это состояние объект переходит после вызова метода start();

  • приостановлен (Paused) - воспроизведение приостановлено, MediaPlayer переходит в это состояние после вызова метода pause();

  • остановлен (Stopped) - воспроизведение остановлено, MediaPlayer переходит в это состояние после вызова метода stop();

  • воспроизведение завершено (Playback Completed) - достигнут конец воспроизводимого содержания, в это состояние объект переходит после срабатывания метода onCompleted() интерфейса-слушателя OnCompletionListener, как реакции на конец воспроизводимого материала;

    Замечание: из состояний Paused, Playback Completed можно вернуться к воспроизведению вызовом метода start(). Из состояния Stopped прежде, чем вернуться в состояние воспроизведения, необходимо пройти через подготовку медиа-содержимого.

    Вызов метода seekTo() позволяет поменять место воспроизведения.

  • конец (End) - конец жизненного цикла MediaPlayer объекта, в это состояние объект переходит после вызова метода release().

Для получения более детальной информации см. ссылки: http://developer.android.com/guide/topics/media/mediaplayer.html; http://developer.android.com/reference/android/media/MediaPlayer.html.

Для записи аудио и видео Android предоставляет класс MediaRecorder. Диаграмма жизненного цикла экземпляра класса MediaRecorder представлена на рис. 9.2. Овалы представляют состояния объекта MediaPlayer, дуги показывают вызовы каких методов необходимо выполнить, чтобы сменить состояние объекта MediaPlayer. Дуги с одной стрелкой представляют вызовы синхронных методов, с двумя стрелками - вызовы асинхронных методов.

Жизненный цикл экземпляра класса MediaRecorder

увеличить изображение
Рис. 9.2. Жизненный цикл экземпляра класса MediaRecorder

(http://developer.android.com/reference/android/media/MediaRecorder.html)

В ходе жизненного цикла объект MediaRecorder проходит через несколько состояний:

начальное (Initial) - создан объект класса MediaRecover, для создания может использоваться оператор new или вызов метода reset() (см. рис. 9.2);
инициализирован (Initialized) - объект MediaRecover готов к использованию, в данное состояние объект переходит после вызова одного из методов setAudioSource() или setVideoSource(), которые задают источники аудио или видео для записи;
сконфигурирован приемник данных для записи (Data Source Configured) - задаются основные свойства приемника данных, состояние инициируется методом setOutputFormat(), для настройки свойств должны быть выполнены некоторые методы из списка: setAudioEncoder(), setVideoEncoder(), setOutputFile(), setVideoSize(), setVideoFrameRate(), setPreviewDisplay();
готов (Prepared) - состояние готовности к записи, инициируется методом prepare();
записывает (Recording) - идет запись, инициируется вызовом метода start();
освобожден (Released) - запись завершена, все ресурсы освобождены.

Для получения более детальной информации см. ссылки: http://developer.android.com/reference/android/media/MediaRecorder.html; http://developer.android.com/guide/topics/media/audio-capture.html.

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

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

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

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

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